在本 使用Yii2编程系列中 ,我指导读者使用PHP的Yii2框架。 您可能还对我 的Yii Framework简介 感兴趣 ,它 介绍了Yii 的好处,并概述了Yii 2.x的新增功能。
在今天的教程中,我将回顾如何在Yii中构建REST API,以将您的应用程序连接到云,移动应用程序和其他服务。 我将指导您阅读Yii的REST API快速入门指南,并提供上下文和常见请求示例。
Yii REST API入门
实际上,在Yii中构建REST API非常简单。 您可以利用现有的MVC框架,但是您正在创建一个打算供不同类型的服务(而非网站访问者)访问的独特访问点。
Yii REST框架的好处
Yii框架为构建API提供了广泛的支持和详细的文档。 以下是构建API时的一些内置功能:
- 支持Active Record常用API的快速原型设计。 这使您可以通过API快速轻松地公开数据模型CRUD功能。
- 响应格式协商(默认情况下支持JSON和XML)。 内置支持以通用输出格式返回数据。
- 可定制的对象序列化,支持可选的输出字段。 修改返回的数据很容易。
- 正确格式化收集数据和验证错误。
- 支持将超媒体作为应用程序状态引擎(HATEOAS)
- 带有正确的HTTP动词检查的高效路由。
- 对
OPTIONS
和HEAD
动词的内置支持。 - 认证和授权。
- 数据缓存和HTTP缓存。
- 速率限制。
今天,我将没有机会接触到所有这一切。
我对REST API的兴趣
在本集中,我将构建一个API,以使我们可以从Twitter API教程中处理在Twixxr服务中创建的Item表。 但是我还计划为我们的入门教程系列 会议Meeting Planner构建API。 为该服务构建iOS应用程序将需要安全的API。 该API将启用移动应用程序与云服务之间的通信。
构建REST控制器
使用Yii的REST框架,我们将为我们的API创建一个端点,并为每种类型的资源组织控制器。
资源本质上是我们应用程序的数据模型。 这些扩展了yii \ base \ Model 。
yii \ rest \ UrlRule类提供了将我们的数据模型映射到API CRUD端点的现成路由:
创建树以充当API端点
在Yii2 Advanced模板中 ,有一个前端和后端树,并且这是可扩展的。 为了分离出API功能,我们将创建第三棵树以纯粹充当API端点。
Yii开发人员Alex Makarov提供了此有用的指南来创建其他树 ,随后我创建了第三棵树:
$ cp -R backend api
$ cp -R environments/dev/backend/ environments/dev/api
$ cp -R environments/prod/backend/ environments/prod/api
然后,我使用Atom编辑器进行了全局查找,并在新的api树中将“后端”替换为“ api”。
我将api别名添加到/common/config/bootstrap.php:
配置传入请求的URL路由
在/api/config/main.php中,我们需要添加request[]
来解析设置JSON解析,并添加UrlRule
来关联模型及其端点的方法:
return [
'id' => 'app-api',
'basePath' => dirname(__DIR__),
'controllerNamespace' => 'api\controllers',
'bootstrap' => ['log'],
'modules' => [],
'components' => [
'request' => [
'parsers' => [
'application/json' => 'yii\web\JsonParser',
],
],
'urlManager' => [
'enablePrettyUrl' => true,
'enableStrictParsing' => true,
'showScriptName' => false,
'rules' => [
['class' => 'yii\rest\UrlRule', 'controller' => 'item'],
['class' => 'yii\rest\UrlRule', 'controller' => 'user'],
],
],
基本上就可以为这些模型启用一些丰富的API功能。
cURL的示例
让我们开始提出请求。
要求选项
向我展示可用的API方法:
curl -i -H "Accept: application/json"
-X OPTIONS "http://localhost:8888/api/items"
这是响应( GET, POST, HEAD, OPTIONS
):
HTTP/1.1 200 OK
Date: Tue, 25 Oct 2016 20:23:10 GMT
Server: Apache/2.2.31 (Unix) mod_wsgi/3.5 Python/2.7.12 PHP/7.0.10 mod_ssl/2.2.31 OpenSSL/1.0.2h DAV/2 mod_fastcgi/2.4.6 mod_perl/2.0.9 Perl/v5.24.0
X-Powered-By: PHP/7.0.10
Allow: GET, POST, HEAD, OPTIONS
Content-Length: 0
Content-Type: application/json; charset=UTF-8
GET请求
要求:有多少数据?
curl -i --head "http://localhost:8888/api/items"
答:横跨29页的576条记录...
HTTP/1.1 200 OK
Date: Tue, 25 Oct 2016 23:17:37 GMT
Server: Apache/2.2.31 (Unix) mod_wsgi/3.5 Python/2.7.12 PHP/7.0.10 mod_ssl/2.2.31 OpenSSL/1.0.2h DAV/2 mod_fastcgi/2.4.6 mod_perl/2.0.9 Perl/v5.24.0
X-Powered-By: PHP/7.0.10
X-Pagination-Total-Count: 576
X-Pagination-Page-Count: 29
X-Pagination-Current-Page: 1
X-Pagination-Per-Page: 20
Link: ; rel=self, ; rel=next, ; rel=last
Content-Type: application/json; charset=UTF-8
要求:给我显示记录15:
curl -i "http://localhost:8888/api/items/15"
响应:
HTTP/1.1 200 OK
Date: Tue, 25 Oct 2016 23:19:27 GMT
Server: Apache/2.2.31 (Unix) mod_wsgi/3.5 Python/2.7.12 PHP/7.0.10 mod_ssl/2.2.31 OpenSSL/1.0.2h DAV/2 mod_fastcgi/2.4.6 mod_perl/2.0.9 Perl/v5.24.0
X-Powered-By: PHP/7.0.10
Content-Length: 203
Content-Type: application/json; charset=UTF-8
{"id":15,"title":"Jeff Reifman","path":"jeffreifman",
"detail":"","status":0,"posted_by":1,"image_url":"",
"favorites":0,"stat_1":0,"stat_2":0,"stat_3":0,"created_at":1477277956,"updated_at":1477277956}
要求:请显示第3页上的所有数据:
curl -i -H "Accept:application/json"
"http://localhost:8888/api/items?page=3"
响应:
HTTP/1.1 200 OK
Date: Tue, 25 Oct 2016 23:30:21 GMT
Server: Apache/2.2.31 (Unix) mod_wsgi/3.5 Python/2.7.12 PHP/7.0.10 mod_ssl/2.2.31 OpenSSL/1.0.2h DAV/2 mod_fastcgi/2.4.6 mod_perl/2.0.9 Perl/v5.24.0
X-Powered-By: PHP/7.0.10
X-Pagination-Total-Count: 575
X-Pagination-Page-Count: 29
X-Pagination-Current-Page: 3
X-Pagination-Per-Page: 20
Link: ; rel=self, ; rel=first, ; rel=prev, ; rel=next, ; rel=last
Content-Length: 3999
Content-Type: application/json; charset=UTF-8
[{"id":43,"title":"_jannalynn","path":"_jannalynn",
"detail":"","status":0,"posted_by":1,"image_url":"",
"favorites":0,"stat_1":0,"stat_2":0,"stat_3":0,
...
...
...
{"id":99,"title":"alibrown","path":"alibrown","detail":"",
"status":0,"posted_by":1,"image_url":"","favorites":0,
"stat_1":0,"stat_2":0,"stat_3":0,"created_at":1477277956,
"updated_at":1477277956}]
删除请求
这是GET请求的示例,然后是DELETE请求,然后是后续失败的GET尝试:
$ curl -i -H "Accept: application/json" "http://localhost:8888/api/items/8"
HTTP/1.1 200 OK
Date: Tue, 25 Oct 2016 23:32:17 GMT
Server: Apache/2.2.31 (Unix) mod_wsgi/3.5 Python/2.7.12 PHP/7.0.10 mod_ssl/2.2.31 OpenSSL/1.0.2h DAV/2 mod_fastcgi/2.4.6 mod_perl/2.0.9 Perl/v5.24.0
X-Powered-By: PHP/7.0.10
Content-Length: 186
Content-Type: application/json; charset=UTF-8
{"id":8,"title":"aaker","path":"aaker","detail":"","status":0,"posted_by":1,"image_url":"","favorites":0,"stat_1":0,"stat_2":0,"stat_3":0,"created_at":1477277956,"updated_at":1477277956}
$ curl -i -H "Accept: application/json" -X DELETE "http://localhost:8888/api/items/8"
HTTP/1.1 204 No Content
Date: Tue, 25 Oct 2016 23:32:26 GMT
Server: Apache/2.2.31 (Unix) mod_wsgi/3.5 Python/2.7.12 PHP/7.0.10 mod_ssl/2.2.31 OpenSSL/1.0.2h DAV/2 mod_fastcgi/2.4.6 mod_perl/2.0.9 Perl/v5.24.0
X-Powered-By: PHP/7.0.10
Content-Length: 0
Content-Type: application/json; charset=UTF-8
$ curl -i -H "Accept: application/json" "http://localhost:8888/api/items/8"
HTTP/1.1 404 Not Found
Date: Tue, 25 Oct 2016 23:32:28 GMT
Server: Apache/2.2.31 (Unix) mod_wsgi/3.5 Python/2.7.12 PHP/7.0.10 mod_ssl/2.2.31 OpenSSL/1.0.2h DAV/2 mod_fastcgi/2.4.6 mod_perl/2.0.9 Perl/v5.24.0
X-Powered-By: PHP/7.0.10
Content-Length: 115
Content-Type: application/json; charset=UTF-8
{"name":"Not Found","message":"Object not found: 8","code":0,"status":404,"type":"yii\\web\\NotFoundHttpException"}
请求删除的记录返回404错误。
POST请求
对于发帖请求,我切换到了Chrome Postman应用程序 :
注册邮递员很容易:
然后,我可以在更友好的GUI中向我的本地主机API提交请求:
然后,我通过curl检索了数据, record 577
:
$ curl -i -H "Accept: application/json" "http://localhost:8888/api/items/577"
HTTP/1.1 200 OK
Date: Tue, 25 Oct 2016 23:40:44 GMT
Server: Apache/2.2.31 (Unix) mod_wsgi/3.5 Python/2.7.12 PHP/7.0.10 mod_ssl/2.2.31 OpenSSL/1.0.2h DAV/2 mod_fastcgi/2.4.6 mod_perl/2.0.9 Perl/v5.24.0
X-Powered-By: PHP/7.0.10
Content-Length: 219
Content-Type: application/json; charset=UTF-8
{"id":577,"title":"Jeff Reifman","path":"reifman",
"detail":"A programmer on earth.","status":0,
"posted_by":1,"image_url":"","favorites":0,
"stat_1":0,"stat_2":0,"stat_3":0,"created_at":1477436477,
"updated_at":1477436477}
事实证明,Postman对于完善我的测试至关重要,因为对于POST提交而言,配置命令行卷曲并不容易。
展望未来
除了REST快速入门概述之外 ,Yii 2.0文档还提供了有关API创建的其他方面的详细信息:
- 资源资源
- 控制器
- 路由
- 响应格式
- 认证方式
- 限速
- 版本控制
- 错误处理
我希望将来有机会探索更多这些内容。 但是可以肯定的是,下一步之一就是在启动系列中为Meeting Planner创建一个API。
最后,使用Yii MVC框架构建基本的REST API非常简单。 Yii团队在一项非常重要的需求REST API的标准化功能方面做得很好。 希望您喜欢这些知识。
如果您有任何问题或建议,请在评论中发布。 如果您想了解我将来的Envato Tuts +教程和其他系列,请访问我的讲师页面或关注@reifman 。 一定要检查一下我的启动系列和Meeting Planner 。
相关链接
- Yii2开发者交流 ,我的Yii2资源网站
- 快速入门-RESTful Web服务-Yii 2.0权威指南
- Google Chrome商店:邮递员申请
翻译自: https://code.tutsplus.com/tutorials/programming-with-yii2-building-a-restful-api--cms-27513