Yii 提供了一整套工具来简化实现 RESTful Web 服务 API 的任务。特别是,Yii 支持以下有关 RESTful API 的功能
OPTIONS
和 HEAD
动词的内置支持;在以下内容中,我们使用一个示例来说明如何用最少的编码量构建一组 RESTful API。
假设您想通过 RESTful API 暴露用户数据。用户数据存储在 user
数据库表中,您已经创建了 活动记录 类 app\models\User
来访问用户数据。
首先,创建一个 控制器 类 app\controllers\UserController
,如下所示
namespace app\controllers;
use yii\rest\ActiveController;
class UserController extends ActiveController
{
public $modelClass = 'app\models\User';
}
控制器类继承自 yii\rest\ActiveController,它实现了一组通用的 RESTful 动作。通过将 modelClass 指定为 app\models\User
,控制器知道可以使用哪个模型来获取和操作数据。
然后,修改应用程序配置中 urlManager
组件的配置
'urlManager' => [
'enablePrettyUrl' => true,
'enableStrictParsing' => true,
'showScriptName' => false,
'rules' => [
['class' => 'yii\rest\UrlRule', 'controller' => 'user'],
],
]
以上配置主要为 user
控制器添加了一个 URL 规则,以便可以使用漂亮的 URL 和有意义的 HTTP 动词来访问和操作用户数据。
注意:Yii 会自动将控制器名称变为复数形式,以便在端点中使用(参见下面的 试用 部分)。您可以使用 yii\rest\UrlRule::$pluralize 属性来配置此行为。
为了让 API 接受 JSON 格式的输入数据,请配置 parsers 属性 request
应用程序组件 使用 yii\web\JsonParser 用于 JSON 输入
'request' => [
'parsers' => [
'application/json' => 'yii\web\JsonParser',
]
]
信息:以上配置是可选的。如果没有以上配置,API 将只识别
application/x-www-form-urlencoded
和multipart/form-data
输入格式。
通过以上最小的努力,您已经完成了创建用于访问用户数据的 RESTful API 的任务。您创建的 API 包括
GET /users
: 分页列出所有用户;HEAD /users
: 显示用户列表的概述信息;POST /users
: 创建新用户;GET /users/123
: 返回用户 123 的详细信息;HEAD /users/123
: 显示用户 123 的概述信息;PATCH /users/123
和 PUT /users/123
: 更新用户 123;DELETE /users/123
: 删除用户 123;OPTIONS /users
: 显示关于端点 /users
的支持动词;OPTIONS /users/123
: 显示关于端点 /users/123
的支持动词。您可以使用 curl
命令访问您的 API,例如以下命令:
$ curl -i -H "Accept:application/json" "http://localhost/users"
HTTP/1.1 200 OK
...
X-Pagination-Total-Count: 1000
X-Pagination-Page-Count: 50
X-Pagination-Current-Page: 1
X-Pagination-Per-Page: 20
Link: <http://localhost/users?page=1>; rel=self,
<http://localhost/users?page=2>; rel=next,
<http://localhost/users?page=50>; rel=last
Transfer-Encoding: chunked
Content-Type: application/json; charset=UTF-8
[
{
"id": 1,
...
},
{
"id": 2,
...
},
...
]
尝试将可接受的内容类型更改为 application/xml
,您将看到结果以 XML 格式返回
$ curl -i -H "Accept:application/xml" "http://localhost/users"
HTTP/1.1 200 OK
...
X-Pagination-Total-Count: 1000
X-Pagination-Page-Count: 50
X-Pagination-Current-Page: 1
X-Pagination-Per-Page: 20
Link: <http://localhost/users?page=1>; rel=self,
<http://localhost/users?page=2>; rel=next,
<http://localhost/users?page=50>; rel=last
Transfer-Encoding: chunked
Content-Type: application/xml
<?xml version="1.0" encoding="UTF-8"?>
<response>
<item>
<id>1</id>
...
</item>
<item>
<id>2</id>
...
</item>
...
</response>
以下命令将通过发送包含 JSON 格式用户数据的 POST 请求来创建新用户
$ curl -i -H "Accept:application/json" -H "Content-Type:application/json" \
-XPOST "http://localhost/users" \
-d '{"username": "example", "email": "[email protected]"}'
HTTP/1.1 201 Created
...
Location: http://localhost/users/1
Content-Length: 99
Content-Type: application/json; charset=UTF-8
{"id":1,"username":"example","email":"[email protected]","created_at":1414674789,"updated_at":1414674789}
提示:您也可以通过在 Web 浏览器中输入 URL
http://localhost/users
来访问您的 API。但是,您可能需要一些浏览器插件来发送特定的请求头。
如您所见,在响应头中,包含关于总计数、页数等信息。还有一些链接允许您导航到其他数据页面。例如,http://localhost/users?page=2
将为您提供用户数据的下一页。
使用 fields
和 expand
参数,您还可以指定结果中应包含哪些字段。例如,URL http://localhost/users?fields=id,email
将仅返回 id
和 email
字段。
信息:您可能已经注意到
http://localhost/users
的结果包含一些敏感字段,例如password_hash
、auth_key
。您当然不希望这些出现在您的 API 结果中。您可以并且应该根据资源部分所述从结果中删除这些字段。
此外,您可以对集合进行排序,例如 http://localhost/users?sort=email
或 http://localhost/users?sort=-email
。可以使用数据过滤器来过滤集合,例如 http://localhost/users?filter[id]=10
或 http://localhost/users?filter[email][like]=gmail.com
。有关详细信息,请参见过滤集合部分。
为了更改模型列表的默认分页和排序,您可以在控制器中配置yii\rest\IndexAction。例如
<?php
namespace app\controllers;
use yii\rest\ActiveController;
use yii\helpers\ArrayHelper;
class UserController extends ActiveController
{
public $modelClass = 'app\models\User';
public function actions()
{
return ArrayHelper::merge(parent::actions(), [
'index' => [
'pagination' => [
'pageSize' => 10,
],
'sort' => [
'defaultOrder' => [
'created_at' => SORT_DESC,
],
],
],
]);
}
}
有关如何配置 ActiveController 的操作的更多信息,请参见扩展 ActiveController。
使用 Yii RESTful API 框架,您可以根据控制器操作来实现 API 端点,并且您可以使用控制器来组织实现单个资源类型端点的操作。
资源表示为数据模型,这些数据模型从yii\base\Model类扩展而来。如果您正在处理数据库(关系型或 NoSQL),建议您使用ActiveRecord来表示资源。
您可以使用yii\rest\UrlRule来简化路由到您的 API 端点。
虽然不是必需的,但建议您将 RESTful API 作为与 Web 前端和后端不同的独立应用程序进行开发,以便于维护。
发现错别字或您认为此页面需要改进?
在 github 上编辑它 !
要返回 json,请在响应中添加以下内容
**components' => [
*//other config...* 'response' => [ 'format' => yii\web\Response::FORMAT_JSON, 'charset' => 'UTF-8', // ... ],** * //other config...*
默认配置根据请求头返回 xml 或 json,当您从浏览器打开时 - 您将获得 xml,使用以下头您将获得 json:Accept: application/json; q=1.0, /; q=0.1
这是最佳实践,因为它可以让第三方开发人员更自由地选择格式
404 错误 - 当我按照本教程操作时。
此服务器上未找到所请求的 URL。
应该添加更具体的代码示例和信息,以供 N00bs 使用。
此示例不是最佳示例,因为它使用
app\models\User
模型,而在基本的 Yii2 应用程序(以及在按照本教程创建的应用程序中)中,app\models\User
模型用作应用程序配置中的identityClass
。也许我们应该将本教程建立在 app\models\Country 模型上,该模型是 使用数据库 部分的一部分?或者至少提醒用户注意以上情况?
正如 @hawkwynd 所说,本教程存在错误。启用
'enableStrictParsing' => true
会导致整个应用程序停止工作,并在几乎所有请求(包括http://localhost/)上抛出 404 错误。不仅与 REST 相关的请求失败,而且整个应用程序无法正常工作。如果您将
'enableStrictParsing' => false
(或者简单地删除此行,因为此配置项默认值为false
),那么 REST 示例和剩余的应用程序都将正常工作,没有任何问题。我尝试找出为什么启用
'enableStrictParsing' => true
会导致这些问题,但我失败了,最终不得不注释掉这一行。@Trejder 停止工作的原因是,此选项意味着它只解析明确声明的 URL 路由。由于您可能没有声明任何路由,因此没有任何内容可以正常工作。例如,当您只想允许特定的 API 调用而不是其他任何内容时,可以使用此选项。
注册或登录以发表评论。