Guzzle:将带有嵌套 JSON 的 POST 发送到 API

Guzzle: Sending POST with Nested JSON to an API

我正在尝试在 PHP (Wordpress CLI) 中使用 Guzzle 命中 POST API 端点来计算运费。该路线需要以下格式的 RAW JSON 数据:

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

Link 到 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 错误。

有什么想法吗?

您不需要将数据转换为 json 格式,Guzzle 会处理。 您也可以使用 Guzzle 库的 post() 方法来实现相同的请求结果。这是一个例子...

$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);

试试这样给body

"json" =>  json_encode($body)

我在这上面花了很多时间才意识到产品实际上需要对象数组。我一直在发送一个 one-dimensional 数组,这导致了 'Bad Request' 错误。

为了解决这个问题,只需将 'vid' 和 'quantity' 封装到一个数组中,瞧!