CodeIgniter中RESTful API获取数据及print_r报错问题求助
解决 "Trying to get property of non-object" 报错 & CodeIgniter RESTful API 数据获取指南
一、先搞定你的报错问题
你遇到的这个报错,本质是你尝试用对象访问符 -> 去访问一个非对象类型的数据。大概率是你的 $data 不是对象,或者API返回的结构和你预期的不一样。给你几个排查和解决的步骤:
先看清楚API返回的完整结构
先别直接访问siup,先把整个$data打印出来看看:$data = $this->restf->request('car/find','get',array('id'=>$id)); print_r($data); // 先看完整数据结构这样你就能明确:
$data是对象还是数组?如果是数组,就得用$data['siup']而非$data->siupsiup字段是不是直接在根层级?会不会嵌套在某个子结构里,比如$data->result->siup或者$data['data']['siup']
常见的修正场景
- 如果返回的是数组:把
$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接口)
安装并配置REST库
将库文件放到application/libraries目录,然后在config/autoload.php中自动加载:$autoload['libraries'] = array('rest');也可以在控制器中手动加载:
$this->load->library('rest');创建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); } } }模型层(数据库查询逻辑)
在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)
你当前的写法已经是客户端调用的一种方式,这里补充更通用的实现:
用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请求失败'; }用原生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
相关产品推荐
相关产品推荐

