Ruby: HTTParty: не удается правильно отформатировать данные XML POST? - PullRequest
0 голосов
/ 07 июля 2011

ПРИМЕЧАНИЕ: «объект» - это заполнитель, так как я не думаю, что должен говорить о том, что конкретно делает контроллер.

, поэтому у меня есть несколько способов вызова 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")

эта команда генерирует следующий запрос в журнале тестов:

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, и "параметры", а затем никогда не говорит, какие параметры доступны


** РЕДАКТИРОВАТЬ :
в соответствии с предложением @ Каспера, мойметод теперь выглядит следующим образом:

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.Глядя на саму структуру request_uri, ключ api_key не устанавливается должным образом ... он показывает:

api_key%5D=the_hatter_wants_to_have_tea1"

, но он должен быть равным, без% 5D (правая квадратная скобка)

Ответы [ 2 ]

1 голос
/ 07 июля 2011

Я думаю, вот как вы должны это использовать:

options = {
  :query => {
    :api_key => 1234
  },

  :headers => {
    "Content-Type" => "application/xml"
  },

  :body => "<xmlcode>goes here</xmlcode>"
}

post("/create", options)
0 голосов
/ 17 июля 2011

Извините за простоту, но если вы хотите отправить только одну переменную в качестве параметра, почему бы вам не сделать то, что предлагает Каспер, а просто сделать:

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
...