PHP Curl调用API时响应末尾多出0的问题求解
问题分析与解决方案
问题根源
你的响应末尾出现的0,以及rtrim()无效的问题,核心来自两个代码错误:
- Curl未设置返回模式:未启用
CURLOPT_RETURNTRANSFER,导致curl_exec()直接将API响应输出到缓冲区,而非返回给变量$result——此时$result只是请求成功/失败的布尔值(成功返回true,失败返回false)。后续代码中错误地将这个布尔值关联到令牌变量,最终输出时false被转为字符串0,和之前输出的API响应拼接形成了末尾的0。 - 变量赋值与构造函数错误:
- 构造函数中把响应内容赋值给了局部变量
$auth_token,而非类成员$this->auth_token,导致get_auth_token()始终返回未初始化的null。 - 构造函数尝试返回值,这在PHP中是无效操作,不会产生任何效果。
- 构造函数中把响应内容赋值给了局部变量
- 变量名错误:定义了
$api_settings,但后续调用用户名密码时用了未定义的$geek_api_settings,可能导致请求参数错误。
修复后的PHP类代码
class API_Connection { public $auth_token; public function __construct() { $api_settings = get_option('api_settings'); // 修复变量名错误,增加空值判断 $username = $api_settings['username'] ?? ''; $password = $api_settings['password'] ?? ''; $url = 'https://api.example.com/api-token-auth/'; $data = array( 'username' => $username, 'password' => $password, ); $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => $url, CURLOPT_HTTPHEADER => array('Content-Type: application/json'), CURLOPT_POST => true, CURLOPT_POSTFIELDS => json_encode($data), // 关键配置:将响应内容返回给$result,而非直接输出 CURLOPT_RETURNTRANSFER => true, // 可选:若API证书存在验证问题可临时关闭(生产环境不建议) // CURLOPT_SSL_VERIFYPEER => false, // CURLOPT_SSL_VERIFYHOST => false, )); // 此时$result为API响应字符串,而非布尔值 $result = curl_exec($curl); // 处理Curl执行错误 if($result === false) { $this->auth_token = 'Curl Error: ' . curl_error($curl); } else { // 去除首尾空白字符 $cleaned_result = trim($result); // 若仍有多余字符,尝试截取JSON有效部分(针对API返回异常的情况) $start_pos = strpos($cleaned_result, '{'); $end_pos = strrpos($cleaned_result, '}'); if($start_pos !== false && $end_pos !== false) { $cleaned_result = substr($cleaned_result, $start_pos, $end_pos - $start_pos + 1); } $this->auth_token = $cleaned_result; } curl_close($curl); // 构造函数无需返回值 } public function get_auth_token() { return $this->auth_token; } }
优化AJAX Action代码
为避免多余输出,建议使用WordPress内置的wp_send_json返回响应:
add_action('wp_ajax_curl_auth_token', 'curl_auth_token'); add_action('wp_ajax_nopriv_curl_auth_token', 'curl_auth_token'); function curl_auth_token() { $api_conn = new API_Connection(); $token = $api_conn->get_auth_token(); // 以JSON格式返回响应,避免多余字符 wp_send_json($token); }
为什么rtrim()之前无效?
之前的rtrim($result)处理的是布尔值true/false,而非实际的API响应内容,自然无法去除末尾的0。修复后$result是响应字符串,trim()或JSON边界截取可以有效清理多余内容。
内容的提问来源于stack exchange,提问作者Tony Ingall
相关产品推荐
相关产品推荐

