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裡面了,這個也是大部分後端請求和響應的風格.

總結:從上面的內容可以得出

  1. 一個請求到來可以鏈接多個控制器,並前一個控制器可以攔截掉後一個控制器的處理
  2. 控制器返回Request類型的對象,說明將請求交給下一個控制器
  3. 控制器返回Response類型對象,說明要自己處理或者攔截,

以上就是這一節的所有內容,如果小夥伴們覺得有收穫,不妨點一下點個贊,讓我能看到你跟我一起學習Dart伺服器,也是對我寫作的一種肯定?!