#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.