内容简介:在一些英文文档中,我们经常会看到类似 API Endpoint 这样的术语,其实,Endpoint 就是路由的另一种表述,当我们讨论 API 时,很多人习惯将访问的 API 路由看作 Endpoint。为了避免和 Laravel 主应用的路由混在一起,Dingo API 使用了自己的路由器,正因如此,我们首先需要获取对应的 API 路由器实例来创建 Endpoint(可以在接下来需要定义 API 的版本分组,从而支持为多版本 API 接口创建同样的 Endpoint 以便后续回滚:
在一些英文文档中,我们经常会看到类似 API Endpoint 这样的术语,其实,Endpoint 就是路由的另一种表述,当我们讨论 API 时,很多人习惯将访问的 API 路由看作 Endpoint。
版本分组
为了避免和 Laravel 主应用的路由混在一起,Dingo API 使用了自己的路由器,正因如此,我们首先需要获取对应的 API 路由器实例来创建 Endpoint(可以在 routes/api.php
中定义基于 Dingo 路由器的 API 路由):
$api = app(\Dingo\Api\Routing\Router::class);
接下来需要定义 API 的版本分组,从而支持为多版本 API 接口创建同样的 Endpoint 以便后续回滚:
$api->version('v1', function ($api) { });
如果你想要某个分组能够同时响应多个版本的 API 接口,可以传递包含多个版本号的数组到该分组:
$api->version(['v1', 'v2'], function ($api) { });
这里基于版本号实现的分组可以看作和 Laravel 框架提供的标准路由分组一样,支持传递数组属性作为第二个参数,在这个属性数组参数中,你可以传递应用到该分组的中间件、命名空间、子域名、路由前缀等信息:
$api->version('v1', ['middleware' => 'foo'], function ($api) { });
还可以嵌套普通的路由分组到版本分组中,以便后续实现更复杂的自定义 API Endpoint:
$api->version('v1', function ($api) { $api->group(['middleware' => 'foo'], function ($api) { // Endpoints registered here will have the "foo" middleware applied. }); });
创建 API 路由
有了版本号之后就可以开始使用 $api
创建 Endpoint 了:
$api->version('v1', function ($api) { $api->get('/task/{id}', function ($id) { return \App\Task::findOrFail($id); }); });
学院君注:这里我们基于之前构建的 待办任务项目 为基础进行演示。
因为 Endpoint 基于版本号进行分组,所以你可以使用同样的 URI 为同一 Endpoint 创建不同的响应:
$api->version('v1', function ($api) { $api->get('/task/{id}', function ($id) { return \App\Task::findOrFail($id); }); }); $api->version('v2', function ($api) { $api->get('/task/{id}', function ($id) { return \App\Task::findOrFail($id); }); });
在访问 Dingo API 路由之前,我们需要为其配置子域名或路由前缀,这里我们配置路由前缀为 dingoapi
,在 .env
中添加如下配置项即可:
API_PREFIX=dingoapi
然后,我们就可以通过执行 php artisan api:routes
命令看到对应的 Dingo API 路由了:
另外还有一点需要注意的是在 Dingo API 中,如果基于控制器方法定义 API 路由,需要指定完整的控制器命名空间:
$api->get('/task/{id}', \App\Http\Controllers\TaskController::class.'@show');
因为 Dingo 使用的是独立的 API 路由器,与 Laravel 内置的路由定义处理机制不同。
访问 API 路由
要访问 Dingo API,一般不会在浏览器中直接访问,因为版本号信息需要在 HTTP 请求头中指定,而不是作为 URI 的一部分,我们可以通过 Postman 来模拟 API 接口的访问:
我们在 HTTP 请求头中通过 Accept
字段指定 API 接口对应的响应实体格式及 API 版本信息,但是这里并没有显示指定,Dingo 会使用默认的 v1
作为版本号,如果完整指定的话,这里的 Accept 字段值格式如下:
Accept: application/API_STANDARDS_TREE.API_SUBTYPE.API_VERSION+json
API_STANDARDS_TREE
配置值默认为 x
, API_SUBTYPE
默认值为空字符串,所以,如果要访问版本号为 v2
的 Dingo API 接口的话,可以这么指定 Accept 请求头:
如果是在服务器上通过命令行访问,可以通过如下 curl
命令实现:
curl -v -H "Accept: application/x.v1+json" http://todo.test/dingoapi/task/1
对应接口返回数据如下:
命名路由 & 生成 URL
命名路由可以帮助我们轻松生成指定路由对应的 URL。在 Dingo API 中,你可以像在 Laravel 框架中一样命名路由:
$api->version('v1', function ($api) { $api->get('/task/{id}', function ($id) { return \App\Task::findOrFail($id); })->name('task.detail'); });
然后就可以通过如下方式生成该路由对应的 URL:
$url = app(\Dingo\Api\Routing\UrlGenerator::class) ->version('v1') ->route('task.detail', ['id' => $id]);
必须提供一个版本号以便 URL 可以基于该版本号生成,同时,你可以在不同版本号中使用同一个命名路由。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 从 0 到 1 再到 100, 搭建、编写、构建一个前端项目
- Go+typescript+GraphQL+react构建简书网站(三) 编写Model
- go+typescript+graphQL+react构建简书网站(二) 编写GraphQL API
- [ Laravel从入门到精通 ] 编写 JSON API —— 基于资源控制器和 API 资源类快速构建 API 接口
- 基于顺丰同城接口编写sdk,java三方sdk编写思路
- 使用 Clojure 编写 OpenWhisk 操作,第 1 部分: 使用 Lisp 方言为 OpenWhisk 编写简明的代码
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Out of their Minds
Dennis Shasha、Cathy Lazere / Springer / 1998-07-02 / USD 16.00
This best-selling book is now available in an inexpensive softcover format. Imagine living during the Renaissance and being able to interview that eras greatest scientists about their inspirations, di......一起来看看 《Out of their Minds》 这本书的介绍吧!