2017-04-07 38 views
1

我對用於批量數據交換的沃爾瑪Marketplace API的POST請求存在問題,希望得到一些幫助。沃爾瑪API POST失敗,出現400錯誤請求(庫存Feed)ARCA

背景: 我已經成功地寫簽名認證程序,並能成功執行GET如獲得產品的命令等。這表明,我認爲驗證簽名的格式正確,和標題(大部分)是正確的。

問題: 我收到一個400錯誤請求響應,請求內容無效。嘗試向Walmarts API提交測試饋送時的響應。我已經讀過這個問題很常見,但我還沒有找到明確解釋實際問題的論壇帖子,或者如何解決這個問題。這裏是我當前的參數:

ARCA ARCA Rest Client For Chrome

網址:

https://marketplace.walmartapis.com/v2/feeds?feedType=inventory 

頁眉:

Accept: application/xml 
WM_SVC.NAME: Walmart Marketplace 
WM_CONSUMER.ID: <Consumer ID> 
WM_SEC.AUTH_SIGNATURE: <Good Auth Signature> 
WM_QOS.CORRELATION_ID: 15649814651 
WM_SEC.TIMESTAMP: <Timestamp> 
WM_CONSUMER.CHANNEL.TYPE: <Channel Type> 
Content-Type: multipart/form-data 

文件附件(而不是原始的有效載荷雖然已經試過)

<?xml version="1.0" encoding="utf-8"?> 
<InventoryFeed xmlns="http://walmart.com/"> 
    <InventoryHeader> 
    <version>1.4</version> 
    </InventoryHeader> 
    <inventory> 
    <sku>KON04418</sku> 
    <quantity> 
     <unit>EACH</unit> 
     <amount>4</amount> 
    </quantity> 
    <fulfillmentLagTime>1</fulfillmentLagTime> 
    </inventory> 
</InventoryFeed> 

當我採用這個完全相同的XML並在Walmart API Explorer 上測試時,該文件被接受,響應代碼爲200(OK)。

我使用Notepad ++ XML Tools插件驗證了XML符合由Walmart提供的XSD。我已經看到許多關於需要應用邊界的帖子,所以我另外嘗試更改Content-Type,並添加邊界,但在接受請求方面不成功。

任何幫助獲取此請求返回響應代碼200將不勝感激。

最後,一旦這個請求在ARCA中驗證,我將在C#中實現。我已經編寫了所有的代碼,但是對於如何將附件添加到HttpWebRequest與僅提交原始數據流有點模糊。如果可以提供有關差異的任何清晰度,我會再次感謝。

回答

0

所以這個答案並不乾淨和優雅,更多的是一個工作比任何東西。我曾與沃爾瑪工程團隊中的幾個人談過,並被告知C#SDK應該在未來幾個月內即將面世​​。

經過我所有的研究,似乎有一些技巧,你如何提交一個多部分形式的沃爾瑪和系統是非常僵化。我已經看過關於在HTTP請求的主體中添加特定格式邊界的帖子,但沒有這樣的運氣。我無法將文本作爲文件或作爲數據流附加到請求中。

解決方法很簡單,很不幸。它需要一些設置,但是您可以圍繞沃爾瑪Java SDK創建一個.jar包裝並從您的.Net程序中調用它。

因此..在這個過程中的步驟:

  • 抓住適當的.XSD文件,並從它們生成C#類。
  • 構建格式正確的XML清單文件。確保包含命名空間!如果您沒有包含適當的ns2/ns3名稱空間,沃爾瑪將會失敗。
  • 動態生成一個批處理文件來調用你的Java模塊。直接產生一個命令行進程似乎讓某些事情變得怪異,所以我選擇了批處理文件。

    string path = @Directory.GetParent(Environment.CurrentDirectory).ToString(); 
    
        if (File.Exists(@"../inventory.bat")) 
        { 
         File.Delete(@"../inventory.bat"); 
        } 
    
        string batchCommand = @"cd " + path + Environment.NewLine + @"java -jar WalmartWrapper.jar SubmitInventoryFeed inventoryFeed.xml"; 
        File.WriteAllText(path + @"\\inventory.bat", batchCommand); 
    
        ProcessStartInfo info = new ProcessStartInfo(); 
        info.UseShellExecute = true; 
        info.FileName = @"inventory.bat"; 
        info.WorkingDirectory = path; 
        var p = Process.Start(info); 
        p.WaitForExit();` 
    
  • 從這裏,Java模塊接管。花了黑客周圍,使其工作更像一個SDK,並不太像一個示例程序的位..下面是一些示例代碼爲使事情工作..

  • 切入點

    if ("SubmitInventoryFeed".equals(args[0].trim())) { 
        if (args.length < 2) 
        { 
         System.out.println("Need second argument for SubmitInventoryFeed"); 
         return; 
        } 
        String filename = args[1]; 
        Feed inventoryFeed = new Feed(); 
        try 
        { 
         inventoryFeed.submitInventoryFeed(filename); 
        } catch (Exception ex) { 
         System.out.println("submitInventoryFeed failed: " + ex.getMessage()); 
        } 
    } 
    
  • SDK調用(這是submitInventoryFeed的裸露的骨頭沒有錯誤檢查)

    String path = Paths.get(".").toAbsolutePath().normalize().toString(); 
    File itemFile = FileHandler.getFile(filename.trim()); 
    String filePath = path + "\\" + "MarketplaceClientConfig.properties"; 
    WalmartMarketplace wm = Utils.getClient(filePath); 
    Response response = wm.submitFeed(MarketplaceFeedType.inventory, itemFile); 
    
  • 您可以使用ResponseChecker.isResponse200(response, true)測試成功提交

  • 使用FeedAcknowledgement ack = response.readEntity(FeedAcknowledgement.class);抓住實際的響應來檢查錯誤

我會第一個說我迫不及待地想用沃爾瑪的C#SDK取代這個工作,但暫時,這是唯一的方法我已經能夠提交。我深入瞭解了沃爾瑪的代碼,但不幸的是,有一些Java魔法發生在文件附件之下,因此沒有任何方法可以訪問C#的確切過程和反向工程。我認爲一個真正認識Java的人可以搞清楚,但是我有足夠的Java背景讓我可以拼湊出一個可行的,但是很醜的解決方案。

相關問題