REST (PHP, CURL) PUT / POST XML Проблема: 400 неверных запросов, ответ «Неверный URL» с помощью Walmart OAuth API (Почтальон для тестирования) - PullRequest
0 голосов
/ 27 апреля 2019

Здесь есть что распаковать.Прежде всего, я отредактировал заголовок, потому что я понимаю, что, в конце концов, мой REST-запрос будет реализован в коде PHP, сейчас я сократил его до Postman, чтобы протестировать ПРОСТО REST, поэтому я удалил его как низкий иОсновной как можно.Я могу официально сказать, что проблема связана с моим запросом.

По сути, я делаю запрос POST, а также тестирую запрос PUT к API Walmart с использованием «новой» аутентификации OAuth.Звучит грандиозно.GET работает КРАСОТНО в Почтальоне и в моем реальном 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 через мой сервер и перешел в Почтальон, чтобы попытаться найти точную проблему, и GET-запросы работают прекрасно.Я генерирую новый токен каждые 15 минут или около того.Я сделал ... ОЧЕНЬ много мелких изменений, но как работают примеры и запросы Feed, несмотря на все, что я могу сказать, я все делаю правильно.Честно говоря, я думаю, что теряю свои шарики на этом этапе.

Что меня больше всего расстраивает, так это то, что GET работает.Мой токен работает.Мой OAuth работает просто отлично.Многие заголовки, которые GET использует для API Walmart, точно такие же, как между PUT / POST / GET.Разница здесь ТОЛЬКО в том, что ссылка имеет параметры запроса и XML, помещаемый в тело.Редактировать: я имею в виду, что мои заголовки не меняются между GET и POST;единственное, что меняется в том, что я предоставляю, это то, что XML отправляется в теле, и что параметры запроса обязательны.Это единственное, что меняется между успешным GET и неудачным запросом 400 неверных запросов PUT / POST.Это заставляет меня поверить, что что-то не так с тем, как я обрабатываю параметры запроса или мой XML, но, учитывая, что в приведенном ниже примере я скопировал / вставил XML ... Я не уверен.Это существующий элемент в нашем каталоге, я знаю это точно.

Что-то, что я заметил , что я недостаточно осведомлен, чтобы понять, является ли это проблемой Почтальона или нет.API-интерфейс Walmart запрашивает, чтобы тип контента был multipart / form-data.Я заметил, что он использует термин «пример», когда заявляет об этом, однако обычно он говорит «это или это», если он примет что-то еще.Однако, если я переключаю тип содержимого в Postman на multipart / form-data, тело автоматически становится raw: text вместо raw: XML (application / xml) или text / xml,Если я пытаюсь поменять raw на эти типы, он автоматически переворачивает мой тип контента в application / xml, так что это немного ... странно.

Я не иду через Прокси.Я отключил глобальную настройку прокси и использую системный проксиВремя ожидания запроса установлено равным 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

ТЕЛО сырье: 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>

Пожалуйста, пришлите помощь, я думаю, что я смотрелв это время я собираюсь покинуть этот физический мир.Относительно недавно Walmart обновил свою аутентификацию до OAuth, и они сделали смутные заявления о том, что их старая аутентификация устареет и будет прекращена, поэтому я, очевидно, хочу попытаться заставить это работать. Я попытался скопировать и вставить все как можно лучше.Этот XML-код скопирован почти буква за буквой из их примера, с включенным моим собственным продуктом.

Кроме того, ссылочный номер там всегда меняется каждый раз, когда я запускаю это, так что я не могу найти его.Я предоставил только почтальонскую сторону, потому что, честно говоря, если я смогу заставить это работать, мой PHP будет в порядке, я уже устранил некоторые незначительные проблемы с успешным запросом GET.

Если это проблема с запятой, я буду кричать.

Документация по API: https://developer.walmart.com/#/apicenter/marketPlace/latest#updateInventoryForAnItem

1 Ответ

0 голосов
/ 29 апреля 2019

Ну, я понял.

Вы заметите, что я должен предоставить "Host" с моими заголовками. Этот хост заменяет мой URl, к которому я пытаюсь подключиться через POST / PUT / GET, поэтому, если мой хост - https://marketplace.walmartapis.com,, тогда URL моего запроса - https://https://marketplace.walmartapis.com.

Как только я вынул https: // из хоста, все это дало мне 200 ответов. Когда я получал правильный ответ GET, я действительно случайно копировал правильный HOST без HTTPS, поэтому я полностью пропустил это между двумя отдельными тестами.

...