在 Yii 2.0 的 RESTful APIs 中,view:返回指定资源的详情,HTTP 动词同时支持 GET 与 POST 的实现
1、在 Postman 中 GET 请求指定资源的详情,响应 200,如图1
2、查看路由配置,代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | /* 任务管理 */ [ 'class' => 'yii\rest\UrlRule' , 'controller' => [ 'v1/plan-task' ], 'only' => [ 'log-create' , 'index' , 'have' , 'export' , 'have-export' , 'create' , 'view' , 'update' , 'claim' , 'delete' , 'finish' , 'transfer' , 'video-edit' , 'write' , 'write-feed' , 'commit-article' , 'article-review' , 'disable' , 'upload' , 'enable' , 'edit' ], 'tokens' => [ '{id}' => '<id:\\w[\\w,:;]*>' ], 'extraPatterns' => [ 'GET have' => 'have' , 'GET export' => 'export' , 'GET have-export' => 'have-export' , 'PUT claim/{id}' => 'claim' , 'PUT finish/{id}' => 'finish' , 'POST log/{id}' => 'log-create' , 'GET {id}' => 'view' , 'GET edit/{id}' => 'edit' , 'PUT update' => 'update' , 'PUT transfer/{id}' => 'transfer' , 'GET video-edit/{id}' => 'video-edit' , 'GET write/{id}' => 'write' , 'GET write-feed/{id}' => 'write-feed' , 'GET commit-article/{id}' => 'commit-article' , 'GET article-review/{id}' => 'article-review' , 'PUT disable/{id}' => 'disable' , 'GET upload/{id}' => 'upload' , 'PUT enable/{id}' => 'enable' , ], ], |
3、查看控制器,代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | <?php /** * Created by PhpStorm. * User: Qiang Wang * Date: 2018/05/05 * Time: 11:43 */ namespace api\controllers; use yii\rest\ActiveController; class PlanTaskController extends ActiveController { public $serializer = [ 'class' => 'api\rests\plan_task\Serializer' , 'collectionEnvelope' => 'items' , ]; /** * @inheritdoc */ public function actions() { $actions = parent::actions(); // 禁用"options"动作 unset( $actions [ 'options' ]); $actions [ 'index' ][ 'class' ] = 'api\rests\plan_task\IndexAction' ; $actions [ 'create' ][ 'class' ] = 'api\rests\plan_task\CreateAction' ; $actions [ 'view' ][ 'class' ] = 'api\rests\plan_task\ViewAction' ; $actions [ 'update' ][ 'class' ] = 'api\rests\plan_task\UpdateAction' ; $actions [ 'delete' ][ 'class' ] = 'api\rests\plan_task\DeleteAction' ; $actions [ 'have' ] = [ 'class' => 'api\rests\plan_task\HaveAction' , 'modelClass' => $this ->modelClass, 'checkAccess' => [ $this , 'checkAccess' ], ]; $actions [ 'export' ] = [ 'class' => 'api\rests\plan_task\ExportAction' , 'modelClass' => $this ->modelClass, 'checkAccess' => [ $this , 'checkAccess' ], ]; $actions [ 'have-export' ] = [ 'class' => 'api\rests\plan_task\HaveExportAction' , 'modelClass' => $this ->modelClass, 'checkAccess' => [ $this , 'checkAccess' ], ]; $actions [ 'edit' ] = [ 'class' => 'api\rests\plan_task\EditAction' , 'modelClass' => $this ->modelClass, 'checkAccess' => [ $this , 'checkAccess' ], ]; $actions [ 'claim' ] = [ 'class' => 'api\rests\plan_task\ClaimAction' , 'modelClass' => $this ->modelClass, 'checkAccess' => [ $this , 'checkAccess' ], ]; $actions [ 'finish' ] = [ 'class' => 'api\rests\plan_task\FinishAction' , 'modelClass' => $this ->modelClass, 'checkAccess' => [ $this , 'checkAccess' ], ]; $actions [ 'transfer' ] = [ 'class' => 'api\rests\plan_task\TransferAction' , 'modelClass' => $this ->modelClass, 'checkAccess' => [ $this , 'checkAccess' ], ]; $actions [ 'video-edit' ] = [ 'class' => 'api\rests\plan_task\VideoEditAction' , 'modelClass' => $this ->modelClass, 'checkAccess' => [ $this , 'checkAccess' ], ]; $actions [ 'write' ] = [ 'class' => 'api\rests\plan_task\WriteAction' , 'modelClass' => $this ->modelClass, 'checkAccess' => [ $this , 'checkAccess' ], ]; $actions [ 'write-feed' ] = [ 'class' => 'api\rests\plan_task\WriteFeedAction' , 'modelClass' => $this ->modelClass, 'checkAccess' => [ $this , 'checkAccess' ], ]; $actions [ 'commit-article' ] = [ 'class' => 'api\rests\plan_task\CommitArticleAction' , 'modelClass' => $this ->modelClass, 'checkAccess' => [ $this , 'checkAccess' ], ]; $actions [ 'article-review' ] = [ 'class' => 'api\rests\plan_task\ArticleReviewAction' , 'modelClass' => $this ->modelClass, 'checkAccess' => [ $this , 'checkAccess' ], ]; $actions [ 'disable' ] = [ 'class' => 'api\rests\plan_task\DisableAction' , 'modelClass' => $this ->modelClass, 'checkAccess' => [ $this , 'checkAccess' ], ]; $actions [ 'upload' ] = [ 'class' => 'api\rests\plan_task\UploadAction' , 'modelClass' => $this ->modelClass, 'checkAccess' => [ $this , 'checkAccess' ], ]; $actions [ 'enable' ] = [ 'class' => 'api\rests\plan_task\EnableAction' , 'modelClass' => $this ->modelClass, 'checkAccess' => [ $this , 'checkAccess' ], ]; $actions [ 'log-create' ] = [ 'class' => 'api\rests\plan_task\LogCreateAction' , 'modelClass' => $this ->modelClass, 'checkAccess' => [ $this , 'checkAccess' ], ]; $actions [ 'status-count' ] = [ 'class' => 'api\rests\plan_task\StatusCountAction' , 'modelClass' => $this ->modelClass, 'checkAccess' => [ $this , 'checkAccess' ], ]; return $actions ; } } |
4、在 Postman 中 POST 请求指定资源的详情,响应 404,如图2
1 2 3 4 5 6 7 | { "name": "Not Found", "message": "页面未找到。", "code": 0, "status": 404, "type": "yii\\web\\NotFoundHttpException" } |
5、调整路由配置,GET /plan-tasks/79 和 POST /plan-tasks/79:返回资源ID为 79 的详细信息
1 | 'GET,POST {id}' => 'view' , |
6、在 Postman 中 POST 请求指定资源的详情,响应 405,不允许的方法。该 URL 仅可以处理以下请求方法:GET,HEAD。如图3
1 2 3 4 5 6 7 | { "name": "Method Not Allowed", "message": "Method Not Allowed. This URL can only handle the following request methods: GET, HEAD.", "code": 0, "status": 405, "type": "yii\\web\\MethodNotAllowedHttpException" } |
7、查看日志,在过滤器 verbFilter:支持 HTTP 方法验证 处验证失败,如图4
1 2 3 4 5 6 7 8 9 10 11 12 | yii\web\MethodNotAllowedHttpException: Method Not Allowed. This URL can only handle the following request methods: GET, HEAD. in E:\wwwroot\pcs-api-feature-php-7.4\vendor\yiisoft\yii2\filters\VerbFilter.php:105 Stack trace: #0 [internal function]: yii\filters\VerbFilter->beforeAction(Object(yii\base\ActionEvent)) #1 E:\wwwroot\pcs-api-feature-php-7.4\vendor\yiisoft\yii2\base\Component.php(627): call_user_func(Array, Object(yii\base\ActionEvent)) #2 E:\wwwroot\pcs-api-feature-php-7.4\vendor\yiisoft\yii2\base\Controller.php(276): yii\base\Component->trigger('beforeAction', Object(yii\base\ActionEvent)) #3 E:\wwwroot\pcs-api-feature-php-7.4\vendor\yiisoft\yii2\web\Controller.php(188): yii\base\Controller->beforeAction(Object(api\rests\plan_task\ViewAction)) #4 E:\wwwroot\pcs-api-feature-php-7.4\vendor\yiisoft\yii2\base\Controller.php(155): yii\web\Controller->beforeAction(Object(api\rests\plan_task\ViewAction)) #5 E:\wwwroot\pcs-api-feature-php-7.4\vendor\yiisoft\yii2\base\Module.php(528): yii\base\Controller->runAction('view', Array) #6 E:\wwwroot\pcs-api-feature-php-7.4\vendor\yiisoft\yii2\web\Application.php(103): yii\base\Module->runAction('v1/plan-task/vi...', Array) #7 E:\wwwroot\pcs-api-feature-php-7.4\vendor\yiisoft\yii2\base\Application.php(386): yii\web\Application->handleRequest(Object(yii\web\Request)) #8 E:\wwwroot\pcs-api-feature-php-7.4\api\web\index.php(17): yii\base\Application->run() #9 {main} |
8、在控制器中覆盖 yii\rest\ActiveController 的 verbs 方法,添加对于 POST 的支持
1 2 3 4 5 6 7 8 9 | /** * {@inheritdoc} */ protected function verbs() { $verbs = parent::verbs(); $verbs [ 'view' ] = [ 'GET' , 'HEAD' , 'POST' ]; return $verbs ; } |
9、在 Postman 中 GET 或者 POST 请求指定资源的详情,响应 200,如图5
近期评论