HTTP clients
| Net::HTTP GET | |
| POST JSON | |
| Timeouts | |
| Handle failures |
Net::HTTP GET
Net::HTTP lives in the standard library, so a GET request needs only a require and a URI.
The get_response method returns a response object with the status code and the body.
require "net/http"
uri = URI("https://example.com/")
response = Net::HTTP.get_response(uri)
puts response.code
puts response.body[0, 100]
POST JSON
Posting JSON means generating a JSON string and passing it with a content type header.
The Net::HTTP.post shortcut takes the URI, the body string, and a header hash.
require "net/http"
require "json"
uri = URI("https://example.com/users")
body = JSON.generate({ "name" => "Ada", "role" => "admin" })
response = Net::HTTP.post(uri, body, { "Content-Type" => "application/json" })
puts response.code
puts response.body
Timeouts
Network calls can hang, so set an open timeout for connecting and a read timeout for waiting on data.
Both values live on the Net::HTTP object and apply before the request runs.
require "net/http"
uri = URI("https://example.com/")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = (uri.scheme == "https")
http.open_timeout = 5
http.read_timeout = 10
response = http.get("/")
puts response.code
Handle failures
Name resolution failures and slow servers raise exceptions, so wrap requests in begin and rescue.
Rescue SocketError for DNS problems and the Net timeout classes for slow responses.
require "net/http"
begin
response = Net::HTTP.get_response(URI("https://example.com/"))
puts response.code
rescue SocketError => e
puts "DNS failed: #{e.message}"
rescue Net::OpenTimeout, Net::ReadTimeout
puts "Timed out"
end
Next: Sockets
Article author: Arthur Isaev