Je veux faire un HTTP POST qui ressemble à un formulaire HMTL publié à partir d'un navigateur. Plus précisément, publiez des champs de texte et un champ de fichier.
Publier des champs de texte est simple, il y a un exemple juste là dans le net / http rdocs, mais je ne peux pas comprendre comment publier un fichier avec lui.
Net :: HTTP ne semble pas être la meilleure idée. le trottoir a l' air bien.
gem install rest-client
etrequire 'rest_client'
. Cette information est omise d'un trop grand nombre d'exemples de rubis.Je ne peux pas dire assez de bonnes choses à propos de la bibliothèque en plusieurs parties de Nick Sieger.
Il ajoute la prise en charge de la publication en plusieurs parties directement sur Net :: HTTP, vous évitant ainsi de vous soucier manuellement des limites ou des grandes bibliothèques qui peuvent avoir des objectifs différents des vôtres.
Voici un petit exemple sur la façon de l'utiliser à partir du README :
Vous pouvez consulter la bibliothèque ici: http://github.com/nicksieger/multipart-post
ou installez-le avec:
Si vous vous connectez via SSL, vous devez démarrer la connexion comme ceci:
la source
curb
semble être une excellente solution, mais au cas où elle ne répondrait pas à vos besoins, vous pouvez le faire avecNet::HTTP
. Une publication de formulaire en plusieurs parties est juste une chaîne soigneusement formatée avec quelques en-têtes supplémentaires. Il semble que chaque programmeur Ruby qui a besoin de publier des articles en plusieurs parties finisse par écrire sa propre petite bibliothèque, ce qui me fait me demander pourquoi cette fonctionnalité n'est pas intégrée. Peut-être que c'est ... Quoi qu'il en soit, pour votre plaisir de lecture, je vais vous donner ma solution ici. Ce code est basé sur des exemples que j'ai trouvés sur quelques blogs, mais je regrette de ne plus pouvoir trouver les liens. Alors je suppose que je dois juste prendre tout le mérite pour moi-même ...Le module que j'ai écrit pour cela contient une classe publique, pour générer les données de formulaire et les en-têtes à partir d'un hachage d' objets
String
etFile
. Ainsi, par exemple, si vous souhaitez publier un formulaire avec un paramètre de chaîne nommé "titre" et un paramètre de fichier nommé "document", procédez comme suit:Ensuite, vous faites juste une normale
POST
avecNet::HTTP
:Ou quelle que soit la manière dont vous souhaitez effectuer le
POST
. Le fait est queMultipart
renvoie les données et les en-têtes que vous devez envoyer. Et c'est tout! Simple, non? Voici le code du module Multipart (vous avez besoin dumime-types
gem):la source
FileParam
classe. L'affectation dans lato_multipart
méthode copie à nouveau le contenu du fichier, ce qui n'est pas nécessaire! Au lieu de cela, passez uniquement le descripteur de fichier et lisez-le dansto_multipart
Un autre utilisant uniquement des bibliothèques standard:
J'ai essayé beaucoup d'approches mais cela a fonctionné pour moi.
la source
uri = URI('https://some.end.point/some/path')
cette façon, vous pouvez appeleruri.port
eturi.host
sans erreur plus tard.File.open
pas l' utiliserFile.read
Voici ma solution après avoir essayé d'autres disponibles sur cet article, je l'utilise pour télécharger une photo sur TwitPic:
la source
Avance rapide jusqu'en 2017,
ruby
stdlib
net/http
cette fonction est intégrée depuis la version 1.9.3https://ruby-doc.org/stdlib-2.3.1/libdoc/net/http/rdoc/Net/HTTPHeader.html#method-i-set_form
Nous pouvons même utiliser
IO
ce qui ne prend pas en charge:size
pour diffuser les données du formulaire.En espérant que cette réponse puisse vraiment aider quelqu'un :)
PS je n'ai testé cela que dans ruby 2.3.1
la source
Ok, voici un exemple simple d'utilisation de trottoir.
la source
restclient n'a pas fonctionné pour moi jusqu'à ce que j'écrase create_file_field dans RestClient :: Payload :: Multipart.
Il créait un 'Content-Disposition: multipart / form-data' dans chaque partie où il devrait être 'Content-Disposition: form-data' .
http://www.ietf.org/rfc/rfc2388.txt
Ma fourchette est là si vous en avez besoin: [email protected]: kcrawford / rest-client.git
la source
Eh bien, la solution avec NetHttp a un inconvénient: lors de la publication de gros fichiers, elle charge d'abord le fichier entier en mémoire.
Après avoir joué un peu avec, j'ai trouvé la solution suivante:
la source
il y a aussi de Nick Sieger multipart post à ajouter à la longue liste de solutions possibles.
la source
J'ai eu le même problème (besoin de poster sur le serveur Web jboss). Curb fonctionne bien pour moi, sauf que cela a causé le crash de ruby (ruby 1.8.7 sur ubuntu 8.10) lorsque j'utilise des variables de session dans le code.
Je fouille dans les documents rest-client, je n'ai pas pu trouver d'indication de prise en charge en plusieurs parties. J'ai essayé les exemples rest-client ci-dessus mais jboss a dit que le message http n'est pas en plusieurs parties.
la source
La gemme multipart-post fonctionne plutôt bien avec Rails 4 Net :: HTTP, pas d'autre gemme spéciale
https://github.com/Feuda/multipart-post/tree/patch-1
la source