Faraday: Benötigen Sie Hilfe beim Hochladen von JSON und Datei als Multipart/Form-Daten

Erstellt am 5. Jan. 2020  ·  3Kommentare  ·  Quelle: lostisland/faraday

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..

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 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!

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:

# 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—

Alle 3 Kommentare

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!

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:

# 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 👏!

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

mokolabs picture mokolabs  ·  3Kommentare

ioquatix picture ioquatix  ·  4Kommentare

Lewiscowles1986 picture Lewiscowles1986  ·  4Kommentare

QuinnWilton picture QuinnWilton  ·  4Kommentare

yusefu picture yusefu  ·  3Kommentare