声明:本文首发于微信订阅号:Dart客栈,微信后台回复05165获取本篇源码
文章为原创,如需转载请注明出处,并告知作者,谢谢!
1.介绍
这一节我们来学习一下Controller
处理请求
2.什么是控制器Controller
在Aqueduct
框架中,我们主要使用Controller
进行对请求和响应的处理,例如:我们可以使用控制器返回文章列表,也可以使用控制器验证请求是否通过,而这些控制器可以连在一起,构建成一个通道,当前一个控制器验证不通过时,这条请求将会被拦截掉,可以用下图来展示:
那么在
Aqueduct
中控制器A
和控制器B
是什么呢?
- 控制器A
用于验证请求的内容是否通过,如果不通过,则不给继续请求,直到通过,才能给继续请求,我们可以继承Controller
实现
class ValidateController extends Controller {
@override
FutureOr<RequestOrResponse> handle(Request request) async {
final headers = request.raw.headers;
final a = headers.value('a');
if (a == 'a') {
return request;
}
return Response.unauthorized();
}
}
这里我们判断,当请求头有{'a':'a'}
的时候才给请求,即返回request
,不然给个没有授权的状态码401
告诉客户端,然后添加到我们之前/hello
接口中,在channel.dart
文件,添加下面代码
@override
Controller get entryPoint {
//...
router
.route('/hello')
//new
.link(() => ValidateController())
//new
.linkFunction((request) async {
return Response.ok({'data': 'Hello World'});
});
//...
}
可以看到我们在指定path
之后,可以无限加Controller
,无限加Function
,来控制请求,但必须要注意,在最末尾的那个控制器,必须要响应请求,下面来演示一下使用浏览器进行请求
可以看到不给访问了,需要
打钱
postman
,让我们添加请求头再尝试一下看看果然,
打钱
5ms
就给我们看到了想要看到的内容👀
- 控制器B
用于响应内容,目前我们使用linkFunction
作为控制器B,现在,我们把返回{'data':'Hello World'}
这个代码移动到新建的SayHelloController
中
class SayHelloController extends Controller{
@override
FutureOr<RequestOrResponse> handle(Request request) {
return Response.ok({'data': 'Hello World'});
}
}
然后修改一下路由的部分代码,在channel.dart
文件下
@override
Controller get entryPoint {
router
.route('/hello')
.link(() => ValidateController())
// edit
// .linkFunction((request) async {
// return Response.ok({'data': 'Hello World'});
// });
.link(() => SayHelloController());
// edit
}
可以看到,这样所有的请求和响应都放到Controller
里面了,这个也是大部分后端请求和响应的风格.
总结:从上面的内容可以得出
- 一个请求到来可以链接多个控制器,并前一个控制器可以拦截掉后一个控制器的处理
- 控制器返回
Request
类型的对象,说明将请求交给下一个控制器 - 控制器返回
Response
类型对象,说明要自己处理或者拦截,
以上就是这一节的所有内容,如果小伙伴们觉得有收获,不妨点一下点个赞,让我能看到你跟我一起学习Dart服务器,也是对我写作的一种肯定🙏!