curl_exec()返回string(1)空格,Postman请求同URL可正常获取JSON该如何排查?
PHP cURL 请求返回单空格字符串的排查方案
- 第一步:打印cURL原生错误信息,确认请求链路是否存在底层异常
在curl_exec执行后追加以下代码查看错误:
存在非0错误码时可直接对应定位DNS解析、连接超时、端口不通等底层问题。var_dump(curl_errno($curl), curl_error($curl)); - 第二步:查看请求响应的HTTP状态码
调用curl_getinfo获取状态码,判断是否为服务端返回异常:
如果返回3xx重定向状态码,可添加配置开启自动跟随重定向:var_dump(curl_getinfo($curl, CURLINFO_HTTP_CODE));
如果返回4xx/5xx,对应排查权限、参数、服务端内部错误问题。curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); - 第三步:对齐Postman的请求头参数
多数服务端会校验请求头字段,Postman默认携带的User-Agent、Accept、Authorization等头字段PHP cURL不会默认生成,可以直接从Postman导出PHP cURL代码和现有代码对比,补充缺失的头配置,示例如下:// 示例:补充UA和Accept头 $headers = [ 'Accept: application/json', 'User-Agent: PostmanRuntime/7.29.0' ]; curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); - 第四步:处理压缩编码和HTTPS校验问题
- 如果接口返回gzip/deflate压缩内容,未开启自动解压会得到乱码或不可见内容,添加配置让cURL自动处理压缩:
curl_setopt($curl, CURLOPT_ENCODING, '');- HTTPS接口如果本地没有配置CA证书,会出现校验失败,可临时添加以下配置测试(生产环境需替换为正式CA证书配置,禁止关闭校验):
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); - 第五步:校验返回内容的二进制值
用bin2hex打印返回内容的十六进制编码,确认是否为真的空格,还是不可见控制字符:
如果值为var_dump(bin2hex($resp));20则是普通空格,需进一步确认服务端逻辑是否会在特定请求下返回空内容加空格;其他值可对应排查编码、字符集问题。
内容的提问来源于stack exchange,提问作者Linus
相关产品推荐
相关产品推荐

