使用Yii2进行编程:构建RESTful API

最终产品图片
您将要创造的

在本 使用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动词检查的高效路由。
  • OPTIONSHEAD动词的内置支持。
  • 认证和授权。
  • 数据缓存和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端点的现成路由:

编写Yii2 REST API网址CRUD API端点的文档

创建树以充当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:

<?php
Yii::setAlias('@common', dirname(__DIR__));
Yii::setAlias('@frontend', dirname(dirname(__DIR__)) . '/frontend');
Yii::setAlias('@backend', dirname(dirname(__DIR__)) . '/backend');
Yii::setAlias('@api', dirname(dirname(__DIR__)) . '/api');
Yii::setAlias('@console', dirname(dirname(__DIR__)) . '/console');
Yii::setAlias('@twixxr', dirname(dirname(__DIR__)) . '/twixxr');

配置传入请求的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: <http://localhost:8888/api/items?page=1>; rel=self, <http://localhost:8888/api/items?page=2>; rel=next, <http://localhost:8888/api/items?page=29>; 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: <http://localhost:8888/api/items?page=3>; rel=self, <http://localhost:8888/api/items?page=1>; rel=first, <http://localhost:8888/api/items?page=2>; rel=prev, <http://localhost:8888/api/items?page=4>; rel=next, <http://localhost:8888/api/items?page=29>; 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应用程序

使用Yii2 Chrome目录邮递员扩展程序登陆页面进行编程

注册邮递员很容易:

使用Yii2 Postmand进行注册

然后,我可以在更友好的GUI中向我的本地主机API提交请求:

使用Postman UX中显示的Yii2 POST请求进行编程

然后,我通过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

相关链接

翻译自: https://code.tutsplus.com/tutorials/programming-with-yii2-building-a-restful-api--cms-27513

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值