Faraday: Besoin d'aide pour télécharger json et fichier en tant que multipart/form-data

Créé le 5 janv. 2020  ·  3Commentaires  ·  Source: lostisland/faraday

Ci-dessous ce que je dois télécharger

-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

Veuillez noter que le type de contenu que le serveur reçoit est multipart/form-data

mon code actuel ressemble à ci-dessous:

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

Cependant, la réponse que j'obtiens du serveur est {"success"=>false, "errorCode"=>nil, "message"=>"Content type 'application/octet-stream' not supported", "data"=>nil}

J'ai modifié le code petit à petit et j'ai réessayé, et j'ai cherché sur Google pendant des heures mais je n'ai pas trouvé de solution.
Il serait grandement apprécié si quelqu'un peut m'aider avec cela.
Merci d'avance

PS ce problème semble être lié à https://github.com/lostisland/faraday/issues/830#issue -372589645 et https://github.com/lostisland/faraday/issues/769#issue -295426091 , mais je ne trouve pas de solution.. Aidez-moi s'il vous plaît..

Commentaire le plus utile

Le problème réside dans la manière dont la charge utile est construite. Selon votre extrait de code curl -data-binary , votre serveur souhaite que la valeur de formulaire message ait le type de contenu application/json . Cependant, la charge utile construite ne le spécifie nulle part.

Voici comment résoudre ce problème dans Faraday v1.0. En savoir plus sur le multipart middleware

-payload = {message: JSON.dump(message)}
+payload = { message: Faraday::ParamPart.new(JSON.dump(message), ‘application/json’) }

Dans Faraday v0.1x (confirmé en 0.17.3). Notez que cela envoie toujours un "fichier" qui lit simplement à partir d'un objet IO en mémoire. Espérons que le serveur ne se soucie pas des valeurs d'en-tête supplémentaires en plusieurs parties. Vous pouvez voir les détails dans la 3e demande au bas de ce message.

-payload = {message: JSON.dump(message)}
+{ message: Faraday::UploadIO.new(StringIO.new(JSON.dump(message)), 'application/json') }

Je ne sais pas quoi faire du message d'erreur avec lequel votre serveur a répondu.

Type de contenu 'application/octet-stream' non pris en charge

J'espère que la résolution du problème de type de contenu en plusieurs parties le résoudra, car je ne vois pas d'où vient application/octet-stream .

Faîtes moi savoir si vous avez d'autres questions!

Montrant mon travail

Vous pouvez voir les extraits de code de travail dans multipart.rb · GitHub . Étant donné que le RequestBin auquel le code fait référence ne contient que temporairement les informations de la demande, j'enregistre les détails ci-dessous :

Demande sans type de contenu dans la charge utile :

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

Requête AVEC type de contenu (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——————

Requête AVEC type de contenu (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—

Tous les 3 commentaires

Le problème réside dans la manière dont la charge utile est construite. Selon votre extrait de code curl -data-binary , votre serveur souhaite que la valeur de formulaire message ait le type de contenu application/json . Cependant, la charge utile construite ne le spécifie nulle part.

Voici comment résoudre ce problème dans Faraday v1.0. En savoir plus sur le multipart middleware

-payload = {message: JSON.dump(message)}
+payload = { message: Faraday::ParamPart.new(JSON.dump(message), ‘application/json’) }

Dans Faraday v0.1x (confirmé en 0.17.3). Notez que cela envoie toujours un "fichier" qui lit simplement à partir d'un objet IO en mémoire. Espérons que le serveur ne se soucie pas des valeurs d'en-tête supplémentaires en plusieurs parties. Vous pouvez voir les détails dans la 3e demande au bas de ce message.

-payload = {message: JSON.dump(message)}
+{ message: Faraday::UploadIO.new(StringIO.new(JSON.dump(message)), 'application/json') }

Je ne sais pas quoi faire du message d'erreur avec lequel votre serveur a répondu.

Type de contenu 'application/octet-stream' non pris en charge

J'espère que la résolution du problème de type de contenu en plusieurs parties le résoudra, car je ne vois pas d'où vient application/octet-stream .

Faîtes moi savoir si vous avez d'autres questions!

Montrant mon travail

Vous pouvez voir les extraits de code de travail dans multipart.rb · GitHub . Étant donné que le RequestBin auquel le code fait référence ne contient que temporairement les informations de la demande, j'enregistre les détails ci-dessous :

Demande sans type de contenu dans la charge utile :

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

Requête AVEC type de contenu (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——————

Requête AVEC type de contenu (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—

Merci beaucoup pour votre aide, @technoweenie ! Vous êtes génial!!
La requête fonctionne maintenant très bien avec la charge utile nouvellement construite, et elle ne se plaint plus du application/octet-stream .
J'espère que vous passez une bonne journée :D

Heureux d'entendre que cela fonctionne comme prévu maintenant !
Bravo @technoweenie , merci d'avoir résolu ce problème délicat si rapidement 👏 !

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

mvastola picture mvastola  ·  4Commentaires

mattmill30 picture mattmill30  ·  4Commentaires

JasonBarnabe picture JasonBarnabe  ·  4Commentaires

QuinnWilton picture QuinnWilton  ·  4Commentaires

Lewiscowles1986 picture Lewiscowles1986  ·  4Commentaires