Я свернул свое собственное решение и подумал, что это будет полезно. Я написал модуль, который использует json , curb и адресуемые гемы для отправки запросов GET, PUT, POST и DELETE на localhost: 3000. Он может запросить либо XML (как задал исходный вопрос), либо json. Возвращает тело ответа в виде хэша. В основном это обертка вокруг драгоценного камня, который, я думаю, имеет ужасный синтаксис.
Обратите внимание, что я автоматически загружаю api_key
. Это можно отключить, передав :api_key => false
или сломав, используя api_key => "wrong"
. Возможно, вы захотите пропустить это или изменить его в соответствии со своей схемой аутентификации.
Вот модуль:
module ApiTesting
# requres the json, curb, and addressable gems
require "addressable/uri"
def api_call(path, verb, query_hash={}, options={})
options.reverse_merge! :api_key => "abc1234", :format => "xml"
query_hash.reverse_merge!({:api_key => options["api_key"]}) if options[:api_key]
query = to_query_string(query_hash)
full_path = "http://localhost:3000/#{path}.#{options[:format]}?#{query}"
response = case verb
when :get
Curl::Easy.perform(full_path)
when :post
Curl::Easy.http_post("http://localhost:3000/#{path}.#{options[:format]}", query)
when :put
Curl::Easy.http_put(full_path, nil)
when :delete
Curl::Easy.http_delete(full_path)
end
case options[:format]
when "xml"
Hash.from_xml(response.body_str)
when "json"
JSON.parse(response.body_str)
end
end
private
def to_query_string(val)
uri = Addressable::URI.new
uri.query_values = val
uri.query
end
end
А вот несколько простых примеров:
Запрос атрибутов ресурса с помощью GET:
api_call("calls/41", :get)
Создание ресурсов с помощью POST:
api_call("people", :post, {:person => {:first => "Robert", :last => "Smith" } })
Обновление ресурсов с помощью PUT:
api_call("people/21", :put, {:person => { :first => "Bob" } })
Удаление ресурсов с помощью DELETE:
api_call("calls/41", :delete)
Отключение автоматической вставки api_key:
api_call("calls/41", :get, {}, {:api_key => false})
Используйте неправильный ключ api_key:
api_call("calls/41", :get, {}, {:api_key => "wrong"})
Использовать как json (по умолчанию xml):
api_call("calls/41", :get, {}, {:format => "json"})