Ich möchte einen HTTP-POST durchführen, der aussieht wie ein HMTL-Formular, das von einem Browser gesendet wird. Veröffentlichen Sie insbesondere einige Textfelder und ein Dateifeld.
Das Posten von Textfeldern ist unkompliziert. Es gibt ein Beispiel genau dort im Netz / http rdocs, aber ich kann nicht herausfinden, wie eine Datei zusammen mit diesen Feldern gepostet werden soll.
Net :: HTTP scheint nicht die beste Idee zu sein. Bordstein sieht gut aus.
gem install rest-client
undrequire 'rest_client'
Teile. Diese Information wird von zu vielen Rubinbeispielen weggelassen.Ich kann nicht genug gute Dinge über die mehrteilige Post-Bibliothek von Nick Sieger sagen.
Es bietet Unterstützung für mehrteiliges Posten direkt in Net :: HTTP, sodass Sie sich nicht mehr manuell um Grenzen oder große Bibliotheken kümmern müssen, die möglicherweise andere Ziele als Ihre eigenen haben.
Hier ist ein kleines Beispiel zur Verwendung in der README-Datei :
Sie können die Bibliothek hier überprüfen: http://github.com/nicksieger/multipart-post
oder installieren Sie es mit:
Wenn Sie eine Verbindung über SSL herstellen, müssen Sie die Verbindung wie folgt starten:
quelle
curb
sieht nach einer großartigen Lösung aus, aber falls sie nicht Ihren Anforderungen entspricht, können Sie dies tunNet::HTTP
. Ein mehrteiliger Formularbeitrag ist nur eine sorgfältig formatierte Zeichenfolge mit einigen zusätzlichen Überschriften. Es scheint, als würde jeder Ruby-Programmierer, der mehrteilige Posts erstellen muss, seine eigene kleine Bibliothek dafür schreiben, weshalb ich mich frage, warum diese Funktionalität nicht integriert ist. Vielleicht ist es ... Wie auch immer, für Ihr Lesevergnügen werde ich hier meine Lösung geben. Dieser Code basiert auf Beispielen, die ich in einigen Blogs gefunden habe, aber ich bedauere, dass ich die Links nicht mehr finden kann. Also muss ich wohl alle Ehre für mich selbst aufbringen ...Das Modul, das ich dafür geschrieben habe, enthält eine öffentliche Klasse zum Generieren der Formulardaten und Header aus einem Hash von
String
undFile
Objekten. Wenn Sie beispielsweise ein Formular mit einem Zeichenfolgenparameter namens "title" und einem Dateiparameter mit dem Namen "document" veröffentlichen möchten, gehen Sie wie folgt vor:Dann machst du einfach ein normales
POST
mitNet::HTTP
:Oder wie auch immer Sie das tun möchten
POST
. Der Punkt ist, dassMultipart
die Daten und Header zurückgegeben werden, die Sie senden müssen. Und das ist es! Einfach, richtig? Hier ist der Code für das Multipart-Modul (Sie benötigen dasmime-types
Juwel):quelle
FileParam
Klasse übergeben. Die Zuweisung in derto_multipart
Methode kopiert den Dateiinhalt erneut, was nicht erforderlich ist! Statt nur den Dateideskriptor geben und von ihm eingelesento_multipart
Eine andere, die nur Standardbibliotheken verwendet:
Versuchte viele Ansätze, aber nur das wurde für mich gearbeitet.
quelle
uri = URI('https://some.end.point/some/path')
So können Sie anrufenuri.port
unduri.host
ohne Fehler später.File.open
nicht verwendenFile.read
Hier ist meine Lösung, nachdem ich andere in diesem Beitrag verfügbare ausprobiert habe. Ich verwende sie, um ein Foto auf TwitPic hochzuladen:
quelle
Schneller Vorlauf bis 2017,
ruby
stdlib
net/http
hat diesen seit 1.9.3 eingebauthttps://ruby-doc.org/stdlib-2.3.1/libdoc/net/http/rdoc/Net/HTTPHeader.html#method-i-set_form
Wir können sogar verwenden,
IO
was das:size
Streamen der Formulardaten nicht unterstützt .Ich hoffe, dass diese Antwort wirklich jemandem helfen kann :)
PS Ich habe dies nur in Ruby 2.3.1 getestet
quelle
Ok, hier ist ein einfaches Beispiel mit Bordstein.
quelle
restclient hat bei mir nicht funktioniert, bis ich create_file_field in RestClient :: Payload :: Multipart überschrieben habe.
Es wurde eine "Inhaltsdisposition: mehrteilige / Formulardaten" in jedem Teil erstellt, in dem es sich um "Inhaltsdisposition: Formulardaten" handeln sollte .
http://www.ietf.org/rfc/rfc2388.txt
Meine Gabel ist hier, wenn Sie sie brauchen: [email protected]: kcrawford / rest-client.git
quelle
Nun, die Lösung mit NetHttp hat den Nachteil, dass beim Posten großer Dateien zuerst die gesamte Datei in den Speicher geladen wird.
Nachdem ich ein bisschen damit gespielt hatte, kam ich auf die folgende Lösung:
quelle
Es gibt auch den mehrteiligen Beitrag von Nick Sieger, der der langen Liste möglicher Lösungen hinzugefügt werden kann.
quelle
Ich hatte das gleiche Problem (muss auf dem jboss-Webserver posten). Curb funktioniert gut für mich, außer dass es Ruby zum Absturz gebracht hat (Ruby 1.8.7 unter Ubuntu 8.10), wenn ich Sitzungsvariablen im Code verwende.
Ich stöbere in den Rest-Client-Dokumenten und konnte keinen Hinweis auf mehrteilige Unterstützung finden. Ich habe die obigen Rest-Client-Beispiele ausprobiert, aber jboss sagte, der http-Beitrag sei nicht mehrteilig.
quelle
Das Multipart-Post-Juwel funktioniert ziemlich gut mit Rails 4 Net :: HTTP, keinem anderen speziellen Juwel
https://github.com/Feuda/multipart-post/tree/patch-1
quelle