2016-03-15 256 views
1

我正在嘗試連接到亞馬遜MWS API。我有這些信息與我: String accessKeyId =「」; String secretAccessKey =「」; String merchantId =「」; String marketplaceId =「」; 我在vs2012 C#中創建了一個web表單,並在按鈕點擊時添加了上述變量,但是如何添加對marketplacewebservice的引用?我想要了解我那裏列出的產品的銷售信息。我是否需要添加一些文件,是否有任何由他們提供的需要添加的文件/ dll。 請指教。連接到亞馬遜MWS

編輯:我已經下載了這個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); 

    } 

這不會返回任何訂單明細,實際上會進入節流錯誤。

回答

2

使用Amazon .NET SDK。下載有一些教程和示例文件,它們將指導您如何連接並執行所有這些「初始設置」。查看下面的鏈接以下載SDK。一旦你完成了教程,我們可以幫助你解決更具體的問題。

您將需要使用訂單或報告API來訪問銷售信息。長期來看,您會希望使用報告API,因爲使用Orders API很難獲取大量數據,但訂購API在您初始時更容易學習。所以..我會開始使用Orders API,然後在您對系統工作方式有所瞭解之後再轉到Reports API。

Orders API Libraries

下載C#的客戶端庫,並檢查了SRC/MarketplaceWebServiceOrders/MarketplaceWebServiceOrdersSample.cs

在上述文件中,你可能會想嘗試InvokeGetOrder()只需在您的相關項添加到accessKeysecretKey ,將你的SellerID添加到InvokeGetOrder()函數中,如果有的話,添加一個mwsAuthToken。 (如果您沒有身份驗證令牌,則可能已經過時,只需從代碼中刪除mwsAuthToken行)。

完成所有工作後,您只需提供一個amazonOrderID,該函數將檢索與該訂單相關的詳細信息。 InvokeListOrders()是開始學習的另一個好功能。

編輯

一旦你的示例程序的竅門,你可以添加所提供的DLL到您的自定義項目,任何樣本來源的你可能需要添加,以幫助構建各種在函數調用中使用的對象。

編輯

我看行..的第一件事是你的serviceURL不正確。對於直播網站,請使用https://mws.amazonservices.com

看來您的代碼的其餘部分格式完好。我會在捕獲物上設置一個斷點,並確切知道發生了什麼。如果服務異常沒有被限制,你的例程將會自由旋轉,直到你點擊節流帽,這是你所看到的情況,但是在節流之前應該有多個節拍。 Exception.Message將提供有關問題的信息。

此外,我會將Thread.Sleep置於任何條件之外的do-while循環中。如果沒有某種睡眠來減緩日常工作,你將很快超過允許的限制範圍。簡單地說,處理節流可能是有效溝通亞馬遜的最難的部分。我通常實際上允許發生油門,像下面做一些事情:

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秒鐘進行節流,那麼您可以有最長的等待時間如果你使用15秒鐘,你的最長等待時間約爲1.25分鐘,你必須平衡這一點,因爲你不想讓亞馬遜滿足要求(和一些電話有小時限制,所以你真的不想達到這個限制)

+0

感謝Nate M的回覆我已經下載了他們的c#api的命令,並在我的代碼中添加了dll,然後我創建了一個函數已經添加了上面的內容,但仍然無法看到任何訂單信息 – user1254053

+0

查看您的代碼,並會稍後與您取得聯繫 –

+0

Nate M,謝謝,請分享您的f ull代碼 - 我需要把這個你上面寫的這個嘗試放在哪裏。 – user1254053