PHP cURL, как отправить JSON запрос POST, а также включить строку запроса URL? - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь отправить запрос POST с данными JSON на конечную точку API. Конечной точке требуется строка запроса, передающая учетные данные API, но также требуется, чтобы данные JSON были POSTed.

Когда я пытаюсь сделать это с PHP cURL, как показано ниже, строка запроса, очевидно, удаляется - таким образом API отклоняет запрос из-за отсутствия ключа API.

Я легко могу сделать это с помощью Postman при тестировании доступа к конечной точке API.

Как сделать так, чтобы запрос cURL включал оба строку запроса И JSON POST body?

Пример кода:

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

1 Ответ

1 голос
/ 30 апреля 2020

Вы делаете почти правильно.

Иногда вам нужно ослабить проверку 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);

и проверить возвращаемые данные .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...