Publicado por Rafael Rosa em 18 de January de 2010

Colinha para o usar o Net::HTTP

http-is-a-hamster-on-rollerblades-says-marc-andre-cournoyer.gifO 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...

Deixe um Comentário