-1

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

基本上,我正在发出 POST 请求,并使用“新”OAuth 身份验证对沃尔玛 API 的 PUT 请求进行测试。听起来很宏伟。GET 在 Postman 和我的实际 PHP 代码中运行良好。POST 和 PUT 立即返回完全相同的错误,无论我做什么和如何做:400 Bad Request, Invalid 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 分钟左右生成一个新令牌。我已经完成了......很多细微的变化,但是提要示例和请求的工作方式,我可以说我做的一切都是正确的。老实说,我认为我在这一点上失去了我的弹珠。

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

注意到我不太了解 Postman 是否存在问题,因为沃尔玛的 API 要求内容类型为 multipart/form-data。我注意到它在说明这一点时使用了“示例”一词,但是,如果它会接受其他内容,它通常会说“这个或这个”。但是,如果我将 Postman 中的 content-type 切换为 multipart/form-data,Body 会自动变为raw: text而不是raw: XML(application/xml)或 text/xml。如果我尝试将原始数据交换为这些类型,它会自动将我的内容类型转换为应用程序/xml,所以这有点...... hinky。

我没有通过代理。我已关闭全局代理配置并使用系统代理。请求超时设置为 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(应用程序/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

4

1 回答 1

0

嗯,我已经想通了。

您会注意到我需要在标题中提供“主机”。该主机正在替换我尝试通过 POST/PUT/GET 连接的 URl,因此如果我的主机是https://marketplace.walmartapis.com,那么我的请求 URL 是https://https://marketplace .walmartapis.com

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

于 2019-04-29T06:00:00.840 回答