Quero fazer um HTTP POST que se pareça com um formulário HMTL postado de um navegador. Especificamente, poste alguns campos de texto e um campo de arquivo.
A postagem de campos de texto é simples, há um exemplo bem ali no net / http rdocs, mas não consigo descobrir como postar um arquivo junto com ele.
Net :: HTTP não parece ser a melhor ideia. freio é bom olhar.
gem install rest-client
erequire 'rest_client'
. Essa informação foi omitida em muitos exemplos de rubi.Não posso dizer coisas boas o suficiente sobre a biblioteca multipartes de Nick Sieger.
Ele adiciona suporte para postagem de várias partes diretamente no Net :: HTTP, eliminando a necessidade de se preocupar manualmente com limites ou grandes bibliotecas que podem ter objetivos diferentes dos seus.
Aqui está um pequeno exemplo de como usá-lo do README :
Você pode verificar a biblioteca aqui: http://github.com/nicksieger/multipart-post
ou instale-o com:
Se você estiver se conectando via SSL, precisará iniciar a conexão assim:
fonte
curb
parece uma ótima solução, mas caso não atenda às suas necessidades, você pode fazer comNet::HTTP
. Um post de formulário com várias partes é apenas uma string cuidadosamente formatada com alguns cabeçalhos extras. Parece que todo programador Ruby que precisa fazer postagens com várias partes acaba escrevendo sua própria pequena biblioteca para isso, o que me faz pensar por que essa funcionalidade não está embutida. Talvez seja ... De qualquer forma, para o seu prazer de leitura, vou prosseguir e dar aqui a minha solução. Este código é baseado em exemplos que encontrei em alguns blogs, mas lamento não poder encontrar mais os links. Então eu acho que só tenho que levar todo o crédito para mim ...O módulo que escrevi para isso contém uma classe pública, para gerar os dados de formulário e cabeçalhos de um hash de
String
eFile
objetos. Portanto, por exemplo, se você quiser postar um formulário com um parâmetro de string denominado "title" e um parâmetro de arquivo denominado "document", você faria o seguinte:Então você apenas faz um normal
POST
comNet::HTTP
:Ou qualquer outra coisa que você queira fazer
POST
. O ponto é queMultipart
retorna os dados e cabeçalhos que você precisa enviar. E é isso! Simples, certo? Aqui está o código para o módulo Multipart (você precisa damime-types
gema):fonte
FileParam
classe. A atribuição noto_multipart
método copia o conteúdo do arquivo novamente, o que é desnecessário! Em vez disso, passe apenas o descritor de arquivo e leia-o noto_multipart
Outro usando apenas bibliotecas padrão:
Tentei várias abordagens, mas só funcionou para mim.
fonte
uri = URI('https://some.end.point/some/path')
Dessa forma, você pode chamaruri.port
euri.host
sem erros mais tarde.File.open
não deve usarFile.read
Aqui está minha solução depois de tentar outras disponíveis neste post, estou usando para fazer upload de fotos no TwitPic:
fonte
Avançando para 2017,
ruby
stdlib
net/http
vem integrado desde 1.9.3https://ruby-doc.org/stdlib-2.3.1/libdoc/net/http/rdoc/Net/HTTPHeader.html#method-i-set_form
Podemos até usar o
IO
que não oferece suporte:size
para transmitir os dados do formulário.Esperando que esta resposta possa realmente ajudar alguém :)
PS Eu só testei isso no ruby 2.3.1
fonte
Ok, aqui está um exemplo simples usando meio-fio.
fonte
restclient não funcionou para mim até que eu substituísse create_file_field em RestClient :: Payload :: Multipart.
Ele estava criando um 'Content-Disposition: multipart / form-data' em cada parte onde deveria ser 'Content-Disposition: form-data' .
http://www.ietf.org/rfc/rfc2388.txt
Meu fork está aqui se você precisar: [email protected]: kcrawford / rest-client.git
fonte
Bem, a solução com NetHttp tem uma desvantagem que, ao postar arquivos grandes, ele carrega o arquivo inteiro primeiro na memória.
Depois de brincar um pouco, descobri a seguinte solução:
fonte
há também o post multiparte de nick sieger para adicionar à longa lista de soluções possíveis.
fonte
Eu tive o mesmo problema (preciso postar no servidor web jboss). O Curb funciona bem para mim, exceto que fazia o ruby travar (ruby 1.8.7 no ubuntu 8.10) quando eu uso variáveis de sessão no código.
Eu vasculhei os documentos do cliente restante, não consegui encontrar indicação de suporte a várias partes. Tentei os exemplos rest-client acima, mas jboss disse que a postagem http não é multiparte.
fonte
A gem multipart-post funciona muito bem com Rails 4 Net :: HTTP, nenhuma outra gem especial
https://github.com/Feuda/multipart-post/tree/patch-1
fonte