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

CodeIgniter中RESTful API获取数据及print_r报错问题求助

解决 "Trying to get property of non-object" 报错 & CodeIgniter RESTful API 数据获取指南

一、先搞定你的报错问题

你遇到的这个报错,本质是你尝试用对象访问符 -> 去访问一个非对象类型的数据。大概率是你的 $data 不是对象,或者API返回的结构和你预期的不一样。给你几个排查和解决的步骤:

  1. 先看清楚API返回的完整结构
    先别直接访问siup,先把整个$data打印出来看看:

    $data = $this->restf->request('car/find','get',array('id'=>$id));
    print_r($data); // 先看完整数据结构
    

    这样你就能明确:

    • $data 是对象还是数组?如果是数组,就得用 $data['siup'] 而非 $data->siup
    • siup 字段是不是直接在根层级?会不会嵌套在某个子结构里,比如 $data->result->siup 或者 $data['data']['siup']
  2. 常见的修正场景

    • 如果返回的是数组:把 $data->siup 改成 $data['siup']
    • 如果返回的是嵌套对象:比如API返回 {"data": {"siup": "xxx"}},那你得写成 $data->data->siup
    • 如果API返回的是未解析的JSON字符串:需要先解码再访问:
      $raw_data = $this->restf->request('car/find','get',array('id'=>$id));
      $data = json_decode($raw_data);
      print_r($data->siup);
      

二、CodeIgniter 中使用 RESTful API 获取数据的完整流程

假设你用的是主流的 chriskacerguis/codeigniter-restserver 库,分服务端(提供API)和客户端(调用API)两部分说明:

服务端(编写API接口)

  1. 安装并配置REST库
    将库文件放到 application/libraries 目录,然后在 config/autoload.php 中自动加载:

    $autoload['libraries'] = array('rest');
    

    也可以在控制器中手动加载:

    $this->load->library('rest');
    
  2. 创建API控制器
    新建 Car.php 控制器,继承 REST_Controller:

    class Car extends REST_Controller {
        public function find_get() {
            // 获取GET参数中的id
            $id = $this->get('id');
            
            // 调用模型查询数据库
            $this->load->model('Car_model');
            $car_data = $this->Car_model->get_car_by_id($id);
            
            // 返回响应,自动支持JSON/XML格式
            if ($car_data) {
                $this->response($car_data, REST_Controller::HTTP_OK);
            } else {
                $this->response(['error' => '车辆未找到'], REST_Controller::HTTP_NOT_FOUND);
            }
        }
    }
    
  3. 模型层(数据库查询逻辑)
    在 application/models/Car_model.php 中实现查询:

    class Car_model extends CI_Model {
        public function get_car_by_id($id) {
            return $this->db->get_where('car', array('id' => $id))->row();
        }
    }
    

客户端(调用API)

你当前的写法已经是客户端调用的一种方式,这里补充更通用的实现:

  1. 用REST库的客户端功能
    确保客户端实例已正确初始化:

    // 初始化REST客户端(若未自动加载)
    $this->load->library('rest');
    $this->rest->initialize(array(
        'server' => 'http://你的API域名/', // API基础地址
        'http_auth' => 'basic', // 若需要认证可开启
        'username' => '你的用户名',
        'password' => '你的密码'
    ));
    
    // 发送GET请求
    $data = $this->rest->get('car/find', array('id' => $id));
    
    // 处理返回数据
    if ($data) {
        // 根据返回类型选择访问方式(对象用->,数组用[])
        echo $data->siup;
    } else {
        echo 'API请求失败';
    }
    
  2. 用原生CURL调用(无依赖)
    如果不想用第三方库,也可以直接用CURL请求:

    $url = 'http://你的API域名/car/find?id=' . $id;
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($ch);
    curl_close($ch);
    
    // 解析JSON响应
    $data = json_decode($response);
    if ($data) {
        print_r($data->siup);
    }
    

内容的提问来源于stack exchange,提问作者Gusti Erlangga

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:59:04