REST (PHP, CURL) PUT/POST XML 问题:400 个错误请求,"Invalid URL" 使用沃尔玛 OAuth API 的响应(邮递员进行测试)



这里有很多东西需要解开。首先,我已经编辑了标题,因为我意识到虽然最终我的 REST 请求将实现到 PHP 代码中,但现在我已经将其剥离到 Postman 以测试仅 REST,所以我将其剥离尽可能低和基本。我可以正式地说问题出在我的请求上。

基本上,我正在发出POST请求,并使用"新"OAuth身份验证对沃尔玛API的PUT请求进行测试。听起来很宏伟。GET在Postman和我的实际PHP代码中工作得很好。POST 和 PUT 立即返回完全相同的错误,无论我做什么以及如何做:400 错误请求,无效 URL。在我的 PUT 测试中,我正在这样做,因为它是一个更简单、更快的文本,需要尝试梳理的 XML 要少得多,以下是 HTML 标头中的确切响应:

<HTML>
<HEAD>
<TITLE>Invalid URL</TITLE>
</HEAD>
<BODY>
<H1>Invalid URL</H1>
The requested URL "http&#58;&#47;&#47;&#37;5bNo&#37;20Host&#37;5d&#47;v3&#47;inventory&#63;", is invalid.
<p>
Reference&#32;&#35;9&#46;c9384317&#46;1556319123&#46;8c89b8dc
</BODY>
</HTML>

我已经通过我的服务器离开了 PHP 测试,并进入了 Postman 以尝试找到我遇到的确切问题,并且 GET 请求运行良好。我每 15 分钟左右生成一个新令牌。我做过...所以有很多小的变化,但 Feed 示例和请求的工作方式,就我所能说的我做对了。老实说,我认为我现在正在失去我的弹珠。

最让我沮丧的是GET有效。我的令牌正在工作。我的 OAuth 工作正常。GET用于沃尔玛API的许多标头在PUT/POST/GET之间完全相同。这里的区别仅在于链接具有查询参数和 XML 被推入正文。编辑:我的意思是我的标头在GET和POST之间不会更改;我提供的内容唯一改变的是 XML 正在正文中发送,并且需要查询参数。这是在成功的 GET 和不成功的 400 错误请求 PUT/POST 之间唯一变化的事情。这让我相信我处理查询参数或 XML 的方式有问题,但考虑到在下面的示例中,我已经复制/粘贴了 XML......我不确定。这是我们目录中的现有项目,我知道一个事实。

注意到的一点是,我没有足够的知识来知道这是否是邮递员的问题,因为沃尔玛的API要求内容类型是多部分/表单数据。我注意到它在陈述这一点时使用术语"示例",但是,如果它接受其他内容,它通常会说"这个或这个"。但是,如果我在Postman中将内容类型切换到多部分/表单数据,则正文会自动变为原始:文本而不是原始:XML(application/xml)或text/xml。如果我尝试将原始内容交换为这些类型,它会自动将我的内容类型翻转为应用程序/xml,所以这有点...嘻嘻哈哈。

我没有通过代理。我已关闭全局代理配置并使用系统代理。请求超时设置为 0。没有客户端证书。我的意思是,GET有效,我的令牌是通过外部PHP代码成功生成的(不是在Postman中,无法让它工作,说哎呀)。

PUT URL: https://marketplace.walmartapis.com/v3/inventory?sku=0xyz0

授权

Bearer Token: Bearer Basic --insert token here--
WM_SVC.NAME: Walmart Marketplace
WM_QOS.CORRELATION_ID: randomString123
WM_SEC.ACCESS_TOKEN: --insert token here--
Accept: application/xml
Host: https://marketplace.walmartapis.com
Content-type: multipart/form-data

身体 原始:XML(application/xml)

<?xml version="1.0" encoding="UTF-8"?>
<inventory xmlns="http://walmart.com/">
<sku>0xyz0</sku>
<quantity>
<unit>EACH</unit>
<amount>7</amount>
</quantity>
<fulfillmentLagTime>1</fulfillmentLagTime>
</inventory>

准确响应

400 Bad Request
<HTML>
<HEAD>
<TITLE>Invalid URL</TITLE>
</HEAD>
<BODY>
<H1>Invalid URL</H1>
The requested URL "http&#58;&#47;&#47;&#37;5bNo&#37;20Host&#37;5d&#47;v3&#47;inventory&#63;", is invalid.
<p>
Reference&#32;&#35;9&#46;c9384317&#46;1556320429&#46;8ca752c4
</BODY>
</HTML>

请发送帮助,我想我已经盯着这个很长时间了,我要把这个物理世界抛在脑后。沃尔玛最近将他们的身份验证更新为 OAuth,他们含糊其辞地说他们的旧身份验证将被弃用并逐步淘汰,所以我显然想尝试让它工作。我试图尽可能地复制粘贴所有内容。该XML几乎是从他们的示例中逐个字母复制粘贴的,并切换了我自己的产品。

此外,每次我运行它时,那里的参考编号总是会发生变化,因此我实际上无法查找。我只提供了邮递员方面的东西,因为坦率地说,如果我能让它工作,我的 PHP 会很好,我已经在成功的 GET 请求中解决了一些小问题。

如果是分号问题,我会尖叫。

API 文档:https://developer.walmart.com/#/apicenter/marketPlace/latest#updateInventoryForAnItem

嗯,我已经想通了。

您会注意到我需要为我的标头提供一个"主机"。该主机正在替换我尝试通过 POST/PUT/GET 连接的 URl,因此如果我的主机 https://marketplace.walmartapis.com,则我的请求 URL https://https://marketplace.walmartapis.com。

一旦我把 https://从主持人那里拿走,整个事情给了我200的回应。当我得到正确的GET响应时,我实际上在没有HTTPS的情况下复制粘贴了正确的HOST,所以我在两个单独的测试用例之间完全错过了这一点。

最新更新