Dart-Aqueduct框架開發(五)
- 2019 年 10 月 6 日
- 筆記
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伺服器,也是對我寫作的一種肯定?!