Работа с RestClient

декабря 24, 2011  |  Published in HTTP & REST  |  3 Comments

В этой статье я расскажу о работе с RestClient — замечательной библиотекой (gem’ом) написанной на Ruby.

RestClient — это библиотека для взаимодействия с REST-сервисами. RestClient был разработан Адамом Виггинсом (Adam Wiggins) когда он счел Net::HTTP слишком низкоуровневым и многословным, а ActiveResource слишком «толстым» и избыточным. Сейчас разработкой RestClient занимается Жульен Кирч (Julien Kirch), который значительно доработал и улучшил то, что создал Адам Виггинс.

RestClient очень прост и удобен. По сути, все, что вы делаете с RestClient — это отправляется HTTP запросы RESTful серверу, например, к Twitter API или API какого-нибудь другого интересного проекта, или даже не API, а сайту, который поддерживает REST-архитектуру. Мы просто отправляем запрос и получаем ответ — вот чем занимается RestClient.

В качестве сервера мы будем использовать просто приложение на Rails 3.1, которое содержит стандартную модель, контроллер и вьюхи генерируемые генератором scaffold (модель Post содержит стандартные поля + title и content).

В качестве клиента — простое приложение на RestClient разработкой которого мы сейчас займемся.

Для начала установим RestClient

RestClient — это совсем обыкновенные gem, а значит установить его мы можем используя менеджер RubyGems или Bundler:

$ gem install rest-client

Или:

#Gemfile
gem  'rest-client''

$ bundle install

Разработка клиента

Когда я сказал, что работа с RestClient очень простая я имел ввиду,что она очень-очень простая! Код нашего клиента выглядит совсем просто:

require 'rest-client'

server = "http://localhost:3000"

response = RestClient.get(server + "/posts.json")

Одна единственная строка:

response = RestClient.get(server + «/posts.json»)

Позволяет послать серверу (нашему Rails приложению) запрос и получить ответ в формате json:

[{"content":"0 content","created_at":"2011-11-17T18:10:43Z","id":1,"title":"0 Title","updated_at":"2011-11-17T18:10:43Z"},{"content":"1 content","created_at":"2011-11-17T18:10:43Z","id":2,"title":"1 Title","updated_at":"2011-11-17T18:10:43Z"},{"content":"2 content","created_at":"2011-11-17T18:10:43Z","id":3,"title":"2 Title","updated_at":"2011-11-17T18:10:43Z"},{"content":"3 content","created_at":"2011-11-17T18:10:43Z","id":4,"title":"3 Title","updated_at":"2011-11-17T18:10:43Z"},{"content":"4 content","created_at":"2011-11-17T18:10:43Z","id":5,"title":"4 Title","updated_at":"2011-11-17T18:10:43Z"}]
=> true

Ответ, как вы понимаете, будет присвоен переменной response.

Часть того, что мы уже написали может быть достаточно и можно было бы закончить эту статью на этом месте, если бы я не хотел разобраться с RestClient более подробно выйдя за рамки тривиальной задачи отправки простейшего get-запроса.

Изначально я думал, что переменная response будет ссылаться на какой-то объект типа RestClient::Response, например, однако response — это просто экземпляр класса String несколько расширенный RestClient’ом. В него добавлено несколько полезных методов — аксессоров к атрибутам ответа сервера, хотя сам объект строкового типа представляет из себя строку — тело ответа сервера. Вот методы, которые были добавлены в response.

args
args=
body
body=
net_http_res
net_http_res=
code
headers
raw_headers
cookies
return!
description
follow_redirection

Думаю, не сложно догадаться, что эти методы позволяют получать и устанавливать некоторые части запроса, например, заголовок запроса, код ответа сервера, куки, содержимое (тело) ответа сервера и т.д. Пример:

require 'restclient'

server = "http://localhost:3000"

response = RestClient.get(server + "/topics/3")

response #<!DOCTYPE html><html>...</html>

response.description # 200 OK | text/html 3560 bytes

response.body #<!DOCTYPE html><html>...</html>

response.code #200

response.headers.inspect #{:content_type=>"text/html; charset=utf-8", :x_ua_compatible=>"IE=Edge", :etag=>"\"0fd8e639ec6e519842bc7217fdb0584e\"",:cache_control=>"max-age=0, private, must-revalidate", :x_runtime=>"0.147328", :content_length=>"3560", :server=>"WEBrick/1.3.1 (Ruby/1.9.2/2011-02-18)", :date=>"Sat, 24 Dec 2011 14:51:45 GMT", :connection=>"Keep-Alive", :set_cookie=>["_rubydev_session=BAh7B0kiD3Nlc3Npb25faWQGOgZFRkkiJTBjYWRhZmIwMmQyOThmMTJmZGQ0OGJlZGVkM2Q1Y2QxBjsAVEkiEF9jc3JmX3Rva2VuBjsARkkiMW9JSzNQOGJ4VkxTUWpMYVNOaWplTnVLajVtL0VzNlhvcDNsR2pyWVV0alk9BjsARg%3D%3D--d86f6dc8cd11590e4318defc41f42faa2420d33a; path=/; HttpOnly"]}

response.raw_headers.inspect #{"content-type"=>["text/html; charset=utf-8"], "x-ua-compatible"=>["IE=Edge"], "etag"=>["\"0fd8e639ec6e519842bc7217fdb0584e\""], "cache-control"=>["max-age=0, private, must-revalidate"], "x-runtime"=>["0.147328"], "content-length"=>["3560"], "server"=>["WEBrick/1.3.1 (Ruby/1.9.2/2011-02-18)"], "date"=>["Sat, 24 Dec 2011 14:51:45 GMT"], "connection"=>["Keep-Alive"], "set-cookie"=>["_rubydev_session=BAh7B0kiD3Nlc3Npb25faWQGOgZFRkkiJTBjYWRhZmIwMmQyOThmMTJmZGQ0OGJlZGVkM2Q1Y2QxBjsAVEkiEF9jc3JmX3Rva2VuBjsARkkiMW9JSzNQOGJ4VkxTUWpMYVNOaWplTnVLajVtL0VzNlhvcDNsR2pyWVV0alk9BjsARg%3D%3D--d86f6dc8cd11590e4318defc41f42faa2420d33a; path=/; HttpOnly"]}

response.cookies.inspect #{"_rubydev_session"=>"BAh7B0kiD3Nlc3Npb25faWQGOgZFRkkiJTBjYWRhZmIwMmQyOThmMTJmZGQ0OGJlZGVkM2Q1Y2QxBjsAVEkiEF9jc3JmX3Rva2VuBjsARkkiMW9JSzNQOGJ4VkxTUWpMYVNOaWplTnVLajVtL0VzNlhvcDNsR2pyWVV0alk9BjsARg%3D%3D--d86f6dc8cd11590e4318defc41f42faa2420d33a"}

response.net_http_res.inspect ##<Net::HTTPOK 200 OK  readbody=true>

response.args.inspect #{:method=>:get, :url=>"http://localhost:3000/topics/3", :headers=>{}}

puts response.class #String
puts response.singleton_methods.inspect #[:args, :args=, :body, :body=, :net_http_res, :net_http_res=, :code, :headers, :raw_headers, :cookies, :return!, :to_i, :description, :follow_redirection]

RestClient поддерживает следующие HTTP REST-методы: GET, POST, PUT, DELETE, HEAD, PATCH.

Вы также можете использовать прокси сервер для выполнения запроса, для этого необходимо установить его адрес используя метод RestClient.proxy:


RestClient.proxy = 'http://proxy.server.com'

Ссылки
Репозиторий проекта

Веселого вам программирования!

Tags: , ,

Responses

  1. says:

    декабря 24, 2011 at 17:32 (#)

    Очень вовремя, как раз пишу клиента для своего же REST сервиса, планировал юзать Net::HTTP, c гемом RestClient будет удобнее и быстрее =)

  2. admin says:

    декабря 24, 2011 at 17:50 (#)

    JonNiBrovo, можешь еще как вариант посмотреть на HTTParty:

  3. Nitr says:

    января 27, 2012 at 09:29 (#)

    А мне пришлось писать REST клиента на JS, сначала так

    var xmlhttp = new XMLHttpRequest();
    xmlhttp.open('GET','www.myservice.ru/topics.json');
    xmlhttp.onload = function(){ /*обрабатываем ответ*/}
    xmlhttp.send();
    

    , а потом начали использовать BackboneJS.
    Для того, чтобы работали кроссдоменные запросы, сделал так:

    #file: application_controller.rb
    class ApplicationController  [:index, :new, :create, :show, :edit, :update, :destroy, :options]
    
    def set_access_control_headers
     headers['Access-Control-Allow-Origin'] = "*"
     headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS, DELETE, PUT'
     headers['Access-Control-Max-Age'] = '1000'
     headers['Access-Control-Allow-Credentials'] = 'true'
     headers['Access-Control-Allow-Headers'] = '*,x-requested-with,Content-Type,X-PINGOTHER'
    end
    
    end
    
    #file: routes.rb 
    ...
     match ':controller', :controller => 'application', :action => 'options', :constraints => {:method => 'OPTIONS'}
     match ':controller/:id', :controller => 'application', :action => 'options', :constraints => {:method => 'OPTIONS'}
    ...
    

    Самое интересное, что почти все браузеры(кроме Chrome), передавали куки. =(

Leave a Response

Для подсветки кода используйте BB - коды: [language]...[/language], где language может быть: ruby, javascript, css, html.