Yii2创建RESTful风格Api接口

使用Yii可以非常方便的创建一个RESTful web service.

首先我们需要在WEB前端(frontend)和WEB后端(backend)的同级目录新建一个API目录,其目录结构为:

|--assets
|
|    AppAsset.php
|
|--config
|    bootstrap.php
|    main-local.php
|    main.php
|    params-local.php
|    params.php
|
|--runtime
|__web
     |
     |  index.php
     |--assets
     |__css

我们看到其结构和我们的frontend有些相似,所以我们可以直接copy一份frontend内容目录到api目录下,根据我们所需目录结构将多余文件删除即可。

然后我们需要在common/config/bootstrap.php文件中增加新建应用的别名。

Yii::setAlias('@api', dirname(dirname(__DIR__)) . '/api');

美化路由

前提需要我们web服务器开启rewrite规则,具体内容可以参考我们以前的文章 yii2路由重写

接下来我们来配置api/config/main.php文件。

//美化路由
'urlManager' => [
            'enablePrettyUrl' => true,//是否开启URL美化
            'showScriptName' => false,//是否忽略脚本名index.php
            'enableStrictParsing' =>true,//是否开启严格路由解析
            'rules' => [],
        ],

enablePrettyUrl和showScriptName我们会经常用到这里不多做解释,重点来说下enableStrictParsing这货是做什么用的呢?假设我们在开启了路由美化的功能(enablePrettyUrl设置为true),enableStrictParsing设置为false的情况下,我们直接访问/index.php/blog/index肯定是没有问题的。但是如果我们直接访问/index.php?r=blog%2Findex呢?发现页面展示的效果是/site/index(实际上这里展示的默认的路由页面),并非是博客列表页面。如果我们把enableStrictParsing参数设置为true你会发现页面直接抛出404。因为这货设置为true之后,会匹配rules选项中设定的至少一个规则,那我们这里先设置一个路由,不然没法继续了。

利用gii来生成测试用的modules

为了方便演示,我们来新建一张books数据表,顺便插入几条数据。

CREATE TABLE `books` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(128) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `books` VALUES ('', '数据结构');
INSERT INTO `books` VALUES ('2', 'c语言');
INSERT INTO `books` VALUES ('3', 'php高级应用');
INSERT INTO `books` VALUES ('4', '算法概论');
INSERT INTO `books` VALUES ('5', 'java初级');

利用yii2的gii创建一个modules.

创建books控制器

创建books的数据模型

为了使我们创建的modules可以访问,我们需要在api/config/main.php中配置一下代码

<?php    
    ......
    'modules' => [
        'v1' => [
            'class' => 'api\modules\v1\Module',
        ],
    ],
    ......

为了实现RESTful风格的api我们需要对生成的控制器进行改写;

<?php

namespace api\modules\v1\controllers;

use yii\rest\ActiveController;

class BooksController extends ActiveController
{
    public $modelClass = 'api\models\Books';
}

为books配置Url规则

'rules' => [
    [
        'class' => 'yii\rest\UrlRule',
        'controller' => ['v1/books']
    ],
]

这样一个基本的RESTful风格的api接口就创建完成了,是不是很简单?

建议使用Postman进行模拟请求。

yii2对api封装了多种操作具体如下

  • GET /books: 逐页列出所有书籍
  • HEAD /books: 显示书籍列表的概要信息
  • POST /books: 创建一个新书籍数据
  • GET /books/1: 返回书籍 1的详细信息
  • HEAD /books/1: 显示书籍 1 的概述信息
  • PATCH /books/1 and PUT /books/1: 更新书籍1数据
  • DELETE /books/1: 删除书籍1
  • OPTIONS /books: 显示关于末端 /books 支持的动词
  • OPTIONS /books/1: 显示有关末端 /books/1 支持的动词

还有一点需要注意的:

如果你的控制器末端不是复数(比如是book非books)请保证请求的时候是复数!这是因为在RESTful架构中,网址中只能有名词而不能包含动词,名词又往往与数据表相对应,数据表呢又是一个“集合”,因此该名词往往是复数的形式。