Нет ответа с помощью Curl в среде php

#php #curl #postman

#php #curl #почтальон

Вопрос:

у меня странная проблема с Curl в php.

Я делаю запрос POST в API с помощью postman. У меня есть ответ. Я сгенерировал php-код с помощью Postman (показать ниже).

Ответ почтальона

Но с php нет ответа. (это хорошо работает с другим POST-запросом).

/Applications/MAMP/htdocs/*******/functions.php:108:string » (длина = 0)

У вас есть какие-либо идеи?

функция get_id($immat){

 $curl = curl_init();

curl_setopt_array($curl, array(
        CURLOPT_URL => "https://****.******.fr/*****.do",
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => "",
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 100,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => "POST",
        CURLOPT_POSTFIELDS => "recherche=******amp;undefined=",
        CURLOPT_HTTPHEADER => array(
            "Accept: */*",
            "Content-Type: application/x-www-form-urlencoded; charset=UTF-8",
            "Origin: https://*********.fr",
            "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36",
            "X-Requested-With: XMLHttpRequest",
            "cache-control: no-cache"
        ),
    ));

$response = curl_exec($curl);
$err = curl_error($curl);

var_dump($response);

curl_close($curl);

if ($err) {
    echo "cURL Error #:" . $err;
} else {
    echo $response;
    var_dump($response);
}
 

}

Ответ №1:

мое лучшее предположение заключается в том, что вы неправильно кодируете CURLOPT_POSTFIELDS. вы помните, что нужно кодировать каждый @ as @ ? вы помните, что нужно кодировать каждый пробел в ? вы помните, что нужно кодировать каждый amp; as & ? я думаю, ответ отрицательный. используйте либо urlencode(), либо http_build_query() (в дополнение к тому, чтобы убедиться, что все закодировано правильно, код обычно становится намного красивее, если его правильно перенести в http_build_query())

придирки:

не устанавливайте User-Agent заголовок вручную, вместо этого установите CURLOPT_USERAGENT (установка заголовка вручную не будет хорошо работать с CURLOPT_FOLLOWLOCATION , и его легко забыть установить при последующих запросах… как правило, вместо этого используйте CURLOPT_USERAGENT .)

не используйте CURLOPT_CUSTOMREQUEST для запросов POST, set CURLOPT_POST=>1 — CURLOPT_CUSTOMREQUEST опасен, потому что он не очищается автоматически (в отличие от CURLOPT_POST) и должен быть вручную установлен в значение NULL после того, как вы закончите его использовать, а когда программисты забывают очистить CURLOPT_CUSTOMREQUEST, часто возникают ошибки (например, последующие запросы с использованием неправильного типа запроса)

при использовании application/x-www-form-urlencoded or multipart/form-data -formats, в частности, не устанавливайте Content-Type заголовок вручную, позвольте curl установить заголовок автоматически, поэтому удалите это "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" (для первого libcurl запускает автоматические тестовые наборы, чтобы убедиться, что в заголовке нет опечаток, в отличие от вашей собственной кодовой базы, а для последнего формата вы можете испортитьзаголовок границы)

"Accept: */*" в любом случае, это заголовок libcurl по умолчанию, поэтому вы можете удалить его, если хотите, это не имеет никакого значения (и здесь тоже может привести к опечаткам)

Комментарии:

1. Не забудьте установить параметры CURLOPT_SSL_VERIFYHOST и CURLOPT_SSL_VERIFYPEER при запросе ресурсов HTTPS.