【问题标题】:No response with Curl in php environnementphp环境中Curl没有响应
【发布时间】:2019-04-15 04:14:54
【问题描述】:

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

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

Postman Response

但是使用 php,没有响应。 (适用于另一个 POST 请求)。

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

}

【问题讨论】:

    标签: php curl postman


    【解决方案1】:

    我最好的猜测是您对 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 标头,因此您可以根据需要将其删除,这没有区别(也可以在此处使用拼写错误参数)

    【讨论】:

    • 请记住在请求 HTTPS 资源时设置 CURLOPT_SSL_VERIFYHOST 和 CURLOPT_SSL_VERIFYPEER 设置。
    猜你喜欢
    • 2021-06-30
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 2017-10-06
    • 2018-12-23
    • 1970-01-01
    • 2012-04-01
    相关资源
    最近更新 更多