yii2暴露restful api需继承yii\rest\activecontroller、配置url规则启用rest模式、禁用csrf并统一json响应;jwt认证须用sizeg/yii2-jwt扩展,手动实现loginbyaccesstoken和findidentitybyaccesstoken,严格校验token头格式与密钥一致性。

Yii2怎么暴露RESTful API接口
默认的 Yii2 应用走的是传统 MVC 渲染流程,要对外提供 JSON 接口,得绕过视图层、禁用 CSRF 验证、统一响应格式。核心是把控制器变成 yii\rest\ActiveController 或继承 yii\rest\Controller,而不是普通 yii\web\Controller。
- 路由必须启用
urlManager的 REST 模式:配置里加'enablePrettyUrl' => true和'enableStrictParsing' => true,再定义'rules' => ['class' => 'yii\rest\UrlRule', 'controller' => 'user'] -
ActiveController会自动绑定index/view/create等动作,但前提是模型必须实现findModel($id),否则404不报错、只返回空数组 - 别在 API 控制器里调用
$this->render(),它会强行触发视图渲染,导致 JSON 响应混入 HTML 片段;改用return $model->attributes或return ['data' => $model] - 全局关闭 CSRF:在
config/web.php的request组件里加'enableCsrfValidation' => false;如果只关 API 模块,就在对应模块的beforeAction里设\Yii::$app->request->enableCsrfValidation = false
Yii2里JWT认证怎么接入
Yii2 官方不内置 JWT,得靠扩展,最稳的是 sizeg/yii2-jwt(注意不是过时的 lightit/yii2-jwt)。它不接管登录逻辑,只负责解析和验证 token,你得自己决定什么时候签发、存在哪、怎么传。
- 安装后,在
config/web.php的components里注册jwt组件:'jwt' => ['class' => 'sizeg\jwt\Jwt', 'key' => 'your-secret-key', 'algorithm' => 'HS256'] - 验证 token 要手动写在行为(
behaviors())里:用authenticator行为 + 自定义JwtHttpBearerAuth类,不能直接塞HttpBearerAuth—— 后者只认Basic头,JWT 必须是Bearer xxx - 前端传 token 必须带
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...,少一个空格或拼错Bearer就会静默失败,日志里只显示Unauthorized,没具体原因 - token 过期后,
jwt组件抛sizeg\jwt\exceptions\JwtException,不是yii\web\UnauthorizedHttpException,所以errorHandler要显式捕获并转成 401
Yii2 API里怎么控制登录态和用户信息获取
JWT 本质是无状态的,\Yii::$app->user 默认依赖 session,直接调 \Yii::$app->user->identity 会是 null。必须重写 User 组件的 loginByAccessToken,让它从 header 的 token 解出用户 ID 再查库。
- 在
config/web.php的user组件里加'loginUrl' => null(禁用跳转),并指定'identityClass' => 'app\models\User' -
User类必须实现findIdentityByAccessToken($token, $type = null)方法:用\Yii::$app->jwt->getParser()->parse($token)解码,再查User::findOne(['id' => $payload['uid']]) - 别在
findIdentityByAccessToken里做 token 过期校验——jwt组件已在校验阶段抛异常;这里只管查用户,查不到就返回null,否则\Yii::$app->user->id拿不到值 - 敏感操作(如改密码)建议额外校验 token 中的
jti(唯一标识)是否在黑名单里,否则换设备登录不会使旧 token 失效
常见 401/404/500 错误怎么快速定位
API 报错往往没堆栈、没提示,尤其在 Nginx + PHP-FPM 环境下,错误被吞掉一半。关键不是看浏览器响应,而是盯住 runtime/logs/app.log 和 access.log 里的原始请求路径与响应码。
-
401 Unauthorized:先确认请求头有Authorization,再检查jwt组件的key是否和签发时一致(大小写、空格、换行都算不同);HS256和RS256混用也会 401 -
404 Not Found:90% 是路由没配对——比如访问/api/v1/users,但UrlRule里写的是'controller' => 'user'(单数),而控制器类名是UserController(正确),但 action 名写成actionIndexs就会 404 -
500 Internal Server Error:打开YII_DEBUG,看 log 里有没有Invalid Parameter – yii\base\InvalidParamException,常因ActiveController的modelClass指向不存在的类,或模型没实现findModel - Postman 测试时记得关掉「Automatically persist cookies」,不然 session 和 JWT token 可能互相污染,出现「刚登录就掉线」的假象
JWT 的 payload 里塞太多字段(比如整个用户权限树)会让 token 膨胀到 2KB+,HTTP header 超长被 Nginx 截断,这时候错误表现是 400 或直接连接重置,而不是任何可读提示
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











