如何通过Python向eBay API发送有效的XML POST请求?

2 投票
2 回答
3423 浏览
提问于 2025-04-16 17:08

我觉得这个问题可能是一个比较普遍的问题,而不是特定于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内部服务器错误”。

有没有人能看出我在POST请求中做错了什么?

[编辑] 顺便说一下,使用URL ValueName API在Python中工作得很好,但那只是对一个URL的GET请求。不过,我更希望使用XML API。如果这不行,我当然会切换到ValueName URI。

2 个回答

0

500状态响应是一个比较通用的错误提示,不管服务器上发生了什么错误,它都会返回这个状态。你有没有考虑过使用CGI的追踪功能来返回具体的错误信息呢?

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

1

它返回了一个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>'

撰写回答