yii restful接口返回404或405,先检查url和路由配置:确认config/web.php中urlmanager启用enableprettyurl、enablestrictparsing设为false,并正确配置yii\rest\urlrule;若加index.php可通,则是web服务器重写规则未生效。

Yii RESTful接口返回404或405,先检查URL和路由配置
Yii默认不自动启用RESTful路由,直接访问 /api/v1/users 却报404,大概率是没配好 urlManager。别急着改控制器,先确认 config/web.php 里是否启用了 enablePrettyUrl 和 enableStrictParsing,后者设为 false 能避免因大小写或斜杠多一个就挂掉。
常见错误现象:本地用 php yii serve 启动后,Postman发 GET http://localhost:8080/api/v1/users 返回404;但加了 index.php(如 http://localhost:8080/index.php/api/v1/users)却能通——说明重写规则没生效,Apache/Nginx 配置漏了,不是Yii代码问题。
- 确保
urlManager中rules包含'api/<controller:>/<id:>' => '<controller>/view'</controller></id:></controller:>这类REST风格规则 - 如果用的是 Yii 2.0.14+,推荐直接用
yii\rest\UrlRule:['class' => 'yii\rest\UrlRule', 'controller' => ['v1/user']] - Yii 3.x 则需确认
ApiRouter是否已注册,且控制器继承自yii\rest\ActiveController
Postman里发POST/PUT请求总被Yii拦截为400或415
Yii对非GET请求默认校验CSRF Token和Content-Type,没处理好就会直接拒绝。这不是Postman的问题,而是请求构造不匹配框架预期。
典型表现:Postman选了 Body → raw → JSON,填了数据,但响应是 "message": "Request body is not valid JSON" 或空的400;或者发 application/x-www-form-urlencoded 却提示415 Unsupported Media Type。
- 确保Header里设置了
Content-Type: application/json(JSON请求)或application/x-www-form-urlencoded(表单) - Yii 2 默认开启CSRF验证,REST接口通常要关掉:在控制器里加
public $enableCsrfValidation = false; - 若必须保留CSRF(比如混合页面场景),得在Postman里手动加Header:
X-CSRF-Token: {{csrf_token}},并通过前置请求先获取token(用Tests脚本提取并存为变量) - Yii 3 默认关闭CSRF for API,但需确认
RequestParser配置支持JSON解析
如何在Postman里复现Yii的Authenticator(如Bearer Token)校验逻辑
Yii的 authMethods(比如 HttpBearerAuth)要求Header带 Authorization: Bearer xxx,Postman不填或格式错,直接返回401。
容易踩的坑是:复制了token但开头多了空格、结尾多了换行,或误用了Basic Auth模板;还有人把token存在Body里,完全没走Header。
- 在Postman的
Authorization标签页选Bearer Token,粘贴纯token字符串(不含Bearer前缀) - 如果token来自登录接口,用Tests脚本自动提取:
pm.test("Save token", function () { var jsonData = pm.response.json(); pm.environment.set("auth_token", jsonData.token); }); - 后续请求的Authorization就设为
Bearer {{auth_token}},别手输——token过期或格式错时,401响应体里通常有"name":"Unauthorized",可加断言验证:pm.response.to.have.status(401) - 注意Yii默认只认
AuthorizationHeader,不接受X-Authorization或其他别名
Yii返回的JSON结构混乱,Postman断言写不对
Yii RESTful默认包装响应为 {"success":true,"data":{...},"message":""}(取决于你是否用了 yii\rest\Controller::serializeData() 或自定义 ResponseFormatter),但新手常按原始AR模型字段写断言,结果一直fail。
比如控制器返回 return $model;,你以为响应体是 {"id":1,"name":"test"},实际可能是 {"success":true,"data":{"id":1,"name":"test"}},导致 json.id 找不到。
- 先在Postman响应区点
Pretty查看真实结构,别猜 - 断言要分层写:先确认
pm.response.to.have.status(200),再取pm.response.json().data.id而不是pm.response.json().id - 如果用Yii 2的
ActiveController,默认会把单个模型包进data,列表包进data数组,分页还带_meta字段——这些都得在断言里显式展开 - 不想被包装?重写
serializeData()方法,或临时在测试环境禁用ResponseFormatter
真正卡住人的往往不是Postman操作,而是没看清Yii哪一层在改响应——是行为(Behavior)、序列化器(Serializer)、还是自定义的beforeAction。调试时优先看network里原始响应体,再反推框架配置。否则光调Postman,永远在绕圈。











