REST (PHP, CURL) PUT/POST XML проблем: 400 лоша заявка, невалиден URL отговор с Walmart OAuth API (пощальон за тестване)

Тук има много за разопаковане. На първо място, редактирах заглавието, защото осъзнавам, че докато в крайна сметка моята REST заявка ще бъде имплементирана в PHP код, точно сега съм премахнал това до Postman, за да тествам САМО ОСТАНАЛОТО, така че съм го премахнал като ниско и основни, колкото е възможно. Мога официално да кажа, че проблемът е в моята заявка.

По принцип правя POST заявка и също така тествам с PUT заявка към API на Walmart, използвайки „новото“ OAuth удостоверяване. Звучи грандиозно. 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 минути. Направих... ТОЛКОВА много дребни промени, но начинът, по който работят примерите и заявките за Feed, мога да кажа, че правя всичко както трябва. Честно казано мисля, че губя топчетата си в този момент.

Това, което е най-разочароващо за мен е, че GET работи. Моят TOKEN работи. Моят OAuth работи добре. Много от заглавките, които GET използва за API на Walmart, са абсолютно еднакви между PUT/POST/GET. Разликата тук е САМО, че връзката има параметри на заявката И XML, който се набутва в тялото. Редактиране: Това, което имам предвид е, че моите заглавки не се променят между GET и POST; единственото нещо, което се променя в това, което предоставям, е, че XML се изпраща в тялото и че се изискват параметри на заявката. Това е единственото нещо, което се променя между успешна GET и неуспешна 400 лоша заявка PUT/POST. Това ме кара да вярвам, че нещо не е наред с това как обработвам параметрите на заявката или моя XML, но като се има предвид, че в примера по-долу съм копирал/поставил XML... Не съм сигурен. Това е съществуващ артикул в нашия каталог, знам със сигурност.

Нещо, което забелязах и че не съм достатъчно осведомен, за да разбера дали това е проблем или не с Postman, е, че API на Walmart изисква типът съдържание да бъде multipart/form-data. Забелязах, че използва термина "пример", когато посочва това, но обикновено казва "това или това", ако ще приеме нещо друго. Ако обаче превключа тип съдържание в Postman на multipart/form-data, тялото автоматично става raw: text вместо raw: XML(application/xml) или text /xml. Ако се опитам да сменя необработения към тези типове, той автоматично обръща моя тип съдържание към application/xml, така че това е малко... странно.

Не минавам през прокси. Изключих Global Proxy Configuration и Use System Proxy. Времето за изчакване на заявката е зададено на 0. Няма нищо клиентски сертификати. Искам да кажа, че GET работи и моят Token се генерира успешно чрез външен 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

BODY raw: 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>

Моля, изпратете помощ, мисля, че съм се взирал в това толкова дълго, че ще напусна този физически свят. Walmart сравнително наскоро актуализира удостоверяването си до OAuth и те направиха неясни пропуски, като казаха, че старото им удостоверяване ще бъде отхвърлено и постепенно премахнато, така че очевидно искам да се опитам да накарам това да работи. Опитах се да копирам всичко възможно най-добре. Този XML е копиран почти буква по буква от техния пример, с включен мой собствен продукт.

Освен това референтният номер там винаги се променя всеки път, когато стартирам това, така че не е нещо, което всъщност мога да потърся. Доставих само пощальонската страна на нещата, защото честно казано, ако успея да накарам това да работи, моят PHP ще бъде наред, вече отстраних някои дребни проблеми с успешната GET заявка.

Ако е проблем с точка и запетая, ще крещя.

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


person Kitfoxpup    schedule 26.04.2019    source източник
comment
ако разликата тук е САМО, че връзката има параметри на заявката, защо използвате тези параметри в заявката си? не трябва ли вашият PUT url да е без тях? https://marketplace.walmartapis.com/v3/inventory   -  person Flash Thunder    schedule 27.04.2019
comment
О, по дяволите, може би съм се изразил погрешно - имах предвид, че единствената разлика в моя код е това, което означава, че не съм променил нищо друго в заглавките или удостоверяването. Параметрите са задължителни; в тази ситуация PUT изисква дефиниране на SKU в URL/параметъра на заявката. В Postman автоматично поставя това в заявката, така че нямам избор по този въпрос. Редактиране: Например, ако вляза в Postman's Params и редактирам SKU стойността, тя автоматично се добавя към URL адреса, така че става marketplace.walmartapis.com/v3/inventory?sku=0xyz0   -  person Kitfoxpup    schedule 27.04.2019
comment
наистина е трудно да се помогне без документация на този API, грешката основно казва, че не можете да извършите това действие на този url   -  person Flash Thunder    schedule 27.04.2019
comment
Дадено. developer.walmart.com/#/apicenter/marketPlace/   -  person Kitfoxpup    schedule 27.04.2019
comment
изглежда, че вашият url за POST трябва да бъде https://marketplace.walmartapis.com/v3/feeds   -  person Flash Thunder    schedule 27.04.2019
comment
да, но както споменах Postman автоматично превръща URL адреса в marketplace.walmartapis.com/v3/inventory?sku=0xyz0 веднага щом въведа необходимия SKU параметър. Задължително е, в противен случай API няма да знае за кой артикул да актуализира количеството в този конкретен пример. Най-голямата надежда е да достигна POST, но в тази ситуация се опитвам да се справя с това, тъй като е малко по-сложно от това PUT.   -  person Kitfoxpup    schedule 27.04.2019
comment
всъщност би знаел от XML файл, който съдържа <sku>0xyz0</sku>, имате ли зададен CURLOPT_FOLLOWLOCATION в curl?   -  person Flash Thunder    schedule 27.04.2019
comment
Завъртях го, но пак се върна с грешка 400 и същия HTML отговор.   -  person Kitfoxpup    schedule 27.04.2019
comment
Предполагам, че не мога да ви помогна, но може би ще бъде по-лесно, когато дадете някакъв PHP код с curl заявка. Интересният факт е, че се казва, че Не Host/v3/inventory/; е невалиден -› no host ... така че може би прокси сървърът прави нещо нередно със заявката, като премахване на host заглавка? или може би трябва сами да добавите заглавка host:, тъй като тя не се добавя с PUT заявка по подразбиране от curl. Това със сигурност няма нищо общо с вашия XML, тъй като би предизвикало друга грешка. Бих предложил да използвате curl в подробен режим и да видите какво изпраща.   -  person Flash Thunder    schedule 27.04.2019
comment
Postman всъщност не използва никакъв PHP код. Позволява ми да имам среда, в която да тествам моя CURL- или всъщност REST- без всъщност да се тревожа за каквото и да е програмиране. Така че в момента това, което виждате, е точно това, което правя аз - просто REST, без код. Ще завърши в PHP, след като всичко това приключи, но в момента всичко, което правя, е направо да CURL в Postman. Също така предоставям хост, тъй като API на Walmart изисква такъв - по-специално, Host: https://marketplace.walmartapis.com. Аз също не използвам прокси, деактивирах го. Така че това беше моята грешка, когато публикувах това първоначално, бях малко разочарован.   -  person Kitfoxpup    schedule 28.04.2019
comment
имаше една публикация във форума за разработчици на walmart за същия проблем, но нямаше решение...   -  person Flash Thunder    schedule 28.04.2019
comment
Вашият коментар за Host първоначално беше това, което ме накара да се замисля, а друга публикация за някой, който има същата грешка поради множество // в тяхната заявка за URL адрес ме накара да се замисля за минута. Забравих да ви благодаря, така че много ви благодаря, че работихте с мен. Имах проклятието да работя твърде внимателно върху него твърде дълго.   -  person Kitfoxpup    schedule 29.04.2019


Отговори (1)


Е, разбрах го.

Ще забележите, че от мен се изисква да предоставя „Хост“ с моите заглавки. Този хост замества моя URL адрес, с който се опитвам да се свържа чрез POST/PUT/GET, така че ако моят хост е https://marketplace.walmartapis.com, тогава URL адресът на моята заявка е https://https://marketplace.walmartapis.com.

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

person Kitfoxpup    schedule 29.04.2019