Ruby: HTTParty: не удается правильно отформатировать данные XML POST?
ПРИМЕЧАНИЕ: "объект" - это заполнитель, так как я не думаю, что должен говорить о том, что конкретно делает контроллер.
Итак, у меня есть несколько способов вызова API моих приложений, в командной строке работает следующее:
curl -H 'Content-Type: application/xml' -d '<object><name>Test API object</name><password>password</password><description>This is a test object</description></object>' "http://acme.example.dev/objects.xml?api_key=1234"
Приведенная выше команда генерирует следующий запрос в devlog:
Processing ObjectsController#create to xml (for 127.0.0.1 at 2011-07-07 09:17:51) [POST]
Parameters: {"format"=>"xml", "action"=>"create", "api_key"=>"1234", "controller"=>"objects",
"object"=>{"name"=>"Test API object", "description"=>"This is a test object", "password"=>"[FILTERED]"}}
Теперь я пытаюсь написать тесты для действий с использованием API, чтобы убедиться, что API работает, а также контроллеры. Вот моя текущая (неработающая) команда httparty:
response = post("create", :api_key => SharedTest.user_api_key, :xml => data, :format => "xml")
эта команда генерирует следующий запрос в testlog:
Processing ObjectsController#create to xml (for 0.0.0.0 at 2011-07-07 09:37:35) [POST]
Parameters: {
"xml"=>"<object><name><![CDATA[first post]]></name>
<description><![CDATA[Things are not as they used to be]]></description>
<password><![CDATA[WHEE]]></password>
</object>",
"format"=>"xml",
"api_key"=>"the_hatter_wants_to_have_tea1",
"action"=>"create",
"controller"=>"objects
Итак, как вы можете видеть, команда командной строки фактически генерирует хеш объекта из xml, тогда как команда httparty в конечном итоге остается в xml, что вызывает проблемы для метода create, так как для него требуется хеш.
Любые идеи / надлежащая документация? Текущая документация говорит, что сообщение принимает URL, и "параметры", а затем никогда не говорит, какие варианты доступны
** РЕДАКТИРОВАТЬ:
Согласно предложению @Casper, мой метод теперь выглядит так:
def post_through_api_to_url(url, data, api_key = SharedTest.user_api_key)
response = post("create", {
:query => {
:api_key => api_key
},
:headers => {
"Content-Type" => "application/xml"
},
:body => data
})
ap @request.env["REQUEST_URI"]
assert_response :success
return response
end
к сожалению, assert_response завершается неудачно, потому что аутентификация через ключ API не проходит. Если посмотреть на сам запрос, то api_key не устанавливается должным образом... он показывает:
api_key%5D=the_hatter_wants_to_have_tea1"
но оно должно быть равным без%5D (правая квадратная скобка)
2 ответа
Я думаю, вот как вы должны это использовать:
options = {
:query => {
:api_key => 1234
},
:headers => {
"Content-Type" => "application/xml"
},
:body => "<xmlcode>goes here</xmlcode>"
}
post("/create", options)
Извините за простоту, но если вы хотите отправить только одну переменную в качестве параметра, почему бы вам не сделать то, что предлагает Каспер, а просто сделать:
post("/create?api_key=1234", options)
Или вместо того, чтобы тестировать особенности HTTParty в доступе к вашему API, возможно, пишите свои тесты, используя Rack:: Test? Очень грубый пример...
require "rack/test"
require "nokogiri"
class ObjectsTest < Test::Unit::TestCase
include Rack::Test::Methods
def app
MyApp.new
end
def create_an_object(o)
authorize "x", "1234" # or however you want to authenticate using query params
header 'Accept', 'text/xml'
header 'Content-Type', 'text/xml'
body o.to_xml
post "/create"
xml = Nokogiri::XML(last_response.body)
assert something_logic_about(xml)
end
end