Nap is an extremely simple REST client for Ruby. It was built to quickly fire off HTTP requests without having to research net/http internals.


gem 'nap'
require 'rest'
require 'json'

response = REST.get('', {},
  {:username => '_evan', :password => 'buttonscat'}
if response.ok?
  timeline = JSON.parse(response.body)
  puts( do |item|
elsif response.forbidden?
  puts "Are you sure you're `_evan' and your password is the name of your cat?"
  puts "Something went wrong (#{response.status_code})"
  puts response.body

Advanced request configuration

If you need more control over the Net::HTTP request you can pass a block to all of the request methods.

response = REST.get('') do |http_request|
  http_request.open_timeout = 15

Proxy support

To enable the proxy settings in Nap, you can either use the HTTP_PROXY or http_proxy enviroment variable.

$ env HTTP_PROXY=http://rob:[email protected]:665 ruby app.rb


Nap defines one top-level and three main error types which allow you to catch a whole range of exceptions thrown by underlying protocol implementations.

  • REST::Error: Any type of error
  • REST::Error::Timeout: Read timeouts of various sorts
  • REST::Error::Connection: Connection errors caused by dropped sockets
  • REST::Error::Protocol: Request failed because of a problem when handling the HTTP request or response

In the most basic case you can rescue from the top-level type to warn about fetching problems.

rescue REST::Error
  puts "[!] Failed to fetch Pigeon number 12."


Nap couldn't be the shining beacon in the eternal darkness without help from:

  • Eloy DurĂ¡n
  • Joshua Sierles
  • Thijs van der Vossen

For all other great human beings, please visit the GitHub contributors page.

Changes from 1.0.0 to 1.1.0

  • REST::Request now allows all HTTP verbs to send a body entity.

Changes from 0.8.0 to 1.0.0

  • Removed REST::DisconnectedError, please use REST::Error::Connection instead.