Unten ist, was ich hochladen muss
-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
Bitte beachten Sie, dass der Inhaltstyp, den der Server empfängt, multipart/form-data
ist
mein aktueller Code sieht wie folgt aus:
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
Die Antwort, die ich vom Server bekomme, lautet jedoch {"success"=>false, "errorCode"=>nil, "message"=>"Content type 'application/octet-stream' not supported", "data"=>nil}
Ich habe den Code nach und nach optimiert und es erneut versucht und stundenlang bei Google gesucht, konnte aber keine Lösung finden.
Es wäre sehr dankbar, wenn mir jemand dabei helfen könnte.
Danke im Voraus
PS: Dieses Problem scheint mit https://github.com/lostisland/faraday/issues/830#issue -372589645 und https://github.com/lostisland/faraday/issues/769#issue -295426091 zusammenzuhängen, aber ich Kann keine Lösung finden.. Bitte helfen Sie..
Das Problem liegt in der Art und Weise, wie die Nutzlast konstruiert ist. Gemäß Ihrem curl -data-binary
-Snippet möchte Ihr Server, dass der Formularwert message
#$1$#$ den Inhaltstyp application/json
hat. Die konstruierte Nutzlast gibt dies jedoch nirgendwo an.
So beheben Sie das Problem in Faraday v1.0. Erfahren Sie mehr über die Multipart-Middleware …
-payload = {message: JSON.dump(message)}
+payload = { message: Faraday::ParamPart.new(JSON.dump(message), ‘application/json’) }
In Faraday v0.1x (bestätigt in 0.17.3). Beachten Sie, dass dies immer noch eine „Datei“ sendet, die nur von einem In-Memory-IO-Objekt liest. Hoffentlich stört der Server die zusätzlichen Multipart-Header-Werte nicht. Sie können die Details in der 3. Anfrage am Ende dieser Nachricht sehen.
-payload = {message: JSON.dump(message)}
+{ message: Faraday::UploadIO.new(StringIO.new(JSON.dump(message)), 'application/json') }
Ich weiß jedoch nicht, was ich von der Fehlermeldung halten soll, mit der Ihr Server geantwortet hat.
Der Inhaltstyp „application/octet-stream“ wird nicht unterstützt
Ich hoffe, dass das Problem mit dem mehrteiligen Inhaltstyp behoben wird, da ich nicht sehe, woher application/octet-stream
kommt.
Lassen Sie mich wissen, wenn Sie weitere Fragen haben!
Sie können die funktionierenden Codeschnipsel in multipart.rb · GitHub sehen. Da der RequestBin , auf den der Code verweist, die Anfrageinformationen nur vorübergehend enthält, zeichne ich die folgenden Details auf:
Anfrage ohne Inhaltstyp in der Nutzlast:
# 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——————
Anforderung MIT Inhaltstyp (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——————
Anforderung MIT Inhaltstyp (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—
Vielen Dank für deine Hilfe, @technoweenie ! Du bist unglaublich!!
Die Anfrage funktioniert jetzt gut mit der neu konstruierten Nutzlast und beschwert sich nicht mehr über das application/octet-stream
.
Ich wünsche dir einen schönen Tag :D
Freut mich zu hören, dass es jetzt wie erwartet funktioniert!
Gut gemacht @technoweenie , danke, dass du dieses knifflige Problem so schnell angegangen bist 👏!
Hilfreichster Kommentar
Das Problem liegt in der Art und Weise, wie die Nutzlast konstruiert ist. Gemäß Ihrem
curl -data-binary
-Snippet möchte Ihr Server, dass der Formularwertmessage
#$1$#$ den Inhaltstypapplication/json
hat. Die konstruierte Nutzlast gibt dies jedoch nirgendwo an.So beheben Sie das Problem in Faraday v1.0. Erfahren Sie mehr über die Multipart-Middleware …
In Faraday v0.1x (bestätigt in 0.17.3). Beachten Sie, dass dies immer noch eine „Datei“ sendet, die nur von einem In-Memory-IO-Objekt liest. Hoffentlich stört der Server die zusätzlichen Multipart-Header-Werte nicht. Sie können die Details in der 3. Anfrage am Ende dieser Nachricht sehen.
Ich weiß jedoch nicht, was ich von der Fehlermeldung halten soll, mit der Ihr Server geantwortet hat.
Ich hoffe, dass das Problem mit dem mehrteiligen Inhaltstyp behoben wird, da ich nicht sehe, woher
application/octet-stream
kommt.Lassen Sie mich wissen, wenn Sie weitere Fragen haben!
Meine Arbeit zeigen
Sie können die funktionierenden Codeschnipsel in multipart.rb · GitHub sehen. Da der RequestBin , auf den der Code verweist, die Anfrageinformationen nur vorübergehend enthält, zeichne ich die folgenden Details auf:
Anfrage ohne Inhaltstyp in der Nutzlast:
Anforderung MIT Inhaltstyp (Faraday 1.0)
Anforderung MIT Inhaltstyp (Faraday v0.17.3)