Di bawah ini yang perlu saya unggah
-data-binary $'
------WebKitFormBoundaryInmulX6ait6ZMLdu\r\n
Content-Disposition: form-data; name="message"; filename="blob"\r\n
Content-Type: application/json
{
"title":"title of the message to be sent",
"body":"body of the message to be sent",
"attachedFileName":null,
"attachedFileName2":null,
"attachedFileName3":null,
"recipientIdList":[186554]
}
------WebKitFormBoundaryInmulX6ait6ZMLdu--\r\n' --compressed
Harap perhatikan jenis konten yang diterima server adalah multipart/form-data
kode saya saat ini terlihat seperti di bawah ini:
client = Faraday::Connection.new(url: BASE_URL) do |builder|
builder.use :cookie_jar
builder.use :multipart
builder.use :url_encoded
builder.adapter :net_http
end
message = {title: "title", body: "body of message", recipientIdList:[186554]}
payload = {message: JSON.dump(message)}
response = @client.post(URL) do |request|
request.headers['Content-Type'] = 'multipart/form-data'
request.body = payload
end
Namun, respons yang saya dapatkan dari server adalah {"success"=>false, "errorCode"=>nil, "message"=>"Content type 'application/octet-stream' not supported", "data"=>nil}
Saya mengubah kode sedikit demi sedikit dan mencoba lagi, dan mencari di google selama berjam-jam tetapi tidak dapat menemukan solusi.
Akan sangat dihargai jika seseorang dapat membantu saya dengan ini.
Terima kasih sebelumnya
PS masalah ini tampaknya terkait dengan https://github.com/lostisland/faraday/issues/830#issue -372589645 dan https://github.com/lostisland/faraday/issues/769#issue -295426091 , tapi saya ga nemu solusinya.. mohon bantuannya..
Masalahnya adalah dengan cara payload dibangun. Menurut cuplikan curl -data-binary
Anda, server Anda menginginkan nilai formulir message
memiliki tipe konten application/json
. Namun, muatan yang dibangun tidak menentukan ini di mana pun.
Berikut cara memperbaikinya di Faraday v1.0. Lihat selengkapnya tentang Multipart Middleware …
-payload = {message: JSON.dump(message)}
+payload = { message: Faraday::ParamPart.new(JSON.dump(message), ‘application/json’) }
Di Faraday v0.1x (dikonfirmasi di 0.17.3). Perhatikan bahwa ini masih mengirimkan "file" yang baru saja membaca dari objek IO dalam memori. Semoga server tidak keberatan dengan nilai header multi-bagian tambahan. Anda dapat melihat detailnya di permintaan ke-3 di bagian bawah pesan ini.
-payload = {message: JSON.dump(message)}
+{ message: Faraday::UploadIO.new(StringIO.new(JSON.dump(message)), 'application/json') }
Saya tidak tahu harus bagaimana dengan pesan kesalahan yang dibalas oleh server Anda.
Jenis konten 'application/octet-stream' tidak didukung
Saya berharap memperbaiki masalah tipe konten multi-bagian akan menyelesaikannya, karena saya tidak melihat dari mana application/octet-stream
berasal.
Beri tahu saya jika Anda memiliki pertanyaan lagi!
Anda dapat melihat cuplikan kode yang berfungsi di multipart.rb · GitHub . Karena RequestBin yang direferensikan kode hanya menyimpan info permintaan sementara, saya merekam detailnya di bawah ini:
Permintaan tanpa tipe konten dalam payload:
# AMZ/Cloudfront headers removed
Content-Type: multipart/form-data; boundary=—————RubyMultipartPost-10fbc5eb433c89c0eca87785f09ae45d
Connection: close
Connect-Time: 1
X-Request-Id: e802a260-56a9-4d01-a4ee-77f652380185
Content-Length: 253
Host: requestbin.io
User-Agent: Faraday v1.0.0
Accept: */*
——————RubyMultipartPost-10fbc5eb433c89c0eca87785f09ae45d
Content-Disposition: form-data; name=“message”
{“title”:”title”,”body":"body of message”,”recipientIdList":[186554]}
——————RubyMultipartPost-10fbc5eb433c89c0eca87785f09ae45d——————
Permintaan DENGAN tipe konten (Faraday 1.0)
Content-Type: multipart/form-data; boundary=—————RubyMultipartPost-9d77ee5700e0658dddb09ac41fad5fa4
Connection: close
Connect-Time: 0
Content-Length: 285
User-Agent: Faraday v1.0.0
X-Request-Id: 2bbb3705-42ec-4de2-877c-2afd588ed679
Accept-Encoding: gzip;q=1.0,deflate;q=0.6,identity;q=0.3
Accept: */*
Host: requestbin.io
——————RubyMultipartPost-9d77ee5700e0658dddb09ac41fad5fa4
Content-Disposition: form-data; name=“message”
Content-Type: application/json
{“title”:”title”,”body":"body of message”,”recipientIdList”:[186554]}
——————RubyMultipartPost-9d77ee5700e0658dddb09ac41fad5fa4——————
Permintaan DENGAN tipe konten (Faraday v0.17.3)
Content-Type: multipart/form-data; boundary=—————RubyMultipartPost-697c8614200bc0d7ae2fcc0215a2a697
Connection: close
Content-Length: 363
User-Agent: Faraday v0.17.3
X-Request-Id: af65fc06-3914-4ab6-8dbf-b347a1ac498a
Accept-Encoding: gzip;q=1.0,deflate;q=0.6,identity;q=0.3
Accept: */*
Host: requestbin.io
——————RubyMultipartPost-697c8614200bc0d7ae2fcc0215a2a697
Content-Disposition: form-data; name=“message”; filename=“local.path"
Content-Length: 69
Content-Type: application/json
Content-Transfer-Encoding: binary
{“title”:”title”,”body”:”body of message”,”recipientIdList”:[186554]}
——————RubyMultipartPost-697c8614200bc0d7ae2fcc0215a2a697—
Terima kasih banyak atas bantuan Anda, @technoweenie ! Kamu luar biasa!!
Permintaan sekarang berfungsi dengan baik dengan muatan yang baru dibangun, dan tidak mengeluh tentang application/octet-stream
lagi.
Semoga harimu menyenangkan :D
Senang mendengarnya berfungsi seperti yang diharapkan sekarang!
Bagus @technoweenie , terima kasih telah menangani masalah rumit ini dengan sangat cepat !
Komentar yang paling membantu
Masalahnya adalah dengan cara payload dibangun. Menurut cuplikan
curl -data-binary
Anda, server Anda menginginkan nilai formulirmessage
memiliki tipe kontenapplication/json
. Namun, muatan yang dibangun tidak menentukan ini di mana pun.Berikut cara memperbaikinya di Faraday v1.0. Lihat selengkapnya tentang Multipart Middleware …
Di Faraday v0.1x (dikonfirmasi di 0.17.3). Perhatikan bahwa ini masih mengirimkan "file" yang baru saja membaca dari objek IO dalam memori. Semoga server tidak keberatan dengan nilai header multi-bagian tambahan. Anda dapat melihat detailnya di permintaan ke-3 di bagian bawah pesan ini.
Saya tidak tahu harus bagaimana dengan pesan kesalahan yang dibalas oleh server Anda.
Saya berharap memperbaiki masalah tipe konten multi-bagian akan menyelesaikannya, karena saya tidak melihat dari mana
application/octet-stream
berasal.Beri tahu saya jika Anda memiliki pertanyaan lagi!
Menampilkan karya saya
Anda dapat melihat cuplikan kode yang berfungsi di multipart.rb · GitHub . Karena RequestBin yang direferensikan kode hanya menyimpan info permintaan sementara, saya merekam detailnya di bawah ini:
Permintaan tanpa tipe konten dalam payload:
Permintaan DENGAN tipe konten (Faraday 1.0)
Permintaan DENGAN tipe konten (Faraday v0.17.3)