我正在尝试连接到亚马逊MWS API。我有这些信息: String accessKeyId =“”; String secretAccessKey =“”; String merchantId =“”; String marketplaceId =“”; 我在vs2012 C#中创建了一个Web表单,点击按钮添加了上面的变量但是如何添加对marketplacewebservice的引用?我想获得那里列出的产品的销售信息。我是否需要添加一些文件,是否有任何需要添加的文件/ dll。 请指教。
编辑:我已经下载了这个MWSOrdersCSharpClientLibrary-2013-09-01。 V293335039 ,并从dist文件夹中添加了两个dll。以下是获取订单详细信息的其他代码:
private void GetOrders()
{
MarketplaceWebServiceOrdersConfig config = new MarketplaceWebServiceOrdersConfig();
config.ServiceURL = "https://mws.amazonservices.com/Orders/2011-01-01";
MarketplaceWebServiceOrdersClient service = new MarketplaceWebServiceOrdersClient(accessKeyId, secretAccessKey, applicationName, applicationVersion, config);
ListOrdersRequest request = new ListOrdersRequest();
request.SellerId = sellerID;
List<string> mpiList = new List<string>();
mpiList.Add(marketplaceId);
request.MarketplaceId = mpiList;
request.LastUpdatedAfter = DateTime.UtcNow.AddDays(-1);
bool retryRequest = true;
do
{
try
{
ListOrdersResponse response = new ListOrdersResponse();
response = service.ListOrders(request);
if (response.IsSetListOrdersResult())
{
if (response.ListOrdersResult.IsSetOrders())
{
foreach (Order order in response.ListOrdersResult.Orders)
{
Response.Write(order.AmazonOrderId);
}
}
}
retryRequest = false;
}
catch (MarketplaceWebServiceOrdersException ex)
{
if (ex.ErrorCode.Contains("RequestThrottled"))
{
retryRequest = true;
System.Threading.Thread.Sleep(60000);
}
}
} while (retryRequest == false);
}
这不会返回任何订单详情,实际上会进入油门错误。
答案 0 :(得分:2)
使用Amazon .NET SDK。下载有一些教程和示例文件,将指导您如何连接并完成所有这些'初始设置'。请查看以下链接以下载SDK。完成本教程后,我们可以提供更具体的问题。
您需要使用订单或报告API来访问销售信息。从长远来看,您需要使用报告API,因为使用Orders API很难获取大量数据,但是当您开始使用时,Orders API更容易学习。那么..我会开始使用Orders API,然后在您了解系统的工作原理后再转到Reports API。
下载C#客户端库并查看src / MarketplaceWebServiceOrders / MarketplaceWebServiceOrdersSample.cs
在上述文件中,您可能需要试用InvokeGetOrder()
只需将相关密钥添加到accessKey
,secretKey
,将您的SellerID添加到InvokeGetOrder()函数和mwsAuthToken如果你有一个。 (如果您没有身份验证令牌,那么您可能已经被禁用,只需从代码中删除mwsAuthToken行。)
完成所有这些后,您只需提供amazonOrderID,该函数将检索与该订单相关的详细信息。 InvokeListOrders()
是开始学习的另一个好功能。
<强> 修改 强>
一旦掌握了示例程序,就可以将提供的DLL添加到自定义项目中,并且可能需要添加任何示例源以帮助构造函数调用中使用的各种对象。
编辑
好的..我看到的第一件事是你的serviceURL不正确。对于实际网站,请使用https://mws.amazonservices.com
看来你的其余代码形式非常好。我会在捕获物上放置一个断点,并确切地看到发生了什么。如果服务异常没有受到限制,你的例程将会自由转动,直到你达到你所看到的节流上限,但在你节流之前应该有多次捕获。 Exception.Message
将提供有关问题的信息。
此外,我会在任何条件之外的do-while循环中放置Thread.Sleep
。如果没有某种睡眠来减慢常规,你将很快超过允许的限制限制。只是fyi,处理限制可能是与亚马逊有效沟通最困难的部分。我通常实际上允许油门发生并执行以下操作:
try
{
response = _service.GetReportListByNextToken(request);
}
catch (MarketplaceWebServiceException ex)
{
bool success = false;
for (int i = 0; i < 5 && !success; i++)
{
System.Threading.Thread.Sleep(3000);
try
{
response = _service.GetReportListByNextToken(request);
success = true;
}
catch (MarketplaceWebServiceException newEx)
{
success = false;
}
}
if (response == null)
{
Console.WriteLine("GetReportListByNextToken failed. Exceeded Throttling limits.");
//Don't throw an error, since there may be reports that we still want to process.
}
}
请记住,每次睡眠都取决于您正在执行的呼叫。此外,有时,我会有两个独立的睡眠,具体取决于错误是否与限制有关。
<强> 修改 强>
它看起来类似于以下内容(集成到原始代码示例中)
private void GetOrders()
{
MarketplaceWebServiceOrdersConfig config = new MarketplaceWebServiceOrdersConfig();
config.ServiceURL = "https://mws.amazonservices.com/";
MarketplaceWebServiceOrdersClient service = new MarketplaceWebServiceOrdersClient(accessKeyId, secretAccessKey, applicationName, applicationVersion, config);
ListOrdersRequest request = new ListOrdersRequest();
request.SellerId = sellerID;
List<string> mpiList = new List<string>();
mpiList.Add(marketplaceId);
request.MarketplaceId = mpiList;
request.LastUpdatedAfter = DateTime.UtcNow.AddDays(-1);
bool retryRequest = true;
ListOrdersResponse response = new ListOrdersResponse();
try
{
response = service.ListOrders(request);
}
catch (MarketplaceWebServiceException ex)
{
bool success = false;
for (int i = 0; i < 5 && !success; i++)
{
System.Threading.Thread.Sleep(30000);
try
{
response = service.ListOrders(request);
success = true;
}
catch (MarketplaceWebServiceException newEx)
{
success = false;
}
}
if (response == null)
{
Console.WriteLine("ListOrders failed. Exceeded Throttling limits.");
//Don't throw an error, since there may be reports that we still want to process.
}
}
if (response.IsSetListOrdersResult())
{
if (response.ListOrdersResult.IsSetOrders())
{
foreach (Order order in response.ListOrdersResult.Orders)
{
Response.Write(order.AmazonOrderId);
}
}
}
}
这是您需要实施的内容的概述。基本上你将try-catch放在任何可以向amazon发出请求的函数调用周围,并将sleep函数调整为函数调用的限制要求。我把一个30秒的睡眠放入捕获,因为这个调用有60秒的刷新,我们基本上有6个周期来允许调用不被限制,所以它应该在最多2次函数调用时点击限制然后去通过成功。根据您的应用程序,这可能需要调整到接近60秒或更低,这取决于您需要程序的响应程度(想想如果您在刷新前1秒钟达到限制,那么您可能有最长的等待时间睡眠时间为30分钟1.5分钟,而如果您使用15秒,则最长等待时间约为1.25分钟。您必须平衡这一点,因为您不希望亚马逊请求(以及电话有每小时限制,所以你真的不想达到这个限制。)