Faraday: Necesita ayuda para cargar json y archivo como multipart/form-data

Creado en 5 ene. 2020  ·  3Comentarios  ·  Fuente: lostisland/faraday

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

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

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:

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

Todos 3 comentarios

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!

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:

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

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

Lewiscowles1986 picture Lewiscowles1986  ·  4Comentarios

t3hk0d3 picture t3hk0d3  ·  3Comentarios

ioquatix picture ioquatix  ·  4Comentarios

iMacTia picture iMacTia  ·  3Comentarios

amrrbakry picture amrrbakry  ·  4Comentarios