Как отправить действительный запрос XML POST в API ebay через Python?

1

Я предполагаю, что это скорее общая проблема, чем спецификация ebay, но я не уверен: я пытаюсь отправить XML-запрос в API-интерфейс ebay для получения ответа XML. При использовании curl все работает нормально, и я получаю ответ XML, говорящий мне, какие API-ключи отсутствуют (если бы я предоставил их через HTTP-заголовки, я получил бы корректный результат XML):

curl -d '<!xml version="1.0" encoding="utf-8"?><findItemsByKeywordsRequest xmlns="http://www.ebay.com/marketplace/search/v1/services"><keywords>harry potter phoenix</keywords></findItemsByKeywordsRequest>' \
http://svcs.sandbox.ebay.com/services/search/FindingService/v1

Это приводит к правильному ответу:

<?xml version='1.0' encoding='UTF-8'?>
<ms:errorMessage xmlns:ms="http://www.ebay.com/marketplace/services" xmlns="http://www.ebay.com/marketplace/search/v1/services">
    <error>
        <errorId>2038</errorId>
        <domain>CoreRuntime</domain>
        <severity>Error</severity>
        <category>System</category>
        <message>Missing SOA operation name header</message>
        <subdomain>System</subdomain>
    </error>
</ms:errorMessage>

Но когда я пытаюсь работать с Python, я просто получаю "500 Internal Server error", независимо от того, насколько я основываюсь на своих примерах. Я пробовал два очень простых метода:

Номер один:

serverUrl = 'svcs.sandbox.ebay.com'
xmlparameters = '<!xml version="1.0" encoding="utf-8"?><findItemsByKeywordsRequest xmlns="http://www.ebay.com/marketplace/search/v1/services"><keywords>harry potter phoenix</keywords></findItemsByKeywordsRequest>'

webservice = httplib.HTTP(serverUrl)
webservice.putrequest("POST", "/services/search/FindingService/v1")
webservice.putheader("Host", serverUrl)
webservice.putheader("Content-type", "text/xml; charset=\"UTF-8\"")
webservice.putheader("Content-length", "%d" % len(xmlparameters))
webservice.endheaders()
webservice.send(xmlparameters)

Номер два (это мой предпочтительный метод):

serverUrl = 'svcs.sandbox.ebay.com'
xmlparameters = '<!xml version="1.0" encoding="utf-8"?><findItemsByKeywordsRequest xmlns="http://www.ebay.com/marketplace/search/v1/services"><keywords>harry potter phoenix</keywords></findItemsByKeywordsRequest>'

connection = httplib.HTTPConnection(serverUrl)
connection.request("POST", '/services/search/FindingService/v1', xmlparameters)

Как вы можете видеть в примере CURL, не имеет значения, что я не отправляю ключи API и т.д., он должен возвращать ответ об ошибке XML в любом случае, а не только код состояния HTTP "Внутренняя ошибка сервера".

Кто-нибудь видит, что я делаю неправильно с моим POST-запросом?

[EDIT] btw, используя API ValueName URL, отлично работает с Python, но это просто запрос GET по URL-адресу. Тем не менее, Id предпочитает использовать XML API. Однако, если это невозможно, Id переключится на URI ValueName, конечно.

Теги:
http-post
ebay-api
ebay

2 ответа

0
Лучший ответ

Возвращает статус 500 и xml-ответ:

>>> connection.request("POST", '/services/search/FindingService/v1', xmlparameters)
>>> resp = connection.getresponse()
>>> resp.status
<<< 500
>>> resp.read()
<<< '<?xml version=\'1.0\' encoding=\'UTF-8\'?><ms:errorMessage xmlns:ms="http://www.ebay.com/marketplace/services" xmlns="http://www.ebay.com/marketplace/search/v1/services"><error><errorId>2038</errorId><domain>CoreRuntime</domain><severity>Error</severity><category>System</category><message>Missing SOA operation name header</message><subdomain>System</subdomain></error></ms:errorMessage>'
  • 1
    Вы правы ... В Германии мы в таких ситуациях говорим "не видеть лес из-за всех деревьев". Всегда верно;) Как стыдно. Большое спасибо! Я бы сказал, что я должен подумать о хорошем имени пользователя OpenID;)
  • 0
    Нет проблем, удачи: D
Показать ещё 1 комментарий
0

Состояние ответа 500 является довольно общим и должно возвращаться независимо от того, какая ошибка возникает на сервере. Не могли бы вы использовать обратную ссылку CGI для возврата сообщения об ошибке?

http://docs.python.org/library/cgitb.html#module-cgitb

  • 0
    Мой скрипт сам по себе не содержит ошибок, поэтому, похоже, cgitb не возвращает ошибок. Я включил его в первой строке, и он возвращает трассировку, когда я выдаю ошибку в своем коде (например, вызываю переменную, которая не существует), но с моим текущим кодом весь скрипт просто работает нормально: ">>> ebaypredict. sendRequest () Ошибка отправки запроса: «500 Internal Server Error» (возникает при проверке, хорош ли код состояния или нет).
  • 0
    Полагаю, вы подумали, что я работаю со своим веб-сервером wn, и поэтому порекомендовали инструмент трассировки CGI? Я звоню на другой веб-сервер, который выдает сообщение об ошибке, поэтому я, похоже, как-то отправил неправильный запрос на ebay.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню