codeigniter 4.4.5 原生支持 restful,无需且不可用 ci3 的 codeigniter-restserver;其路由需在 routes.php 中显式绑定动词,控制器继承 codeigniter\controller,请求/响应由 http\request/response 统一处理,并须配置 cors 和正确响应头。

CodeIgniter 4.4.5 自带完整的 RESTful 支持,不需要额外引入 codeigniter-restserver 这类第三方库——那是为 CI3 设计的,用在 CI4 上会报错、不兼容、甚至导致路由失效。
为什么不能用 CI3 的 RestServer 库
CI4 的请求生命周期、依赖注入机制、命名空间和自动加载规则与 CI3 完全不同。RestController 类在 CI4 中不存在,chriskacerguis/codeigniter-restserver 的 src/RestController.php 无法被 CI4 的 autoloader 识别,运行时会直接抛出 Class 'chriskacerguis\RestServer\RestController' not found 错误。
- CI4 的核心控制器是
CodeIgniter\Controller,所有自定义控制器必须继承它 - CI4 的请求解析由
CodeIgniter\HTTP\Request统一处理,不再依赖手动映射_get/_post方法 - CI4 的响应输出使用
CodeIgniter\HTTP\Response,支持链式调用和状态码显式设置
CI4.4.5 原生实现 RESTful 路由的正确写法
CI4 不靠方法后缀(如 users_get)来区分 HTTP 动词,而是通过 routes.php 显式绑定动词到控制器方法。这是最稳定、最可控的方式。
- 在
app/Config/Routes.php中注册资源路由或手动路由 - 使用
$routes->resource()可一键生成标准 CRUD 路由(推荐用于常规 API) - 使用
$routes->add()或$routes->post()等可精确控制每个端点
示例(标准资源路由):
$routes->resource('api/users', ['controller' => 'Users']);
这会自动映射:GET /api/users → Users::index()GET /api/users/(:segment) → Users::show($id)POST /api/users → Users::create()PUT /api/users/(:segment) → Users::update($id)DELETE /api/users/(:segment) → Users::delete($id)
控制器中如何安全获取和响应数据
CI4.4.5 的 $this->request 对象已预解析全部输入源,无需再判断是 JSON 还是 form-data;但你得主动校验内容类型和参数存在性。
- 用
$this->request->getJSON(true)获取 JSON body(true表示递归转为关联数组) - 用
$this->request->getPost()获取表单数据,$this->request->getGet()获取查询参数 - 用
$this->response->setStatusCode(201)显式设状态码,不要只靠json()默认 200 - 返回前务必检查关键字段,比如
POST /api/users必须验证name和email是否存在且非空
简短示例(app/Controllers/Users.php):
public function create()
{
$data = $this->request->getJSON(true);
if (empty($data->name) || empty($data->email)) {
return $this->failValidationErrors(['name' => 'Name is required', 'email' => 'Email is required']);
}
// 插入逻辑...
return $this->respond(['id' => 123, 'name' => $data->name], 201);
}
容易被忽略的跨域和格式问题
开发时本地前端(Vue/React)常跑在 http://localhost:3000,而 CI4 默认拒绝跨域请求,且不自动设置 Content-Type: application/json 响应头——这两点不处理,前端 fetch 会静默失败或解析出错。
- 启用 CORS:在
app/Config/Filters.php中启用'cors'filter,并配置app/Config/Filters.php的$globals或按需加到路由组 - 确保响应头正确:CI4 的
$this->respond()默认设Content-Type: application/json,但若你用echo json_encode(...)手动输出,必须自己加header('Content-Type: application/json') - 调试时用
curl -v查看真实响应头,别只信浏览器 Network 面板的「Preview」
真正卡住人的从来不是“怎么写个 API”,而是“为什么前端收不到数据”——大概率是 CORS 没开,或者响应头缺失,或者状态码没设对。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











