【问题标题】:Why isn't the Amazon MWS Order API giving me rate limiting headers?为什么亚马逊 MWS 订单 API 没有给我限速标头?
【发布时间】:2018-07-10 12:57:51
【问题描述】:

tl;博士

为什么亚马逊对我的 API 调用的响应中总是省略 x-mws-quota-maxx-mws-quota-remainingx-mws-quota-resetsOn 标头?


我们在订单导入器中收到请求限制异常,我似乎无法弄清楚为什么,或者至少为什么我们看不到任何限制标头。

我们请求 MWS 订单 API。首先,我们使用ListOrders 操作列出订单,然后对于每个订单,我们通过ListOrderItems 操作获取项目详细信息,然后我们在内部将其用于库存和报告等内容。我们使用 Marketplace Web 服务订单 PHP SDK (@version 2013-09-01) 来执行此操作,并在每天每 15 分钟运行一次的 cron 作业上运行它,每个请求都将其拉取的订单范围限制为仅检索自上次以来的订单cron 实例运行。

documentation about throttlingAPI documentation 本身中,它谈到了标题项目以提供有关您的使用情况的反馈。例如:

x-mws-quota-max: 3600
x-mws-quota-remaining: 10
x-mws-quota-resetsOn: Wed, 06 Mar 2013 19:07:58 GMT

但是,我们的所有请求都没有返回此数据。当我尝试getQuotaMax() 和来自ResponseHeaderMetadata 对象的其他getter 时,它们都返回null。如果我直接转储 curl 请求,我会得到以下信息:

HTTP/1.1 200 OK
Server: Server
Date: Wed, 31 Jan 2018 10:30:20 GMT
Content-Type: text/xml
Content-Length: 182649
Connection: keep-alive
X-Amz-Date: Wed, 31 Jan 2018 10:30:20 GMT
x-amzn-Authorization: AAA SignedHeaders=X-Amz-Date, identity=com.amazon.aaa.MarketplaceWebServiceOrders.AndromedaControlService.amzn1.aaa.id.lwigtwr3h4inoeknjer76q4tl4.Default/1, Signed=true, Encrypted=false, Signature=M/AAAAexATrzvpAAAAAKJIK9mkwsBjPryIWcvnAAAAA=, Algorithm=HmacSHA256
x-mws-request-id: 9f4f29a2-aaaa-4eca-9c7a-8023bea06fab
x-mws-timestamp: 2018-01-31T10:30:19.677Z
x-mws-response-context: aaaaaLSsB3L83dPqsIYmrA3VnhhMZypSJ2yQ9sxK//zDuOBUUuCyYdPzCiDrgrrzqw/BJLbPVAo=
Vary: Accept-Encoding,User-Agent

<?xml version="1.0"?>
<ListOrdersResponse xmlns="https://mws.amazonservices.com/Orders/2013-09-01">
  <ListOrdersResult>
    <Orders>
      ...

在每晚的 cron 作业中捕获的异常似乎证实了 a) 节流是问题,b) 我们没有收到任何回复:

Caught Exception: Request is throttled
Response Status Code: 503
Error Code: RequestThrottled
Error Type: Unknown
Request ID: 94a816fd-d7cb-aaaa-9c46-d97ef4b338b1
XML: <?xml version="1.0"?>
<ErrorResponse xmlns="https://mws.amazonservices.com/Orders/2013-09-01">
  <Error>
    <Type></Type>
    <Code>RequestThrottled</Code>
    <Message>Request is throttled</Message>
  </Error>
  <RequestID>94a816fd-d7cb-aaaa-9c46-d97ef4b338b1</RequestID>
</ErrorResponse>

ResponseHeaderMetadata: RequestId: 94a816fd-d7cb-44a5-9c46-d97ef4b338b1, ResponseContext: Yzi1erdrrVZuGBzvtiUxd/94+Mj6QcN9BJReTcsg+MkelvfcYETwNjBER3CWqNhmA87P6n7sTq8=, Timestamp: 2018-01-30T22:00:59.545Z, Quota Max: , Quota Remaining: , Quota Resets At: 

我们以前从未遇到过这个问题,但现在我们正在亚马逊上进行更多销售,这是不可避免的。但是,在实际获取节流标头方面,我是否遗漏了一些明显的东西,以便我可以实际采取对策?

作为旁注,我不认为每小时请求限制,除了节流,这里适用,因为它说它只适用于上面链接中的产品、报告和提要 API节流文档。最后一点是我们没有使用代理,而是直接从 PHP 脚本连接到 Amazon 服务器。

【问题讨论】:

  • 解决同样的问题,据我所知,只有在服务具有每小时配额时才会发送这些标头。就我个人而言,我在 30 秒时踩油门,而我目前从 60 秒开始每次降低 100 毫秒。
  • 我知道这是个老问题,但是 - 你是怎么解决这个问题的?

标签: php amazon-web-services curl


【解决方案1】:

不确定 PHP MWS 客户端,但 C# 客户端实际上并没有从 ResponseHeader 中获取这些参数。因此,您需要自己修改 MWS 客户端代码,以便专门掌握这些响应头参数。

我想这对于 PHP 客户端也是如此。

为了获得这些响应参数,需要在 C# MWS 客户端中进行更改:

  • 首先从亚马逊获取客户端代码;
  • 在 [SomeAmazonOperationResponse].ResponseHeaderMetadata 类上创建 3 个新的字符串属性,这些属性应与您要获取的参数相对应:x-mws-quota-max、x-mws-quota-剩余和 x-mws-quota-resetsOn;您可以将属性命名为 QuotaMax、QuotaRemaining 和 QuotaResetsOn;
  • 修改ResponseHeaderMetadata的构造函数以接收和初始化这些属性。
  • 转到 MarketplaceWebServiceClient.Invoke() 方法,确定获取 HttpWebResponse 的确切位置,并在初始化 ResponseHeaderMetadata 对象(可能是一个名为 rhm 的 var)时,确保在 ctor 中指定新参数(以及每个其中应以类似于以下方式获取:httpResponse.GetResponseHeader("x-mws-quota-max"))
  • 现在您应该可以访问响应中参数的新填充值
  • 享受

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多