我想这是一个比ebay特定的普遍问题,但我不确定:我正在尝试向ebay开发人员API发送XML请求以检索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内部服务器错误”,无论我如何制作我的示例。我尝试了两种非常基本的方法:
第一名:
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 Internal server error”。
有人看到我的POST请求出错吗?
[编辑] 顺便说一句,使用URL ValueName API可以与Python完美配合,但这只是对URL的GET请求。但是,我更喜欢使用XML API。但是,如果那是不可能的,我当然会切换到ValueName URI。
答案 0 :(得分:0)
500响应状态相当通用,无论在服务器上抛出什么错误,都应该返回。您会考虑使用CGI引用来返回错误消息吗?
答案 1 :(得分: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>'