PHP中使用Curl发起请求时如何仅获取响应体内容
问题解决方案
根本原因
你设置了CURLOPT_HEADER参数为true,该配置项的作用是让curl_exec()返回的结果同时包含HTTP响应头和响应体内容,所以会出现头信息和JSON数据拼接的情况。
修复方案
方案1(最简单):关闭响应头返回
将代码中对应行的配置值改为false即可:
// 原代码 curl_setopt($crl, CURLOPT_HEADER, true); // 修改为 curl_setopt($crl, CURLOPT_HEADER, false);
修改后curl_exec()只会返回接口返回的JSON内容,直接调用json_decode()就能正常解析。
方案2(保留响应头用于校验,适用于对接银行等需要验头的场景)
如果你需要保留响应头做合法性校验(比如校验响应状态码、安全头信息等),不需要修改CURLOPT_HEADER配置,在获取返回结果后手动截取响应体即可:
$rest = curl_exec($crl); if ($rest === false) { print_r('Curl error: ' . curl_error($crl)); } else { // 获取响应头的字节长度 $headerSize = curl_getinfo($crl, CURLINFO_HEADER_SIZE); // 截取响应体部分 $body = substr($rest, $headerSize); $data = json_decode($body, true); }
修复后完整示例代码
<?php $url = 'https://the-url.com'; $auth = 'authentication key'; $method ='POST'; $grant = 'grant_type=client_credentials'; $crl = curl_init(); $headr = array(); $headr[] = 'Content-type: application/x-www-form-urlencoded'; $headr[] = 'Authorization: Basic '.$auth; curl_setopt($crl, CURLOPT_URL,$url); curl_setopt($crl, CURLOPT_HTTPHEADER,$headr); curl_setopt($crl, CURLOPT_POST,true); // 关闭响应头返回 curl_setopt($crl, CURLOPT_HEADER, false); curl_setopt($crl, CURLOPT_RETURNTRANSFER, true); curl_setopt($crl, CURLOPT_POSTFIELDS, $grant); $rest = curl_exec($crl); if ($rest === false) { print_r('Curl error: ' . curl_error($crl)); } curl_close($crl); $data = json_decode($rest, true); // 输出响应体内容 echo $rest; ?>
内容的提问来源于stack exchange,提问作者displayname
相关产品推荐
相关产品推荐

