yii2构建restful api需配置urlmanager启用enableprettyurl和enablestrictparsing,将yii\rest\urlrule置于规则末尾并设controller为['v1/user'];控制器继承yii\rest\activecontroller并指定$modelclass;模型需定义rules();jwt认证须正确设置authorization头格式及挂载authenticator行为;统一响应结构应通过自定义apiresponse组件实现。

Yii 框架做 RESTful API 不需要从零写路由和动作分发逻辑,yii\rest\ActiveController 已经把 CRUD 映射、HTTP 状态码、JSON 响应格式都封装好了——但直接继承就跑起来,90% 的项目会在版本控制、认证或响应结构上翻车。
怎么配 urlManager 才让 /v1/users 自动走 REST 路由
关键不是加规则,而是避免 enableStrictParsing 和 urlManager 规则顺序冲突。常见错误是写了自定义规则后,yii\rest\UrlRule 失效,导致 GET /v1/users 404。
- 必须在
config/web.php的urlManager中启用'enablePrettyUrl' => true和'enableStrictParsing' => true -
rules数组里,yii\rest\UrlRule要放在所有自定义规则之后,否则会被前置规则拦截 - 模块路径要对齐:如果控制器在
api\modules\v1\controllers\UserController,urlRule的controller必须写成['v1/user'](小写、无命名空间、斜杠分隔) - 别漏掉
'showScriptName' => false,否则 Nginx/Apache 重写没生效时,index.php/v1/users会 fallback 到默认路由,不触发 REST 行为
为什么继承 ActiveController 后 POST /users 返回 400 或空响应
根本原因不是验证失败,而是模型层的 rules() 没定义,或控制器没显式启用数据验证行为。Yii2 默认不自动校验输入字段,ActiveController 只负责转发请求,不插手数据合法性。
- 确保模型类(如
app\models\User)的rules()方法返回了非空数组,例如['name', 'required'] - 控制器中不要覆盖
actions()除非必要;若覆盖,需手动调用parent::actions()并保留'create'动作 - POST 请求体必须是 JSON 格式且 Content-Type 设为
application/json;表单编码(application/x-www-form-urlencoded)默认不被解析,会静默丢弃数据 - 调试时用
curl -H "Content-Type: application/json" -d '{"name":"test"}' http://localhost/v1/users直接绕过前端,确认是否是客户端传参问题
JWT 认证为什么总卡在 401,连 authenticate() 都没进
不是密钥错了,而是 Authorization 请求头格式不对,或者行为没挂到控制器上。Yii2 的 authenticator 行为默认只检查 Bearer 前缀,且对 header 名大小写敏感。
- 请求头必须是
Authorization: Bearer xxxxx,不能是authorization小写,也不能漏掉空格 - 控制器的
behaviors()必须显式包含'authenticator',且该行为要继承yii\filters\auth\AuthMethod(不是AuthBehavior) - 如果用了 nginx,确认它没有过滤掉
Authorization头;常见配置缺失:fastcgi_pass_request_headers on;和proxy_pass_request_headers on; - 测试时先临时注释掉
authenticator,确认接口本身能通,再逐步加回认证逻辑,避免混淆问题根源
如何让所有接口统一返回 {code, message, data} 结构
改 response 组件比在每个控制器里 return ['data' => $xxx] 更可靠,但必须避开 yii\web\Response::FORMAT_JSON 的默认包装机制,否则会套两层 data。
- 新建
components/ApiResponse.php,继承yii\web\Response,重写prepare(),在parent::prepare()后处理$this->data,而不是直接赋值 - 在
config/web.php中配置'response' => ['class' => 'app\components\ApiResponse', 'format' => Response::FORMAT_JSON] - 异常响应也要走这个流程:在
errorHandler配置里设'errorAction' => 'v1/error',并在该控制器中手动构造相同结构的响应,否则 4xx/5xx 仍会走原始格式 - 注意:
yii\rest\ActiveController的serializeData()方法也会介入,如果自定义了该方法,需同步适配新结构
最易忽略的是模块加载顺序和 Nginx header 透传——很多“认证不生效”“路由 404”问题,实际跟 Yii 代码无关,而是环境配置断在了第一跳。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











