about processes and engines

gem : rufus-verbs

‘rufus-verbs’ is an extended HTTP client library (gem). It provides the four main HTTP “verbs” as Ruby methods : get, put, post and delete.

It wraps a certain number of techniques that make it a decent tool for manipulating web resources.


currently :

* follows redirections
* automatically adds _method={post|put} in the request parameters with the option :fake_put => true
* HTTPS aware (‘verify none’ by default)
* HTTP basic authentication
* doesn’t propagate auth credentials in case of redirection to different host
* advertises and uses gzip compression
* proxy-aware (HTTP_PROXY env var or :proxy option)
* conditional GET (via ConditionalEndPoint class)
* request body built via a block (post and put)

maybe later :

* retry on failure
* greediness (automatic parsing for content like JSON or YAML)
* http digest authentication
* cache awareness
* head, options

some examples

At first, get the gem with

sudo gem install -y rufus-verbs


    require 'rubygems'
    require 'rufus/verbs'

    include Rufus::Verbs

    # using get(), post(), put() and delete() directly

    r = get ""
    puts r.body

    r = get :uri => ""
    puts r.body

        :d => "hammer")
        # passing the data via the :d (or :data) option
    r = post "http://resta.farian:780/inventory/tools/1" do
        "sliver bullet"
        # the data is generated by a block

    puts r.code.to_i
        # 201... resource created, note that by default, 
        # an instance of Net::HTTPResponse is returned

    puts get(
        :body => true)
            # "sliver bullet" (directly returning 
            # the content of the response)

    # oops, typo

    put "http://resta.farian:780/inventory/tools/1" do
        "silver bullet"

    put "http://resta.farian:780/inventory/tools/1" do |req|
        req['Content-Type'] = "text/plain"
        "no silver bullet"
        # the block accepts a 'req' (Net::HTTPREquest) 
        # argument

    delete "http://resta.farian:780/inventory/tools/0"
        # I don't need that hammer anymore

Using get() and co via an EndPoint to share common options for a set of requests :

    ep =
        :host => "resta.farian", 
        :port => 780, 
        :resource => "inventory/tools")

    res = ep.get :id => 1
        # still a silver bullet ?

    res = ep.get :id => 0
        # where did the hammer go ?

If your resource server allows it, you can take advantage of conditional GETs via rufus-verbs’ ConditionalEndPoint :

    ep =
        :host => "resta.fariann", 
        :port => 780, 
        :resource => "inventory/tools")

    res = ep.get :id => 1
        # first call will retrieve the representation 
        # completely

    res = ep.get :id => 1
        # the server (provided that it supports 
        # conditional GETs) only returned a 304 
        # answer, the response is returned from
        # the ConditionalEndPoint cache

the r[eal] doc

The documentation for ‘rufus-verbs’ is at

License is MIT.

Written by John Mettraux

January 18, 2008 at 1:25 am

Posted in rest, ruby

%d bloggers like this: