Помогите мне с публикацией с Net :: HTTP - PullRequest
0 голосов
/ 27 августа 2010

Я использую сторонний API (API Spreadshirt), и для создания корзины мне нужно отправить xml через запрос POST.Я пытаюсь сделать это с помощью доступных функций Net :: HTTP, и вот как я это делаю

def get_session
      @time = Time.now.to_i * 1000 #get the current time as integer
      @sha1 = Digest::SHA1.hexdigest("POST http://api.spreadshirt.com/api/v1/baskets #{@time} #{ENV['SPREADSHIRT_SECRET_KEY']}") #encrypt the signature

      @http = Net::HTTP.new("http://api.spreadshirt.com")
      @path = "/api/v1/baskets?apiKey=#{ENV['SPREADSHIRT_API_KEY']}&sig=#{@sha1}&time=#{@time}"

      @payload = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>
      <basket xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns=\"http://api.spreadshirt.net\">
      </basket>"

      @response = @http.request_post(@path, @payload)
  end

time => "Метка времени в миллисекундах, используемая в подписи, например, 1240575575156."

sig => "Подпись в качестве SHA-1 как шестнадцатеричной строки 'METHOD URL_WITHOUT_QUERY TIMESTAMP SECRET', например, 'POST http://localhost:8080/api/v1/users/42/productPriceCalculator 1240575575156 987654321'. (Используйте свой собственный секрет в действующей системе)."*

apiKey => "Запрошенный ключ API, например, 123456789 (используйте свой собственный ключ в действующей системе)."

Подробнее о спецификации можно найти по следующим ссылкам: http://api.spreadshirt.net/api/v1/metaData/api.html#N218D1 http://wiki.developer.spreadshirt.net/display/API/Basket+Resources

Мне просто интересно, правильно ли я использовал функцию Net :: HTTP или нет, предполагая, что я использовал правильный секретный ключ и ключ API.

РЕДАКТИРОВАТЬ:

Поставщик предоставил пример кода на PHP, который можно найти здесь http://spreadshirtapps.svn.sourceforge.net/viewvc/spreadshirtapps/php/sod/ файл sprd / CheckoutController.php является тем, который аналогичен тому, что я хочу сделать.

Ответы [ 2 ]

2 голосов
/ 27 августа 2010

Многие веб-службы требуют, чтобы вы сообщали им, что отправляете XML через заголовок Content-Type.Для Net :: HTTP попробуйте что-то вроде этого:

url = "http://.../api/v1/baskets?..."
payload = "..."

require 'net/http'
request = Net::HTTP::Post.new(url)
request.add_field "Content-Type", "application/xml"
request.body = payload

uri = URI.parse(url)
http = Net::HTTP.new(uri.host, uri.port)
response = http.request(request)
0 голосов
/ 27 августа 2010

Ресурс: я использую Net :: HTTP шпаргалку

Ответ:

Ваш код выглядит нормально.Хотя я не уверен, почему вы используете так много переменных экземпляра вместо локальных переменных.

Какую ошибку вы получаете?

Добавлено:

Код состояния 400 - «Плохой запрос», но, что более важно, он, вероятно, исходит из приложения сервера, а не самого сервера HTTP (Apache,и т.д.).

Предложение:

Запустите пример программы php, которую они вам дали. убедитесь, что работает для функций, которые вы пытаетесь выполнить из Ruby / Rails.

Затем используйте Wireshark или другой Ethernet-peeker, чтобы увидеть в точности отправлено с примера клиента на сервер и с вашего клиента на сервер.Ваша задача состоит в том, чтобы заставить ваши Ruby / Rails делать то же самое, что и их пример sw.

Установка типа контента в соответствии с рекомендациями Гарольда Л. - хорошая идея.

Но вы такженеобходимо убедиться, что ваш код точно (вплоть до бита) эмулирует то, что их рабочий пример кода делает по сети.Очень часто документы не совсем соответствуют реализации, особенно в ранних версиях API, таких как Spreadshirt.

Я предполагаю, что им должно быть приятно, что вы работаете в их API.У них есть все основания быть полезными для вас.

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...