Преобразовать запрос почтальона в жрет или другой PHP HTTP клиент - PullRequest
0 голосов
/ 21 мая 2018

У меня есть запрос к почтальону, и он работает хорошо.

Ниже приведен URL-адрес моего поста и заголовки enter image description here

Тогда вот мое тело содержания enter image description here

Хорошо работает, когда я нажимаю кнопку «Отправить», возвращает правильный ресурс, однако, когда я пытаюсь сделать это в PHP, используя guzzlehttp / guzzle, он возвращает 422 или 400

* 1014.* Мой код
<code>$res = $client->request('POST', 'https://api.bigcommerce.com/stores/ny813bjwdy/v3/carts', [
    'headers' => [
        'Accept' => 'application/json',
        'Content-Type' => 'application/json',
        'X-Auth-Client' => "mzr2qe4qeweqwe", 
        'X-Auth-Token' => "nokrq2131qweqrqrqew"
    ],
    'form_params' => [
        'customer_id' => 1,
        'line_items' => [
            'quantity' => 1,
            'product_id' => 97,
            'list_price' => 200
        ]
    ]
]);

echo "<pre>";
    print_r($res);
echo "
";

Неустранимая ошибка: Uncaught GuzzleHttp \ Exception \ ClientException: Ошибка клиента: POST https://api.bigcommerce.com/stores/ny813bjwdy/v3/carts привела к ответу 400 Bad Request: статус {)": 400," title ":" Неверный ввод "," type ":" https://developer.bigcommerce.com/api#api-status-codes","detail":"Synta (усечено ...) в C: \ www \ bomb-shelter \ http \ vendor \ guzzlehttp \ guzzle \ src\ Exception \ RequestException.php: 113 Трассировка стека: # 0 C: \ www \ бомбоубежище \ http \ vendor \ guzzlehttp \ guzzle \ src \ Middleware.php (66): GuzzleHttp \ Exception \ RequestException :: create (Object (GuzzleHttp \ Psr7 \ Request), Object (GuzzleHttp \ Psr7 \ Response)) # 1 C: \ www \ bomb-shelter \ http \ vendor \ guzzlehttp \ promises \ src \ Promise.php (203): GuzzleHttp \ Middleware :: GuzzleHttp{closure} (Object (GuzzleHttp \ Psr7 \ Response))

2 C: \ www \ бомбоубежище \ http \ vendor \ guzzlehttp \ promises \ src \ Promise.php (156):

GuzzleHttp \ Promise \ Promise :: callHandler (1, Объект (GuzzleHttp \ Psr7 \ Response), Массив) # 3 C: \ www \ bomb-shelter \ http \ vendor \ guzzlehttp \ promises \ src \ TaskQueue.php (47): GuzzleHttp \ Promise \ Promise :: Guzzl в C: \ www \ бомбоубежище \ http \ vendor \ guzzlehttp \ guzzle \ src \ Exception \ RequestException.php в строке 113

Я также попробовал GuzzleHttp\ RequestOptions :: JSON

<code>$res = $client->request('POST', 'https://api.bigcommerce.com/stores/ny813bjwdy/v3/carts', [
    'headers' => [
        'Accept' => 'application/json',
        'Content-Type' => 'application/json',
        'X-Auth-Client' => "mzr2qe4qeweqwe", 
        'X-Auth-Token' => "nokrq2131qweqrqrqew"
    ],
    GuzzleHttp\RequestOptions::JSON => [
        'customer_id' => 1,
        'line_items' => [
            'quantity' => 1,
            'product_id' => 97,
            'list_price' => 200
        ]
    ]
]);

echo "<pre>";
    print_r($res);
echo "
";

, но возвращает 422

Неустранимая ошибка: Uncaught GuzzleHttp \ Exception \ ClientException: ошибка клиента: POST https://api.bigcommerce.com/stores/ny813bjwdy/v3/carts привела к ответу 422 Unprocessable Entity: {"status": 422, "title": "Отсутствующие или неправильные обязательные поля", "type": "https://developer.bigcommerce.com/api#api-status-co (усечено ...) в C: \ www \ bomb-shelter \ http \ vendor \ guzzlehttp \ guzzle \src \ Exception \ RequestException.php: 113 Трассировка стека: # 0 C: \ www \ бомбоубежище \ http \ vendor \ guzzlehttp \ guzzle \ src \ Middleware.php (66): GuzzleHttp \ Exception \ RequestException :: create (Object(GuzzleHttp \ Psr7 \ Request), объект (GuzzleHttp \ Psr7 \ Response)) # 1 C: \ www \ bomb-shelter \ http \ vendor \ guzzlehttp \ promises \ src \ Promise.php (203): GuzzleHttp \ Middleware ::GuzzleHttp {closure} (Объект (GuzzleHttp \ Psr7 \ Response))

2 C: \ www \ бомбоубежище \ http \ vendor \ guzzlehttp \ promises \ src \ Promise.php (156):

GuzzleHttp \ Promise \ Promise :: callHandler (1, Объект (GuzzleHttp \ Psr7 \ Response), Массив) # 3 C: \ www \ bomb-shelter \ http \ vendor \ guzzlehttp \ promises \ src \ TaskQueue.php (47): GuzzleHttp \ Promise \ Promя в C: \ www \ бомбоубежище \ http \ vendor \ guzzlehttp \ guzzle \ src \ Exception \ RequestException.php в строке 113

Есть идеи, как заставить его работать на жрет?или другой PHP HTTP клиент?

1 Ответ

0 голосов
/ 22 мая 2018

Какова усеченная часть сообщения об ошибке 422, которое вы получаете?Возможно, вам не хватает требуемого идентификатора варианта.Используя жрет, вот запрос, который работал для меня, адаптированный от https://stackoverflow.com/a/39525059/8521556:

<code><?php
require 'vendor/autoload.php';

$cart = array(
    'customer_id' => 1,
    'line_items' => array(
        array('quantity' => 1, 'product_id' => 1116, 'variant_id' => 1530)
    ),
);

json_encode($cart);

$client = new GuzzleHttp\Client([
    'headers' => [ 
        'Accept' => 'application/json',
        'Content-type' => 'application/json',
        'X-Auth-Client' => 'xxxxxxxxxxxx',
        'X-Auth-Token' => 'xxxxxxxxxxxx' ]
]);

$response = $client->post('https://api.bigcommerce.com/stores/xxxxxxxx/v3/carts',
    ['json' => $cart]
);

echo '<pre>' . var_export($response->getStatusCode(), true) . '
';echo '
' . var_export($response->getBody()->getContents(), true) . '
';
...