Я предполагаю, что это скорее общая проблема, чем спецификация 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, конечно.
Возвращает статус 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>'
Состояние ответа 500 является довольно общим и должно возвращаться независимо от того, какая ошибка возникает на сервере. Не могли бы вы использовать обратную ссылку CGI для возврата сообщения об ошибке?