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