A continuación se muestra lo que necesito para cargar
-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
Tenga en cuenta que el tipo de contenido que recibe el servidor es multipart/form-data
mi código actual se ve a continuación:
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
Sin embargo, la respuesta que recibo del servidor es {"success"=>false, "errorCode"=>nil, "message"=>"Content type 'application/octet-stream' not supported", "data"=>nil}
Modifiqué el código poco a poco y lo intenté de nuevo, y busqué en Google durante horas pero no pude encontrar la solución.
Sería muy apreciado si alguien me puede ayudar con esto.
Gracias por adelantado
PD: este problema parece estar relacionado con https://github.com/lostisland/faraday/issues/830#issue -372589645 y https://github.com/lostisland/faraday/issues/769#issue -295426091 , pero yo No puedo encontrar la solución... Por favor ayuda...
El problema está en la forma en que se construye la carga útil. Según su fragmento curl -data-binary
, su servidor desea que el valor de formulario message
tenga el tipo de contenido application/json
. Sin embargo, la carga útil construida no especifica esto en ninguna parte.
Aquí se explica cómo solucionarlo en Faraday v1.0. Ver más sobre el Middleware multiparte ...
-payload = {message: JSON.dump(message)}
+payload = { message: Faraday::ParamPart.new(JSON.dump(message), ‘application/json’) }
En Faraday v0.1x (confirmado en 0.17.3). Tenga en cuenta que esto todavía envía un "archivo" que solo está leyendo desde un objeto IO en memoria. Con suerte, al servidor no le importan los valores de encabezado multiparte adicionales. Puede ver los detalles en la tercera solicitud al final de este mensaje.
-payload = {message: JSON.dump(message)}
+{ message: Faraday::UploadIO.new(StringIO.new(JSON.dump(message)), 'application/json') }
Sin embargo, no sé qué hacer con el mensaje de error con el que respondió su servidor.
El tipo de contenido 'aplicación/flujo de octetos' no es compatible
Espero que solucionar el problema del tipo de contenido multiparte lo resuelva, ya que no veo de dónde provienen application/octet-stream
.
¡Déjame saber si tienes más preguntas!
Puede ver los fragmentos de código de trabajo en multipart.rb · GitHub . Dado que el RequestBin al que hace referencia el código solo contiene la información de la solicitud temporalmente, estoy registrando los detalles a continuación:
Solicitud sin tipo de contenido en la carga útil:
# 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——————
Solicitud CON tipo de contenido (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——————
Solicitud CON tipo de contenido (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—
¡Muchas gracias por tu ayuda, @technoweenie ! ¡¡Eres increíble!!
La solicitud ahora funciona bien con la carga útil recién construida y ya no se queja del application/octet-stream
.
Espero que tengas un gran día :D
¡Me alegra saber que funciona como se esperaba ahora!
Bien hecho @technoweenie , ¡gracias por abordar este problema tan difícil 👏!
Comentario más útil
El problema está en la forma en que se construye la carga útil. Según su fragmento
curl -data-binary
, su servidor desea que el valor de formulariomessage
tenga el tipo de contenidoapplication/json
. Sin embargo, la carga útil construida no especifica esto en ninguna parte.Aquí se explica cómo solucionarlo en Faraday v1.0. Ver más sobre el Middleware multiparte ...
En Faraday v0.1x (confirmado en 0.17.3). Tenga en cuenta que esto todavía envía un "archivo" que solo está leyendo desde un objeto IO en memoria. Con suerte, al servidor no le importan los valores de encabezado multiparte adicionales. Puede ver los detalles en la tercera solicitud al final de este mensaje.
Sin embargo, no sé qué hacer con el mensaje de error con el que respondió su servidor.
Espero que solucionar el problema del tipo de contenido multiparte lo resuelva, ya que no veo de dónde provienen
application/octet-stream
.¡Déjame saber si tienes más preguntas!
mostrando mi trabajo
Puede ver los fragmentos de código de trabajo en multipart.rb · GitHub . Dado que el RequestBin al que hace referencia el código solo contiene la información de la solicitud temporalmente, estoy registrando los detalles a continuación:
Solicitud sin tipo de contenido en la carga útil:
Solicitud CON tipo de contenido (Faraday 1.0)
Solicitud CON tipo de contenido (Faraday v0.17.3)