Dagger

Featherweight wrapper around Net::HTTP.

Follows redirects if instructed, and comes with out-of-the-box parsing of JSON and XML, via oj and ox, respectively.

Installation

In your Gemfile:

gem 'dagger'

Usage

get(url, [options])

require 'dagger'
resp = Dagger.get('http://google.com')

puts resp.body # => "<!doctype html...>"

# you can also pass a query via the options hash, in which case is appended as a query string.
Dagger.get('google.com/search', { query: { q: 'dagger' } }) # => requests '/search?q=dagger'

post(url, params, [options])

resp = Dagger.post('http://api.server.com', { foo: 'bar' })
puts resp.code # => 200

# if you want to send JSON to the server, you can pass the { json: true } option,
# which converts your params object to JSON, and also sets Content-Type to 'application/json'
resp = Dagger.put('http://server.com', { foo: 'bar' }, { json: true })

# now, if the endpoint returned a parseable content-type (e.g. 'application/json')
# then `resp.data` will return the parsed result. `body` contains the raw bytes.
puts resp.data # => { result: 'GREAT SUCCESS!' }

Same syntax applies for put, patch and delete requests.

request(method, url, [params], [options])

resp = Dagger.request(:put, 'https://api.server.com', { foo: 'bar' }, { follow: 10 })
puts resp.headers # { 'Content-Type' => 'application/json', ... } 

In this case, if you want to include a query in your get request, simply pass it as the params argument.

open(url, [options]) # => &block

Oh yes. Dagger can open and hold a persistent connection so you can perform various requests without the overhead of establishing new TCP sessions.

Dagger.open('https://api.server.com', { verify_ssl: 'false' }) do
   if post('/login', { email: '[email protected]', pass: 'secret' }).success?
     resp = get('/something', { query: { items: 20 }, follow: 5 }) # follow 5 redirects max.
     File.open('something', 'wb') { |f| f.write(resp.body) }
   end
end

Passing the block is optional, by the way. You can also open and call the request verb on the returned object:

  http = Dagger.open('https://api.server.com')
  resp = http.get('/foo')
  puts resp.code # => 200
  resp = http.post('/bar', { some: 'thing' })
  puts resp.data.inspect # => { status: "success" }
  http.close # don't forget to!

Options

These are all the available options.

opts = {
  json: true, # converts params object to JSON and sets Content-Type header. (POST/PUT/PATCH only)
  follow: true, # follow redirects (10 by default)
  headers: { 'Accept': 'text/xml' },
  username: 'dagger', # for HTTP auth
  password: 'fidelio', 
  verify_ssl: false, # true by default
  open_timeout: 30,
  read_timeout: 30
}
resp = Dagger.post('http://test.server.com', { payload: 1 }, opts)

Credits

Written by Tomás Pollak.

Copyright

(c) Fork, Ltd. MIT Licensed.