Chcę wykonać HTTP POST, który wygląda jak formularz HMTL wysłany z przeglądarki. W szczególności opublikuj niektóre pola tekstowe i pole pliku.
Wysyłanie pól tekstowych jest proste, przykład znajduje się w net / http rdocs, ale nie mogę dowiedzieć się, jak opublikować plik wraz z nim.
Net :: HTTP nie wygląda na najlepszy pomysł. krawężnik wygląda dobrze.
gem install rest-client
irequire 'rest_client'
. Ta informacja została pominięta w zbyt wielu przykładach ruby.Nie mogę powiedzieć wystarczająco dobrych rzeczy o wieloczęściowej bibliotece Nicka Siegera.
Dodaje obsługę wysyłania wieloczęściowego bezpośrednio do Net :: HTTP, eliminując potrzebę ręcznego martwienia się o granice lub duże biblioteki, które mogą mieć inne cele niż twoje własne.
Oto mały przykład, jak go używać z README :
Możesz sprawdzić bibliotekę tutaj: http://github.com/nicksieger/multipart-post
lub zainstaluj za pomocą:
Jeśli łączysz się przez SSL, musisz rozpocząć połączenie w następujący sposób:
źródło
curb
wygląda na świetne rozwiązanie, ale jeśli nie odpowiada Twoim potrzebom, możesz to zrobićNet::HTTP
. Post w postaci wieloczęściowej to po prostu starannie sformatowany ciąg znaków z kilkoma dodatkowymi nagłówkami. Wygląda na to, że każdy programista Ruby, który musi pisać wieloczęściowe posty, kończy pisanie własnej małej biblioteki, co sprawia, że zastanawiam się, dlaczego ta funkcja nie jest wbudowana. Może tak jest ... W każdym razie, dla przyjemności czytania, podam tutaj moje rozwiązanie. Ten kod jest oparty na przykładach, które znalazłem na kilku blogach, ale żałuję, że nie mogę już znaleźć linków. Więc wydaje mi się, że muszę przypisać sobie całą zasługę ...Moduł, który napisałem w tym celu, zawiera jedną publiczną klasę do generowania danych formularza i nagłówków z haszu obiektów
String
iFile
. Na przykład, jeśli chcesz opublikować formularz z parametrem ciągu o nazwie „tytuł” i parametrem pliku o nazwie „dokument”, wykonaj następujące czynności:Następnie po prostu robisz normalne
POST
zNet::HTTP
:Lub jakkolwiek chcesz to zrobić
POST
. Chodzi o to, żeMultipart
zwraca dane i nagłówki, które musisz wysłać. I to wszystko! Proste, prawda? Oto kod modułu Multipart (potrzebujeszmime-types
klejnotu):źródło
FileParam
klasy. Przypisanie wto_multipart
metodzie ponownie kopiuje zawartość pliku, co jest niepotrzebne! Zamiast tego przekaż tylko deskryptor pliku i przeczytaj z niegoto_multipart
Kolejny korzystający tylko ze standardowych bibliotek:
Próbowałem wielu podejść, ale tylko to działało dla mnie.
źródło
uri = URI('https://some.end.point/some/path')
W ten sposób możesz zadzwonićuri.port
iuri.host
bezbłędnie później.File.open
nieFile.read
Oto moje rozwiązanie po wypróbowaniu innych dostępnych w tym poście, używam go do przesyłania zdjęcia na TwitPic:
źródło
Przewiń do 2017 r.,
ruby
stdlib
net/http
Ma to wbudowane od 1.9.3https://ruby-doc.org/stdlib-2.3.1/libdoc/net/http/rdoc/Net/HTTPHeader.html#method-i-set_form
Możemy nawet użyć,
IO
który nie obsługuje:size
przesyłania strumieniowego danych formularza.Mam nadzieję, że ta odpowiedź naprawdę komuś pomoże :)
PS Testowałem to tylko w Rubim 2.3.1
źródło
OK, oto prosty przykład użycia krawężnika.
źródło
restclient nie działał dla mnie, dopóki nie przesłoniłem create_file_field w RestClient :: Payload :: Multipart.
Tworzyło „Dyspozycję treści: multipart / dane formularza” w każdej części, gdzie powinno być „Dyspozycja treści: dane formularza” .
http://www.ietf.org/rfc/rfc2388.txt
Mój fork jest tutaj, jeśli go potrzebujesz: [email protected]: kcrawford / rest-client.git
źródło
Cóż, rozwiązanie z NetHttp ma tę wadę, że podczas wysyłania dużych plików najpierw ładuje cały plik do pamięci.
Po odrobinie zabawy wpadłem na następujące rozwiązanie:
źródło
jest też wieloczęściowy post Nicka Siegera, który można dodać do długiej listy możliwych rozwiązań.
źródło
Miałem ten sam problem (trzeba wysłać na serwer WWW jboss). Curb działa dla mnie dobrze, z wyjątkiem tego, że spowodował awarię Rubiego (Ruby 1.8.7 na Ubuntu 8.10), gdy używam zmiennych sesji w kodzie.
Zagłębiłem się w dokumentację dotyczącą pozostałych klientów, nie mogłem znaleźć informacji o obsłudze wielu części. Wypróbowałem powyższe przykłady klientów, ale jboss powiedział, że post http nie jest wieloczęściowy.
źródło
Klejnot wieloczęściowych postów działa całkiem dobrze z Rails 4 Net :: HTTP, żaden inny specjalny klejnot
https://github.com/Feuda/multipart-post/tree/patch-1
źródło