Quiero hacer un HTTP POST que parece un formulario HMTL publicado desde un navegador. Específicamente, publique algunos campos de texto y un campo de archivo.
Publicar campos de texto es sencillo, hay un ejemplo allí mismo en net / http rdocs, pero no puedo entender cómo publicar un archivo junto con él.
Net :: HTTP no parece la mejor idea. acera se ve bien.
gem install rest-client
yrequire 'rest_client'
. Esa información se deja fuera de muchos ejemplos de ruby.No puedo decir lo suficiente sobre la biblioteca de publicaciones de varias partes de Nick Sieger.
Agrega soporte para la publicación de varias partes directamente en Net :: HTTP, eliminando la necesidad de preocuparse manualmente por los límites o las grandes bibliotecas que pueden tener objetivos diferentes a los suyos.
Aquí hay un pequeño ejemplo de cómo usarlo del README :
Puede consultar la biblioteca aquí: http://github.com/nicksieger/multipart-post
o instalarlo con:
Si se está conectando a través de SSL, debe iniciar la conexión de esta manera:
fuente
curb
parece una gran solución, pero en caso de que no satisfaga sus necesidades, puede hacerlo conNet::HTTP
. Una publicación de formulario de varias partes es solo una cadena cuidadosamente formateada con algunos encabezados adicionales. Parece que todos los programadores de Ruby que necesitan hacer publicaciones de varias partes terminan escribiendo su propia pequeña biblioteca, lo que me hace preguntarme por qué esta funcionalidad no está incorporada. Tal vez sea ... De todos modos, para su placer de lectura, seguiré adelante y daré mi solución aquí. Este código se basa en ejemplos que encontré en un par de blogs, pero lamento no poder encontrar más los enlaces. Así que supongo que debo tomarme todo el crédito por mí mismo ...El módulo que escribí para esto contiene una clase pública, para generar los datos del formulario y los encabezados a partir de un hash de
String
yFile
objetos. Entonces, por ejemplo, si quisiera publicar un formulario con un parámetro de cadena llamado "título" y un parámetro de archivo llamado "documento", haría lo siguiente:Entonces simplemente haces lo normal
POST
conNet::HTTP
:O como quieras hacer el
POST
. El punto es queMultipart
devuelve los datos y los encabezados que necesita enviar. ¡Y eso es! Simple, ¿verdad? Aquí está el código para el módulo Multipart (necesita lamime-types
gema):fuente
FileParam
clase. La asignación en elto_multipart
método copia el contenido del archivo nuevamente, ¡lo cual es innecesario! En su lugar, pase solo el descriptor de archivo yto_multipart
Otro que usa solo bibliotecas estándar:
Intenté muchos enfoques, pero solo esto funcionó para mí.
fuente
uri = URI('https://some.end.point/some/path')
esa manera puede llamaruri.port
yuri.host
sin errores más adelante.File.open
noFile.read
Aquí está mi solución después de probar otras disponibles en esta publicación, la estoy usando para cargar una foto en TwitPic:
fuente
Avance rápido hasta 2017,
ruby
stdlib
net/http
tiene esto incorporado desde 1.9.3https://ruby-doc.org/stdlib-2.3.1/libdoc/net/http/rdoc/Net/HTTPHeader.html#method-i-set_form
Incluso podemos usar lo
IO
que no es compatible.:size
para transmitir los datos del formulario.Esperando que esta respuesta realmente pueda ayudar a alguien :)
PD: solo probé esto en ruby 2.3.1
fuente
Ok, aquí hay un ejemplo simple usando bordillo.
fuente
restclient no funcionó para mí hasta que anulé create_file_field en RestClient :: Payload :: Multipart.
Estaba creando un 'Content-Disposition: multipart / form-data' en cada parte donde debería ser 'Content-Disposition: form-data' .
http://www.ietf.org/rfc/rfc2388.txt
Mi fork está aquí si lo necesita: [email protected]: kcrawford / rest-client.git
fuente
Bueno, la solución con NetHttp tiene un inconveniente: cuando se publican archivos grandes, primero se carga todo el archivo en la memoria.
Después de jugar un poco con él, se me ocurrió la siguiente solución:
fuente
También está la publicación multiparte de nick sieger para agregar a la larga lista de posibles soluciones.
fuente
Tuve el mismo problema (necesito publicar en el servidor web jboss). Curb funciona bien para mí, excepto que hizo que ruby se bloqueara (ruby 1.8.7 en ubuntu 8.10) cuando utilizo variables de sesión en el código.
Busqué en los documentos del resto del cliente, no pude encontrar ninguna indicación de soporte multiparte. Probé los ejemplos de rest-client anteriores, pero jboss dijo que la publicación http no es multiparte.
fuente
La gema de publicación múltiple funciona bastante bien con Rails 4 Net :: HTTP, ninguna otra gema especial
https://github.com/Feuda/multipart-post/tree/patch-1
fuente