在PHP环境中,Curl没有响应

时间:2019-04-14 16:55:20

标签: php curl postman

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

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

Postman Response

但是使用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);
}

}

1 个答案:

答案 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-urlencodedmultipart/form-data格式时,请勿手动设置Content-Type标头,而是让curl自动设置标头,因此请删除此"Content-Type: application/x-www-form-urlencoded; charset=UTF-8"(对于首先,libcurl具有自动运行的测试包,以确保标头中没有错别字,这与您自己的代码库不同,对于后一种格式,您可能会弄乱边界标头)

"Accept: */*"仍然是默认的libcurl标头,因此您可以根据需要将其删除,这没有什么区别(也可以在此处输入typos参数)