http — Тип контента не устанавливается в cURL в переполнении стека

Я пытаюсь отправить запрос в API (если точнее, в Xero), используя cURL, но я явно отправляю пустые запросы. Я проверил информацию cURL, и похоже, что у меня не установлен тип контента, хотя я устанавливал его в коде.

Вот мой код:

    $content = $this->getContent();
$headers = [
"Content-Type: application/x-www-form-urlencoded",
"Content-Length: " . strlen($content),
"Connection: close"];

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $this->getUrl());
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_HEADER, true);

curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $content);

de($headers, curl_getinfo($ch));

de() это функция «dump and exit», которая выводит это:

 array(3) {
[0] =>
string(47) "Content-Type: application/x-www-form-urlencoded"[1] =>
string(20) "Content-Length: 1003"[2] =>
string(17) "Connection: close"}

array(26) {
'url' =>
string(41) "https://api.xero.com/api.xro/2.0/Invoices"'content_type' =>
NULL
'http_code' =>
int(0)
'header_size' =>
int(0)
'request_size' =>
int(0)
'filetime' =>
int(0)
'ssl_verify_result' =>
int(0)
'redirect_count' =>
int(0)
'total_time' =>
double(0)
'namelookup_time' =>
double(0)
'connect_time' =>
double(0)
'pretransfer_time' =>
double(0)
'size_upload' =>
double(0)
'size_download' =>
double(0)
'speed_download' =>
double(0)
'speed_upload' =>
double(0)
'download_content_length' =>
double(-1)
'upload_content_length' =>
double(-1)
'starttransfer_time' =>
double(0)
'redirect_time' =>
double(0)
'certinfo' =>
array(0) {
}
'primary_ip' =>
string(0) ""'primary_port' =>
int(0)
'local_ip' =>
string(0) ""'local_port' =>
int(0)
'redirect_url' =>
string(0) ""}

Насколько я вижу, я правильно устанавливаю заголовки (константа написана правильно, и я не устанавливал их несколько раз). Что я делаю неправильно?

0

Решение

Сначала проверьте с curl_error функция нажмите меня для деталей!

так как ваш URL https, поэтому процесс проверки ssl следует.

Неформальное исправление:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

Формальное исправление:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_CAINFO, getcwd() . "/CAcerts/your_certificate.crt");

Где сертификат?

  1. Просмотр URL в браузере Firefox

Перейти на сайт

  1. Нажмите на панель блокировки слева от адресной строки

  2. Затем нажмите больше информации
    больше информации

  3. Теперь нажмите view certificate кнопка
    сертификат

  4. В открывшемся всплывающем окне вы увидите две вкладки в этой вкладке сведений о клике (ярлык ALT + D).

  5. Затем нажмите кнопку экспорта и сохраните сертификат

экспорт

  1. Это путь, который вы должны дать здесь

    curl_setopt ($ ch, CURLOPT_CAINFO, getcwd (). «/CAcerts/your_certificate.crt»)

2

Другие решения

Других решений пока нет …