- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在向 Walmart Marketplace API 发送批量数据交换的 POST 请求时遇到问题,希望得到一些帮助。
背景:我已经成功地编写了签名验证例程,并且可以成功执行 GET 命令,例如获取产品等。这向我表明身份验证签名的格式正确,并且 header (大部分)是正确的。
问题:我收到 400 Bad Request 响应,请求内容无效。尝试向 Walmarts API 提交测试提要时的响应。我读到这个问题很常见,但我还没有找到任何论坛帖子清楚地解释实际问题或如何解决它。这是我当前的参数:
阿卡 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 工具插件验证 XML 符合沃尔玛提供的 XSD。我看过很多关于需要应用边界的帖子,所以我还尝试更改内容类型并添加边界,但未能成功接受请求。
如果您能帮助我们获得返回响应代码 200 的请求,我们将不胜感激。
最后,一旦此请求在 ARCA 中得到验证,我将在 C# 中实现。我已经编写了所有代码,但是对于如何向 HttpWebRequest 添加附件与仅提交原始数据流相比,我有些模糊。如果可以就差异提供任何说明,我会再次表示感谢。
最佳答案
所以这个答案不是干净和优雅的,更多的是变通。我与沃尔玛工程团队内部的一些人进行了交谈,并被告知 C# SDK 应该会在接下来的几个月内推出。
经过我的所有研究,您向沃尔玛提交多部分表格的方式似乎有一些技巧,而且系统非常不灵活。我看过一些关于在 HTTP 请求正文中添加特定格式的边界的帖子,但没有这样的运气。我无法将正文作为文件或数据流附加到请求中。
解决方法非常简单,不幸的是很难看。它需要一些设置,但您可以围绕 Walmart Java SDK 创建一个 .jar 包装器并从您的 .Net 程序中调用它。
所以..过程中的步骤:
动态生成一个批处理文件来调用您的 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)
来测试提交是否成功
我会第一个说我迫不及待地想用 Walmart 待定的 C# SDK 替换这项工作,但目前,这是我能够提交的唯一方式。我已经深入查看了 walmart 代码,但不幸的是,在文件附件的幕后发生了一些 Java 魔术,因此实际上没有任何方法可以访问 C# 的确切过程和逆向工程。我认为真正了解 Java 内外的人可以解决这个问题,但我有足够的 Java 背景,可以拼凑出一个可行的解决方案,尽管它很丑陋。
关于c# - 沃尔玛 API POST 因 400 错误请求(库存提要)ARCA 而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43282583/
我正在尝试从该网站抓取历史天气数据: http://www.hko.gov.hk/cis/dailyExtract_uc.htm?y=2016&m=1 在阅读了 AJAX 调用后,我发现请求数据的正确
我有两个 postman 请求 x,y,它们命中了两个不同的休息 api X,Y 中的端点。 x 会给我一个身份验证 token ,这是发出 y 请求所必需的。如何在请求 y 中发出请求 x ?也就是
我使用请求库通过 API 与其他服务器进行通信。但现在我需要同时发送多个(10 个或更多)POST 请求,并且只有在所有响应都正确的情况下才能进一步前进。通常语法看起来有点像这样: var optio
背景:当用户单击按钮时,其类会在class1和class2之间切换,并且此数据是通过 AJAX 提交。为了确认此数据已保存,服务器使用 js 进行响应(更新按钮 HTML)。 问题:如果用户点击按钮的
我正在将 Node.js 中的请求库用于 Google 的文本转语音 API。我想打印出正在发送的请求,如 python example . 这是我的代码: const request = requi
我经常使用requests。最近我发现还有一个 requests2 和即将到来的 requests3 虽然有一个 page其中简要提到了 requests3 中的内容,我一直无法确定 requests
我正在尝试将图像发送到我的 API,然后从中获取结果。例如,我使用发送一个 bmp 图像文件 file = {"img": open("img.bmp)} r = requests.post(url,
我发现 Google Cloud 确保移出其物理环境的任何请求都经过强制加密,请参阅(虚拟机到虚拟机标题下的第 6 页)this link Azure(和 AWS)是否遵循类似的程序?如果有人能给我指
我有一个 ASP.NET MVC 应用程序,我正在尝试在 javascript 函数中使用 jQuery 来创建一系列操作。该函数由三部分组成。 我想做的是:如果满足某些条件,那么我想执行同步 jQu
我找不到如何执行 get http 请求,所以我希望你们能帮助我。 这个想法是从外部url(例如 https://api.twitter.com/1.1/search/tweets.json?q=tw
我的应用只需要使用“READ_SMS”权限。我的问题是,在 Android 6.0 上,当我需要使用新的权限系统时,它会要求用户“发送和查看短信”。 这是我的代码: ActivityCompat.re
我的前端代码: { this.searchInput = input; }}/> 搜索 // search method: const baseUrl = 'http://localho
我有一个由 AJAX 和 C# 应用程序使用的 WCF 服务, 我需要通过 HTTP 请求 header 发送一个参数。 在我的 AJAX 上,我添加了以下内容并且它有效: $.ajax({
我正在尝试了解如何使用 promises 编写代码。请检查我的代码。这样对吗? Node.js + 请求: request(url, function (error, response, body)
如果失败(除 HTTP 200 之外的任何响应代码),我需要重试发送 GWT RPC 请求。原因很复杂,所以我不会详细说明。到目前为止,我在同一个地方处理所有请求响应,如下所示: // We
当用户单击提交按钮时,我希望提交表单。然而,就在这种情况发生之前,我希望弹出一个窗口并让他们填写一些数据。一旦他们执行此操作并关闭该子窗口,我希望发出 POST 请求。 这可能吗?如果可能的话如何?我
像 Facebook 这样的网站使用“延迟”加载 js。当你必须考虑到我有一台服务器,流量很大时。 我很感兴趣 - 哪一个更好? 当我一次执行更多 HTTP 请求时 - 页面加载速度较慢(由于限制(一
Servlet 容器是否创建 ServletRequest 和 Response 对象或 Http 对象?如果是ServletRequest,谁在调用服务方法之前将其转换为HttpServletReq
这是维基百科文章的摘录: In contrast to the GET request method where only a URL and headers are sent to the serv
我有一个循环,每次循环时都会发出 HTTP post 请求。 for(let i = 1; i console.log("succes at " + i), error => con
我是一名优秀的程序员,十分优秀!