Saya ingin melakukan HTTP POST yang terlihat seperti formulir HMTL yang diposting dari browser. Secara khusus, posting beberapa bidang teks dan bidang file.
Posting text field sangat mudah, ada contohnya di net / http rdocs, tapi saya tidak tahu bagaimana cara memposting file bersamanya.
Net :: HTTP sepertinya bukan ide terbaik. trotoar terlihat bagus.
gem install rest-client
danrequire 'rest_client'
bagian. Info itu ditinggalkan dari terlalu banyak contoh ruby.Saya tidak bisa mengatakan cukup banyak hal baik tentang perpustakaan multi bagian Nick Sieger.
Ini menambahkan dukungan untuk posting multi bagian langsung ke Net :: HTTP, menghilangkan kebutuhan Anda untuk secara manual khawatir tentang batasan atau pustaka besar yang mungkin memiliki tujuan berbeda dari Anda sendiri.
Berikut ini sedikit contoh tentang cara menggunakannya dari README :
Anda dapat melihat perpustakaan di sini: http://github.com/nicksieger/multipart-post
atau instal dengan:
Jika Anda terhubung melalui SSL, Anda perlu memulai koneksi seperti ini:
sumber
curb
Sepertinya solusi yang bagus, tetapi jika tidak sesuai dengan kebutuhan Anda, Anda dapat melakukannya denganNet::HTTP
. Postingan formulir multi bagian hanyalah string yang diformat dengan cermat dengan beberapa header tambahan. Sepertinya setiap programmer Ruby yang perlu melakukan posting multi bagian akhirnya menulis perpustakaan kecil mereka sendiri untuk itu, yang membuat saya bertanya-tanya mengapa fungsi ini tidak ada di dalamnya. Mungkin itu ... Pokoknya, untuk kesenangan membaca Anda, saya akan teruskan dan memberikan solusi saya di sini. Kode ini didasarkan pada contoh yang saya temukan di beberapa blog, tetapi saya menyesal tidak dapat menemukan tautannya lagi. Jadi saya rasa saya harus mengambil semua pujian untuk diri saya sendiri ...Modul yang saya tulis untuk ini berisi satu kelas publik, untuk menghasilkan data formulir dan header dari hash
String
danFile
objek. Jadi misalnya, jika Anda ingin memposting formulir dengan parameter string bernama "title" dan parameter file bernama "document", Anda akan melakukan hal berikut:Kemudian Anda hanya melakukan yang normal
POST
denganNet::HTTP
:Atau bagaimanapun Anda ingin melakukan
POST
. Intinya adalahMultipart
mengembalikan data dan header yang perlu Anda kirim. Dan itu dia! Sederhana bukan? Berikut kode untuk modul Multipart (Anda membutuhkanmime-types
permata):sumber
FileParam
kelas. Penetapan dalamto_multipart
metode menyalin konten file lagi, yang tidak diperlukan! Alih-alih hanya meneruskan deskriptor file dan membacanya dito_multipart
Yang lain hanya menggunakan pustaka standar:
Mencoba banyak pendekatan tetapi hanya ini yang berhasil untuk saya.
sumber
uri = URI('https://some.end.point/some/path')
Dengan cara itu Anda dapat meneleponuri.port
danuri.host
tanpa kesalahan di kemudian hari.File.open
tidakFile.read
Inilah solusi saya setelah mencoba yang lain yang tersedia di posting ini, saya menggunakannya untuk mengunggah foto di TwitPic:
sumber
Maju cepat ke 2017,
ruby
stdlib
net/http
memiliki ini bawaan sejak 1.9.3https://ruby-doc.org/stdlib-2.3.1/libdoc/net/http/rdoc/Net/HTTPHeader.html#method-i-set_form
Kami bahkan dapat menggunakan
IO
yang tidak mendukung:size
untuk mengalirkan data formulir.Berharap jawaban ini benar-benar dapat membantu seseorang :)
PS Saya hanya menguji ini di ruby 2.3.1
sumber
Oke, berikut contoh sederhana menggunakan curb.
sumber
restclient tidak bekerja untuk saya sampai saya mengganti create_file_field di RestClient :: Payload :: Multipart.
Itu menciptakan 'Content-Disposition: multipart / form-data' di setiap bagian yang seharusnya menjadi 'Content-Disposition: form-data' .
http://www.ietf.org/rfc/rfc2388.txt
Garpu saya ada di sini jika Anda membutuhkannya: [email protected]: kcrawford / rest-client.git
sumber
Solusi dengan NetHttp memiliki kelemahan yaitu ketika memposting file besar, ia memuat seluruh file ke dalam memori terlebih dahulu.
Setelah bermain sedikit dengannya, saya menemukan solusi berikut:
sumber
ada juga multipart-post nick sieger untuk ditambahkan ke daftar panjang solusi yang mungkin.
sumber
Saya memiliki masalah yang sama (perlu memposting ke server web jboss). Curb berfungsi dengan baik untuk saya, kecuali itu menyebabkan ruby crash (ruby 1.8.7 di ubuntu 8.10) ketika saya menggunakan variabel sesi dalam kode.
Saya menggali ke dalam dokumen klien lainnya, tidak dapat menemukan indikasi dukungan multi bagian. Saya mencoba contoh klien lainnya di atas tetapi jboss mengatakan pos http bukan multipart.
sumber
Permata multi-bagian bekerja cukup baik dengan Rails 4 Net :: HTTP, tidak ada permata khusus lainnya
https://github.com/Feuda/multipart-post/tree/patch-1
sumber