Walmart API POST失败,400 Bad Request(库存Feed)ARCA

时间:2017-04-07 16:02:48

标签: c# rest http http-status-code-400 walmart-api

我遇到了向Walmart Marketplace API发送POST请求以进行批量数据交换的问题,并希望得到一些帮助。

背景 我成功地编写了签名身份验证例程,并且可以成功执行GET命令,例如获取产品等。这向我表明身份验证签名格式正确,标题(大部分)都是正确的。

问题: 我收到400 Bad Request响应,请求内容无效。尝试向Walmarts API提交测试Feed时的响应。我已经读过这个问题很常见,但是我还没有找到任何能够清楚地解释实际问题或者如何修复问题的论坛帖子。以下是我目前的参数:

ARCA ARCA Rest Client For Chrome

URL:

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,并添加Boundaries但是却没有成功接收请求。

获得此请求以返回响应代码200的任何帮助将不胜感激。

最后,一旦此请求在ARCA中验证,我将在C#中实现。我已经编写了所有代码,但是对于如何向HttpWebRequest添加附件而不仅仅是提交原始数据流有点模糊。如果可以提供差异的任何清晰度,我会再次,欣赏它。

1 个答案:

答案 0 :(得分:0)

所以这个答案并不干净优雅,更像是一件事而已。我已经与沃尔玛工程团队内部的一些人进行了交谈,并且被告知在未来几个月内即将推出C#SDK。

在我完成所有研究之后,似乎有一些技巧可以向沃尔玛提交多部分表格并且系统非常不灵活。我已经看过有关在HTTP请求正文中添加特定格式边界的帖子,但没有这样的运气。我无法将正文作为文件或作为请求的数据流附加。

工作非常简单,不幸的是丑陋。这需要一些设置,但您可以围绕Walmart Java SDK创建一个.jar包装器,并从您的.Net程序中调用它。

所以......过程中的步骤:

  • 抓取相应的.XSD文件并从中生成C#类。
  • 构建格式正确的XML库存文件。确保包含命名空间!!如果您没有包含适当的ns2 / ns3命名空间,Walmart将无法通过特定的呼叫。
  • 动态生成批处理文件以调用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背景来让我能够拼凑出一个可行的,虽然难看的解决方案。