You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP Curl调用API时响应末尾多出0的问题求解

问题分析与解决方案

问题根源

你的响应末尾出现的0,以及rtrim()无效的问题,核心来自两个代码错误:

  1. Curl未设置返回模式:未启用CURLOPT_RETURNTRANSFER,导致curl_exec()直接将API响应输出到缓冲区,而非返回给变量$result——此时$result只是请求成功/失败的布尔值(成功返回true,失败返回false)。后续代码中错误地将这个布尔值关联到令牌变量,最终输出时false被转为字符串0,和之前输出的API响应拼接形成了末尾的0。
  2. 变量赋值与构造函数错误:
    • 构造函数中把响应内容赋值给了局部变量$auth_token,而非类成员$this->auth_token,导致get_auth_token()始终返回未初始化的null。
    • 构造函数尝试返回值,这在PHP中是无效操作,不会产生任何效果。
  3. 变量名错误:定义了$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 05:41:04