REST (PHP, CURL) PUT/POST XML 问题:400 错误请求,"Invalid URL" 对 Walmart OAuth API 的响应(要测试的邮递员)

REST (PHP, CURL) PUT/POST XML Issue: 400 Bad Request, "Invalid URL" Response with Walmart OAuth API (Postman to test)

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

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

<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 的很多 headers 在 PUT/POST/GET 之间完全相同。这里的区别仅在于 link 具有查询参数并且 XML 被推入 body。编辑:我的意思是我的 headers 在 GET 和 POST 之间没有变化;我提供的唯一变化是 XML 在 body 中发送,并且需要查询参数。这是成功的 GET 和不成功的 400 错误请求之间唯一的变化 PUT/POST。这让我相信我处理查询参数或我的 XML 的方式有问题,但考虑到在下面的示例中我有 copy/pasted XML...我不确定。这是我们目录中的现有项目,我知道事实。

注意到 我不太了解 Postman 是否有问题是沃尔玛的 API 要求 content-type 为 multipart/form-data。我注意到它在说明这一点时使用了术语 "example",但是,如果它接受其他内容,它通常会说 "this or this"。但是,如果我将 Postman 中的 content-type 切换为 multipart/form-data,Body 会自动变为 raw: text 而不是 raw: XML(application/xml) 或 text/xml。如果我尝试将 raw 交换为那些类型,它会自动将我的 content-type 翻转为 application/xml,所以这有点...hinky。

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

HEADERS

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

BODY 原始: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,他们含糊其辞地说他们的旧身份验证将被弃用并逐步淘汰,所以我显然想尝试将其添加到 work.I 尝试复制粘贴所有内容可能的。 XML 几乎是他们例子中的 copy-pasted 个字母,我自己的产品已打开。

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

如果这是 semi-colon 问题,我会尖叫。

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

嗯,我想通了。

您会注意到我需要为 headers 提供 "Host"。该主机正在替换我试图通过 POST/PUT/GET 连接的 URl,因此如果我的主机是 https://marketplace.walmartapis.com, then my request URL is https://https://marketplace.walmartapis.com.

一旦我从主机中取出 https:// ,整件事就给了我一个 200 响应。当我得到正确的 GET 响应时,我实际上 copy-pasted 没有 HTTPS 的正确主机纯属偶然,所以我在两个单独的测试用例之间完全错过了这一点。