PHP cURL 如何发送 JSON POST 请求并包含 URL 查询字符串?

PHP cURL how to send a JSON POST request and also include a URL querystring?

我正在尝试将带有 JSON 数据的 POST 请求提交到 api 端点。端点需要一个传递 api 凭据的查询字符串,但还需要 JSON 数据 POSTed.

当我尝试使用 PHP cURL 执行此操作时,如下所示,查询字符串显然已被删除 - 因此 api 由于缺少 api 键而拒绝请求。

在测试对 api 端点的访问时,我可以使用 Postman 轻松完成此操作。

如何使 cURL 请求包含 查询字符串和 JSON POST 正文?

示例代码:

// $data is previously defined as an array of parameters and values.

$url = "https://api.endpoint.url?api_key=1234567890";

$ch = curl_init();
$json = json_encode($data);

curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_POST, true);
curl_setopt($ch,CURLOPT_POSTFIELDS, $json);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type: application/json',
    'Content-Length: ' . strlen($json)
] 

//execute post
$result = curl_exec($ch);

//close connection
curl_close($ch);

你几乎做对了。

有时您需要放松 SSL 验证。
否则,更新 php ca bundle:
https://docs.bolt.cm/3.7/howto/curl-ca-certificates

添加以下内容:

$headers = array(
  "Content-type: application/json;charset=UTF-8",
  "Accept-Encoding: gzip,deflate",
  "Content-length: ".strlen($json),
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 300);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_ENCODING, "identity, deflate, gzip");
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

$result = curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

有时您也需要更改编码:

$result = utf8_decode($result);

并检查返回数据。