聲明:本文首發(fā)于微信訂閱號:Dart客棧,微信后臺回復(fù)05165獲取本篇源碼
文章為原創(chuàng),如需轉(zhuǎn)載請注明出處,并告知作者,謝謝!
1.介紹
這一節(jié)我們來學習一下Controller處理請求
2.什么是控制器Controller
在Aqueduct框架中,我們主要使用Controller進行對請求和響應(yīng)的處理,例如:我們可以使用控制器返回文章列表,也可以使用控制器驗證請求是否通過,而這些控制器可以連在一起,構(gòu)建成一個通道,當前一個控制器驗證不通過時,這條請求將會被攔截掉,可以用下圖來展示:

那么在
Aqueduct中控制器A和控制器B是什么呢?
- 控制器A
用于驗證請求的內(nèi)容是否通過,如果不通過,則不給繼續(xù)請求,直到通過,才能給繼續(xù)請求,我們可以繼承Controller實現(xiàn)
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,不然給個沒有授權(quán)的狀態(tài)碼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,來控制請求,但必須要注意,在最末尾的那個控制器,必須要響應(yīng)請求,下面來演示一下使用瀏覽器進行請求

可以看到不給訪問了,需要
打錢postman,讓我們添加請求頭再嘗試一下看看
果然,
打錢5ms就給我們看到了想要看到的內(nèi)容??
- 控制器B
用于響應(yīng)內(nèi)容,目前我們使用linkFunction作為控制器B,現(xiàn)在,我們把返回{'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
}
可以看到,這樣所有的請求和響應(yīng)都放到Controller里面了,這個也是大部分后端請求和響應(yīng)的風格.
總結(jié):從上面的內(nèi)容可以得出
- 一個請求到來可以鏈接多個控制器,并前一個控制器可以攔截掉后一個控制器的處理
- 控制器返回
Request類型的對象,說明將請求交給下一個控制器 - 控制器返回
Response類型對象,說明要自己處理或者攔截,
以上就是這一節(jié)的所有內(nèi)容,如果小伙伴們覺得有收獲,不妨點一下點個贊,讓我能看到你跟我一起學習Dart服務(wù)器,也是對我寫作的一種肯定??!