Работа с 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'
Ссылки
Репозиторий проекта
Веселого вам программирования!
декабря 24, 2011 at 17:32 (#)
Очень вовремя, как раз пишу клиента для своего же REST сервиса, планировал юзать Net::HTTP, c гемом RestClient будет удобнее и быстрее =)
декабря 24, 2011 at 17:50 (#)
JonNiBrovo, можешь еще как вариант посмотреть на HTTParty:
января 27, 2012 at 09:29 (#)
А мне пришлось писать REST клиента на JS, сначала так
, а потом начали использовать BackboneJS.
Для того, чтобы работали кроссдоменные запросы, сделал так:
Самое интересное, что почти все браузеры(кроме Chrome), передавали куки. =(