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

如何通过Python向ebay API发送有效的XML POST请求?,python,xml,http-post,ebay-api,Python,Xml,Http Post,Ebay Api,我想这是一个比较普遍的问题,而不是ebay特有的问题,但我不确定:我正在尝试向ebay开发者API发送一个XML请求以检索XML响应。使用curl时,一切正常,我得到一个XML响应,告诉我缺少哪些API键(如果我通过HTTP头提供它们,我会得到一个有效的XML结果): curl-d《哈利波特·凤凰》\ http://svcs.sandbox.ebay.com/services/search/FindingService/v1 这将导致正确的响应: <?xml version='1.0'

我想这是一个比较普遍的问题,而不是ebay特有的问题,但我不确定:我正在尝试向ebay开发者API发送一个XML请求以检索XML响应。使用curl时,一切正常,我得到一个XML响应,告诉我缺少哪些API键(如果我通过HTTP头提供它们,我会得到一个有效的XML结果):

curl-d《哈利波特·凤凰》\
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>
>>> 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>'

2038
CoreRuntime
错误
系统
缺少SOA操作名称标头
系统
但是,当我尝试使用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='harry potter phoenix'
webservice=httplib.HTTP(serverUrl)
putrequest(“POST”,“/services/search/FindingService/v1”)
putheader(“主机”,服务器URL)
putheader(“内容类型”,“text/xml;字符集=\“UTF-8\”)
putheader(“内容长度”,“%d”%len(xmlparameters))
webservice.endheaders()
发送(xmlparameters)
第二(这是我喜欢的方法):

serverUrl='svcs.sandbox.ebay.com'
xmlparameters='harry potter phoenix'
connection=httplib.HTTPConnection(serverUrl)
请求(“POST”、'/services/search/FindingService/v1',xmlparameters)
正如您在CURL示例中所看到的,我不发送API密钥等并不重要,它应该返回XML错误响应,而不仅仅是HTTP状态代码“500 Internal server error”

有人看到我的发帖请求有什么不对吗

[编辑]
顺便说一句,使用URL ValueName API与Python完美配合,但这只是URL上的GET请求。然而,我更喜欢使用XMLAPI。但是,如果这不可能,我当然会切换到ValueName URI。

500响应状态相当通用,无论服务器上抛出什么错误,都应该返回。您是否考虑使用CGI TraveCK返回错误消息?


它返回500状态和xml响应:

<?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>
>>> 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>'
>connection.request(“POST”、'/services/search/FindingService/v1',xmlparameters)
>>>resp=connection.getresponse()
>>>各自地位
>resp.read()

我的脚本本身没有错误,因此cgitb似乎没有返回错误。我在第一行启用了它,当我在代码中产生错误(例如,调用一个不存在的变量)时,它会返回一个回溯,但在我当前的代码中,整个脚本运行良好:“>>>ebaypredict.sendRequest()错误发送请求:500内部服务器错误”(这是通过一个函数检查状态代码是否正确产生的)。我猜你认为我正在使用我的wn Web服务器,因此推荐了一个CGI回溯工具?我正在调用另一个Web服务器,而该服务器正在生成错误消息,因此我似乎不知何故向ebay发送了一个错误的请求。你是对的……在德国,我们通常说在这种情况下,“因为所有的树而看不到森林”。始终正确;)多么尴尬。非常感谢!会给你一个投票权,但我必须先考虑一个好的OpenID用户名;)如果有人在几个月后发现这个问题,请加上一点:易趣在开始时不需要XML字符串,否则它将返回一个错误无法为xml创建xml流读取器:负载格式不正确或负载为空”。在开始时删除xml标记可以使一切正常。