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..
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!
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 👏 !
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 formulairemessage
ait le type de contenuapplication/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 …
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.
Je ne sais pas quoi faire du message d'erreur avec lequel votre serveur a répondu.
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 :
Requête AVEC type de contenu (Faraday 1.0)
Requête AVEC type de contenu (Faraday v0.17.3)