繁体   English   中英

在php环境中没有响应Curl

[英]No response with Curl in php environnement

我在php中有一个奇怪的问题。

我在邮递员的API上发出POST请求。 我有一个答案。 我用Postman生成了php代码(如下所示)。

邮差回应

但用PHP,没有回应。 (适用于另一个POST请求)。

/Applications/MAMP/htdocs/*******/functions.php:108:string''(长度= 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);
}

}

我最好的猜测是你编码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-urlencodedmultipart/form-data -formats时,不要手动设置Content-Type标头,让curl自动设置标头,所以删除这个"Content-Type: application/x-www-form-urlencoded; charset=UTF-8" (对于第一个,libcurl运行自动测试套件以确保标头中没有拼写错误,与您自己的代码库不同,对于后一种格式,您可能会破坏边界头)

"Accept: */*"无论如何都是默认的libcurl标头,所以如果你愿意,可以删除它,它没有区别(并且也可以在这里使用拼写错误参数)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM