我没有太多处理 API 的经验,而且在使用 Python 发出 HTTP POST 请求方面还很陌生。想知道是否有人可以帮我解决这个问题。
他们提供this工具来手动访问数据,但我希望使用Python的请求库来自动化。插入必要的信息,我得到这个作为 HTTP POST:
POST /Products/2011-10-01?AWSAccessKeyId=AKIAJEHA562QWNAIEIKA
&Action=GetLowestOfferListingsForASIN
&SellerId=<removed>
&MWSAuthToken=<removed>
&SignatureVersion=2
&Timestamp=2016-01-06T04%3A20%3A48Z
&Version=2011-10-01
&Signature=7vP5dwgpk%2Bi%2Bl1L9tOsd7tVXDeQOoyvjR2fYtEhJCEY%3D
&SignatureMethod=HmacSHA256
&MarketplaceId=<removed>
&ASINList.ASIN.1=B00GQLLCTA HTTP/1.1
Host: mws.amazonservices.com
x-amazon-user-agent: AmazonJavascriptScratchpad/1.0 (Language=Javascript)
Content-Type: text/xml
它还会吐出一个 POST URL,我想我可以用它来提取我需要的数据,但是当我把它扔进我的浏览器时我得到了这个:
Sender InvalidParameterValue Action 或 Operation 查询 参数必须存在。
我将如何使用 Python 发送同样的请求?
任何帮助将不胜感激!
谢谢
编辑:
到目前为止,我已经尝试通过发布请求传递以下字典,其中包含暂存器工具中显示的所有参数:
params = {
'AWSAccessKeyId':'<removed>',
'Action':'GetMyPriceForASIN',
'SellerId':'<removed>',
'MWSAuthToken':'amzn.mws.fca4aee8-689d-74a2-5430-128d34f56873',
'SignatureVersion':'2',
'Timestamp':'2016-01-06T04%3A09%3A24Z',
'Version': '2011-10-01',
'Signature':'TZX1AP3dwl%2Fy3y5RLjZGorZFVLtQvW40KJ3IrTmWrw0%3D',
'SignatureMethod':'HmacSHA256',
'MarketplaceId':'<removed>',
'ASINList.ASIN.1':'B004KZQVF4'
}
page = requests.post("https://mws.amazonservices.com", params=params)
虽然我收到了 404 消息:
在此服务器上找不到资源/。 API部分是 缺少或您提供了无效的操作名称。
简答:
假设您可以通过 HTTP GET 使其工作并希望它与 HTTP POST 一起工作,您的 URL 应该只是
/Products/2011-10-01
。省略问号并将 URL 的其余部分(即 AWSAccessKeyId=
及其后的所有内容)放在 POST 请求的正文中。添加一个 Content-Type
标头,值为 application/x-www-form-urlencoded
.
长答案:
我刚遇到同样的问题(我不知道如何让 POST 正常工作)。我正在尝试使用 GetMyFeesEstimate API 调用一次估算 20 个 ASIN 的费用。使用 HTTP GET 我收到错误 414(请求 URI 太大),所以我决定尝试让 HTTP POST 工作。
MWS 文档 仅声明“查询请求是简单的 HTTP 请求,分别在 URL 或 HTTP 主体中使用带有查询参数的 GET 或 POST 方法”,但不清楚具体如何执行此操作。
我在 Amazon SQS 文档 中找到了更多详细信息,展示了如何在正文中构造带有查询参数的 POST 请求。它希望它们经过形式 URL 编码,但我发现只是获取我的 GET 请求的 URL 并将其放入请求正文(如上所述)对我有用(所以也许编码是兼容的,没有仔细检查) .
nonagon 的答案有效,但请注意,您必须将 POST 正文作为字符串发送,而不是字典(注意
Content-Type
是application/x-www-form-urlencoded
,而不是application/json
)
所以你的POST正文应该是这样的:
AWSAccessKeyId=AKIAJEHA562QWNAIEIKA
&Action=GetLowestOfferListingsForASIN
&SellerId=<removed>
&MWSAuthToken=<removed>
&SignatureVersion=2
&Timestamp=2016-01-06T04%3A20%3A48Z
&Version=2011-10-01
&Signature=7vP5dwgpk%2Bi%2Bl1L9tOsd7tVXDeQOoyvjR2fYtEhJCEY%3D
&SignatureMethod=HmacSHA256
&MarketplaceId=<removed>
&ASINList.ASIN.1=B00GQLLCTA
完整的python代码:
url = 'https://mws.amazonservices.jp/Products/2011-10-01'
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
data = <The big string above>
res = requests.post(url, data=body, headers=headers)