php curl函数爬坑日志--curl 返回信息为 null

这篇博客记录了在使用PHP的cURL函数调用接口时遇到返回值为null的问题。经过排查,发现是http1.1协议中URL不能包含空格,需用加号替换。通过`str_replace(' ', '+', $url)`解决了问题,同时也提及了尝试过但无效的其他解决方案。" 88366064,7917269,操作系统基础:进程、线程与超线程解析,"['操作系统', '进程管理', '线程管理', '并发处理', '多线程']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关键词: php语言 curl函数 get post方法 http1.1协议

不用说太多,简单概括如下:
调用京东接口时,出现$response = null;
但是 生成的带有sign签名的 url地址可以在浏览器中获得接口返回的信息

爬了将近一天的坑,都没有走出来!!最终受高人指点,得到解决.
自己尝试过得解决方法:
1.别人封装的curl方法 无效
2.输出 curl_error 和 curl_errno 无效
3.输出 curl_getinfo() 无效(查无异样)
4.各种逻辑检查
5.sign签名 测试

最终结果是:

//http1.1协议中的 url 有编码格式 不可以使用空格,使用+ 替换

**

将 $url 进行如下处理处理

$url = str_replace(’ ', ‘+’, $url);

//http1.1协议中的 url 有编码格式 不可以使用空格,使用+  替换

//将 $url 进行如下处理处理
        $url = str_replace(' ', '+', $url);

//完整代码


get请求
public static function getHttps($url)
    {
        $urls = str_replace(' ', '+', $url);
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $urls);//设置链接
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);//设置SSL验证
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//设置是否返回信息
        $data = curl_exec($ch);//接收返回信息
        curl_close($ch);
        return $data;
    }


post 请求
    public static function postHttps($postArr, $url)
    {
        $urls = str_replace(' ', '+', $url);
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);//设置SSL验证
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);    //是否检测服务器的域名与证书上的是否一致
        curl_setopt($ch, CURLOPT_URL, $urls);//设置链接
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//设置是否返回信息
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postArr);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
                'Content-Type: application/json; charset=utf-8',
                'Content-Length: ' . strlen($postArr))
        );
        $res = curl_exec($ch);//接收返回信息
        curl_close($ch);

        return $res;
    }

别人封装的curl

public static function curl($url, $params = false, $ispost = 0, $https = 0)
    {
        $httpInfo = array();
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
        curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36');
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        if ($https) {
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // 对认证证书来源的检查
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); // 从证书中检查SSL加密算法是否存在
        }
        if ($ispost) {
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
            curl_setopt($ch, CURLOPT_URL, $url);
        } else {
            if ($params) {
                if (is_array($params)) {
                    $params = http_build_query($params);
                }
                curl_setopt($ch, CURLOPT_URL, $url . '?' . $params);// 此处就是参数的列表,给你加了个?
            } else {
                curl_setopt($ch, CURLOPT_URL, $url);
            }
        }

        $response = curl_exec($ch);

        if ($response === FALSE) {
            //echo "cURL Error: " . curl_error($ch);
            return false;
        }
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        $httpInfo = array_merge($httpInfo, curl_getinfo($ch));
        curl_close($ch);
        return $response;
    }

封装的没有进行处理,可以自行脑补~~~~

完美解决!!
暂时还没有进一步深究,写此文以记录成长历程,希望能够帮助到需要帮助的人!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值