我在php中使用Curl有一个奇怪的问题。
我通过邮递员在API上发出POST请求。我有一个答案。我已经用Postman生成了php代码(如下所示)。
但是使用php时,没有响应。 (可以很好地处理另一个POST请求)。
/ Applications / MAMP / htdocs / ******* / functions.php:108:string''(length = 0)
你有什么主意吗?
function 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=******&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);
}
}
答案 0 :(得分:0)
我的最佳猜测是您对CURLOPT_POSTFIELDS的编码错误。您还记得将每个@
编码为%40
吗?您还记得将每个空格编码为%20
吗?您还记得将每个&
编码为%26
吗?我猜答案是否定的。使用urlencode()或http_build_query()(除了确保所有内容都正确编码之外,如果正确移植到http_build_query(),代码通常也会变得更漂亮)
挑剔:
请勿手动设置User-Agent
标头,而应设置CURLOPT_USERAGENT(手动设置标头不能与CURLOPT_FOLLOWLOCATION配合使用,并且很容易忘记在后续请求中进行设置...通常的经验,请改用CURLOPT_USERAGENT。)
请勿将CURLOPT_CUSTOMREQUEST用于POST请求,将其设置为CURLOPT_POST=>1
-CURLOPT_CUSTOMREQUEST很危险,因为它不会自动清除(与CURLOPT_POST不同),必须在使用完之后以及程序员忘记时将其手动设置为NULL。清理CURLOPT_CUSTOMREQUEST时,经常会发生错误(例如后续请求使用错误的请求类型)
当专门使用application/x-www-form-urlencoded
或multipart/form-data
格式时,请勿手动设置Content-Type
标头,而是让curl自动设置标头,因此请删除此"Content-Type: application/x-www-form-urlencoded; charset=UTF-8"
(对于首先,libcurl具有自动运行的测试包,以确保标头中没有错别字,这与您自己的代码库不同,对于后一种格式,您可能会弄乱边界标头)
"Accept: */*"
仍然是默认的libcurl标头,因此您可以根据需要将其删除,这没有什么区别(也可以在此处输入typos参数)