Я хочу выполнить HTTP POST, который выглядит как форма HMTL, отправленная из браузера. В частности, разместите несколько текстовых полей и файловое поле.
Публикация текстовых полей проста, есть пример прямо в net / http rdocs, но я не могу понять, как опубликовать файл вместе с ним.
Net :: HTTP - не лучшая идея. бордюр выглядит хорошо.
gem install rest-client
иrequire 'rest_client'
частей. Эта информация отсутствует в слишком большом количестве примеров рубинов.Я не могу сказать достаточно хороших слов о многопользовательской библиотеке Ника Зигера.
Он добавляет поддержку многокомпонентной публикации непосредственно в Net :: HTTP, избавляя вас от необходимости вручную беспокоиться о границах или больших библиотеках, цели которых могут отличаться от ваших собственных.
Вот небольшой пример того, как его использовать из README :
Вы можете ознакомиться с библиотекой здесь: http://github.com/nicksieger/multipart-post
или установите его с помощью:
Если вы подключаетесь через SSL, вам нужно запустить соединение следующим образом:
источник
curb
выглядит отличным решением, но если оно вам не подходит, вы можете это сделать с помощьюNet::HTTP
. Сообщение, состоящее из нескольких частей, - это просто тщательно отформатированная строка с некоторыми дополнительными заголовками. Кажется, что каждый Ruby-программист, которому нужно делать многостраничные сообщения, в конечном итоге пишет для него свою небольшую библиотеку, что заставляет меня задаться вопросом, почему эта функция не встроена. Может быть ... В любом случае, для вашего удовольствия от чтения, я предложу здесь свое решение. Этот код основан на примерах, которые я нашел в нескольких блогах, но я сожалею, что больше не могу найти ссылки. Так что, думаю, мне просто нужно отдать должное самому себе ...Модуль, который я написал для этого, содержит один общедоступный класс для генерации данных формы и заголовков из хэша
String
иFile
объектов. Так, например, если вы хотите опубликовать форму со строковым параметром с именем «title» и параметром файла с именем «document», вы должны сделать следующее:Тогда вы просто сделать нормальный
POST
сNet::HTTP
:Или как еще вы хотите сделать
POST
. Дело в том, чтоMultipart
возвращает данные и заголовки, которые нужно отправить. И это все! Все просто, правда? Вот код для модуля Multipart (вам нуженmime-types
драгоценный камень):источник
FileParam
класса. Назначение вto_multipart
методе снова копирует содержимое файла, в чем нет необходимости! Вместо этого передайте только дескриптор файла иto_multipart
Еще один, использующий только стандартные библиотеки:
Пробовал много подходов, но только это сработало для меня.
источник
uri = URI('https://some.end.point/some/path')
образом вы можете позвонитьuri.port
иuri.host
без ошибок позже.File.open
неFile.read
Вот мое решение после того, как я попробовал другие, доступные в этом посте, я использую его для загрузки фотографии на TwitPic:
источник
Перенесемся в 2017,
ruby
stdlib
net/http
есть ли это встроенное, начиная с 1.9.3https://ruby-doc.org/stdlib-2.3.1/libdoc/net/http/rdoc/Net/HTTPHeader.html#method-i-set_form
Мы даже можем использовать то,
IO
что не поддерживает:size
потоковую передачу данных формы.Надеюсь, что этот ответ действительно может кому-то помочь :)
PS Я тестировал это только на Ruby 2.3.1
источник
Хорошо, вот простой пример использования бордюра.
источник
restclient не работал у меня, пока я не переопределил create_file_field в RestClient :: Payload :: Multipart.
Он создавал «Content-Disposition: multipart / form-data» в каждой части, где это должно быть «Content-Disposition: form-data» .
http://www.ietf.org/rfc/rfc2388.txt
Моя вилка здесь, если она вам нужна: git@github.com: kcrawford / rest-client.git
источник
Что ж, решение с NetHttp имеет недостаток, заключающийся в том, что при отправке больших файлов он сначала загружает весь файл в память.
Немного поиграв с ним, я пришел к следующему решению:
источник
есть также multipart-post Ника Зигера, чтобы добавить к длинному списку возможных решений.
источник
У меня была такая же проблема (нужно отправить на веб-сервер jboss). Curb отлично работает для меня, за исключением того, что он вызывал сбой ruby (ruby 1.8.7 в ubuntu 8.10), когда я использую переменные сеанса в коде.
Я копался в документации rest-client, не нашел указания на поддержку multipart. Я пробовал приведенные выше примеры rest-client, но jboss сказал, что сообщение http не является составным.
источник
Гем multipart-post очень хорошо работает с Rails 4 Net :: HTTP, ни с каким другим специальным гемом.
https://github.com/Feuda/multipart-post/tree/patch-1
источник