繁体   English   中英

对亚马逊 MWS API 的 Python HTTP POST 请求

[英]Python HTTP POST Request to Amazon MWS API

我没有太多处理 API 的经验,而且在使用 Python 发出 HTTP POST 请求方面还很陌生。 想知道是否有人可以帮我解决这个问题。

他们提供了这个工具来手动访问数据,但我希望使用 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 请求的正文中。 添加值为application/x-www-form-urlencodedContent-Type标头。

长答案:

我刚刚遇到了同样的问题(我不知道如何让 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-Typeapplication/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

完整的蟒蛇代码:

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM