Как отправить действительный запрос XML POST в API ebay через Python? - PullRequest
1 голос
/ 06 мая 2011

Я полагаю, что это скорее общая проблема, чем специфическая для 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 «500 Внутренняя ошибка сервера».

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

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

Ответы [ 2 ]

1 голос
/ 06 мая 2011

Возвращается статус 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>'
0 голосов
/ 06 мая 2011

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

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

...