Python HTTP POST 请求到亚马逊 MWS API

问题描述 投票:0回答:2

我没有太多处理 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部分是 缺少或您提供了无效的操作名称。

python-3.x post python-requests
2个回答
2
投票

简答:

假设您可以通过 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 并将其放入请求正文(如上所述)对我有用(所以也许编码是兼容的,没有仔细检查) .


0
投票

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)
© www.soinside.com 2019 - 2024. All rights reserved.