为什么亚马逊MWS订单API没有为我提供速率限制标头?

时间:2018-01-31 12:06:46

标签: php amazon-web-services curl

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: 

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

作为旁注,除了限制之外,我不会认为每小时的请求限制,因为它表示它仅适用于产品,报告和Feed中的API上面链接的限制文档。最后一点是,我们不使用代理并直接从PHP脚本连接到Amazon服务器。

1 个答案:

答案 0 :(得分:1)

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

我想这同样适用于PHP客户端。

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

  • 首先从亚马逊获取客户端代码;
  • 在[SomeAmazonOperationResponse]上创建3个新的字符串属性。 ResponseHeaderMetadata 类,这些属性应与您要获取的参数相对应: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”))
  • 现在您应该可以访问响应中新填充的参数值
  • 享受