Publicado por Rafael Rosa em 18 de January de 2010
Colinha para o usar o Net::HTTP
Clique aqui para adicionar ao del.icio.us | Nenhum comentário - Deixe o seu agora!
O rubista norueguês, August Lilleaas, trabalhou um bocado para escrever um monte de exemplos de como utilizar a biblioteca Net::HTTP do Ruby, que vêm na maioria das distribuições. Perguntamos a ele se haveria algum problema em colocar alguns deles diretamente no Ruby Inside para ficar como referência e ele disse "Sem problemas!"
Vale notar que o Net::HTTP foi superado em muitos casos por bibliotecas como o HTTParty do John Nunemaker, e a biblioteca de alta performance Typhoeus criada por Paul DIx, mas como o Net::HTTP faz parte da biblioteca padrão, ela ainda é uma escolha muito popular, mesmo que não seja muito fácil lembrar como funciona sua API.
Segue uma seleção dos exemplos escritos pelo August para algumas das operações mais comuns. Se quiser ver todos os exemplos e acompanhar as atualizações, veja o repositório net-http-cheat-sheet criado por ele no GitHub.
Chamada HTTP padrão
require "net/http" require "uri" uri = URI.parse("http://google.com/") # Chamada curta response = Net::HTTP.get_response(uri) # Irá imprimir response.body Net::HTTP.get_print(uri) # Chamada completa http = Net::HTTP.new(uri.host, uri.port) response = http.request(Net::HTTP::Get.new(uri.request_uri))
Autenticação Simples
require "net/http" require "uri" uri = URI.parse("http://google.com/") http = Net::HTTP.new(uri.host, uri.port) request = Net::HTTP::Get.new(uri.request_uri) request.basic_auth("username", "password") response = http.request(request)
Tratando objetos de resposta
require "net/http" require "uri" uri = URI.parse("http://google.com/") http = Net::HTTP.new(uri.host, uri.port) request = Net::HTTP::Get.new(uri.request_uri) response = http.request(request) response.code # => 301 response.body # => O corpo da resposta (HTML, XML, blob, ou qualquer outra coisa)
# Os valores do header são passados em minúsculas response["cache-control"] # => public, max-age=2592000
Enviando um form como POST
require "net/http" require "uri" uri = URI.parse("http://example.com/search") # Chamada curta response = Net::HTTP.post_form(uri, {"q" => "My query", "per_page" => "50"}) # Controle completo http = Net::HTTP.new(uri.host, uri.port) request = Net::HTTP::Post.new(uri.request_uri) request.set_form_data({"q" => "My query", "per_page" => "50"}) response = http.request(request)
Upload de arquivo usando input type="file"
require "net/http" require "uri" # Token utilizado para marcar o fim do arquivo no corpo do post. Garanta que ele não faz parte # do arquivo que você está fazendo upload. BOUNDARY = "AaB03x" uri = URI.parse("http://something.com/uploads") file = "/path/to/your/testfile.txt" post_body = [] post_body < < "--#{BOUNDARY}\r\n" post_body < < "Content-Disposition: form-data; name=\"datafile\"; filename=\"#{File.basename(file)}\"\r\n" post_body < < "Content-Type: text/plain\r\n" post_body < < "\r\n" post_body < < File.read(file) post_body < < "\r\n--#{BOUNDARY}--\r\n" http = Net::HTTP.new(uri.host, uri.port) request = Net::HTTP::Post.new(uri.request_uri) request.body = post_body.join request["Content-Type"] = "multipart/form-data, boundary=#{BOUNDARY}" http.request(request)
Requisição SSL/HTTPS
require "net/https" require "uri" uri = URI.parse("https://secure.com/") http = Net::HTTP.new(uri.host, uri.port) http.use_ssl = true http.verify_mode = OpenSSL::SSL::VERIFY_NONE request = Net::HTTP::Get.new(uri.request_uri) response = http.request(request) response.body response.status response["header-here"] # All headers are lowercase
Requisição SSL/HTTPS com certificado PEM
require "net/https" require "uri" uri = URI.parse("https://secure.com/") pem = File.read("/path/to/my.pem") http = Net::HTTP.new(uri.host, uri.port) http.use_ssl = true http.cert = OpenSSL::X509::Certificate.new(pem) http.key = OpenSSL::PKey::RSA.new(pem) http.verify_mode = OpenSSL::SSL::VERIFY_PEER request = Net::HTTP::Get.new(uri.request_uri)
Métodos REST
# REST básico # A maior parte das APIs REST irá colocar valores semânticos em response.body e response.code. require "net/http" http = Net::HTTP.new("api.restsite.com") request = Net::HTTP::Post.new("/users") request.set_form_data({"users[login]" => "quentin"}) response = http.request(request) # Use nokogiri, hpricot, etc para fazer o parse de response.body. request = Net::HTTP::Get.new("/users/1") response = http.request(request) # Assim como em POST, os dados estão em response.body. request = Net::HTTP::Put.new("/users/1") request.set_form_data({"users[login]" => "changed"}) response = http.request(request) request = Net::HTTP::Delete.new("/users/1") response = http.request(request)
Existem outros no repositório do August, se você quiser dar uma olhada, vale a pena...


