Я пытаюсь попасть в конечную точку POST API с помощью Guzzle в PHP (Wordpress CLI), чтобы рассчитать стоимость доставки. Маршрут ожидает данные RAW JSON в следующем формате:

{
   "startCountryCode": "CH"
   "endCountryCode": "US",
   "products": {
       "quantity": 1,
       "vid": x         //Variable ID
    }
}

Ссылка на используемый мной API: https://developers.cjdropshipping.com/ api2.0/v1/logistic/freightCalculate

$body = [
     "endCountryCode"    => "US",
     "startCountryCode"  => "CN",
     "products"          => [
             'vid'               => $vid,
             'quantity'          => 1
     ],
 ];

 $request = $this->client->request(
     'POST', 'https://developers.cjdropshipping.com/api2.0/v1/logistic/freightCalculate',
     [
         'headers' => [
                'CJ-Access-Token' => $this->auth_via_cj(), // unnecessary, no auth required. Ignore this header
         ],
         'body' => json_encode( $body )
     ],
);

Я также пытался использовать 'json' => $body вместо параметра body.

Я получаю ошибку 400 Bad Request.

Любые идеи?

0
Hristijan Manasijev 4 Фев 2022 в 12:34
Возможно, это не решение, но определенно, согласно их документам, вы также должны предоставить заголовок content-type, которого вам не хватает: developers.cjdropshipping.com/cj/#flow Также я бы предпочел, чтобы мой код сначала работал с простой конечной точкой api/account/start.
 – 
Marcin Orlowski
4 Фев 2022 в 12:39
Я пытался явно добавить заголовок Content Type, но это не помогло. Кстати, я могу ошибаться, но при использовании свойства json Guzzle автоматически устанавливает заголовок типа контента.
 – 
Hristijan Manasijev
4 Фев 2022 в 12:56
Используйте try catch, чтобы поймать сообщение об ошибке 400 неверных запросов, используйте $e->getMessage();, знание ошибки помогает быстрее выполнять отладку
 – 
bhucho
4 Фев 2022 в 13:29

2 ответа

Вам не нужно конвертировать данные в формат json, Guzzle позаботится об этом. Также вы можете использовать метод post() библиотеки Guzzle для достижения того же результата запроса. Вот например...

$client = new Client();
$params['headers'] = ['Content-Type' => 'application/json'];
$params['json'] = array("endCountryCode" => "US", "startCountryCode" => "CN", "products" => array("vid" => $vid, "quantity" => 1));
$response = $client->post('https://developers.cjdropshipping.com/api2.0/v1/logistic/freightCalculate', $params);
0
Onkar Manvelikar 4 Фев 2022 в 13:24

Попробуйте дать тело, как это.

"json" =>  json_encode($body)
0
Girish Latkar 4 Фев 2022 в 13:35