前情提要
筆者在公司環境開發系統,依照公司規定有一些Secrurity Policy
要遵守,尤其是對外站台(前台),因為是對外開放的站台,按照資安規定,需要完全是一個乾淨的站台,不連資料庫,不做商業邏輯處理,只接收將客戶端傳來的HttpRequest
,轉發到商業邏輯處理站台(後台),因此筆者才在此篇的標題上打上類APIGateway
的字言,因為沒有完全符合ApiGateway
該有的功能,類似像LoadBalancing
、Caching
、Retry Policy
等重要指標,ApiGateway
完整功能可參考https://github.com/ThreeMammals/Ocelot的Features清單就可以略知一二。
內容
講到ApiGateway
的其中一個主要功能是Request
的轉發,這時候透過Refit
轉發是最適合不過了,主要原因
- 完全可以模仿像
Ocelot
這種ApiGateway
的模式:用Json
設定其ApiRoute
資訊,換到Refit
的世界來說,就是定義好Api Repository Interface
,與json格式
相比,多了一些Request、Response
強型別物件的宣告作業,但也多了一份踏實感 Response
的解析,可以利用Refit
提供的ApiResponse<T>
來做一些統一的ResponseArragement
方法,可以想像一下,若自己透過HttpClient
發Request
,類似像Validation
的ErrorResponse
,後台可能會透過400BadRequest
的方式回應,對於該HttpRequest
請求來說會是一個HttpException
,因此必須要做很多的TryCatch
來完成一個請求的Respsonse
整理,看一下文章後面的程式碼會更有感覺。
ApiRepository的宣告
雖然沒有ApiGateway
的一些高大尚的功能,還是要有基本的Authentication
功能,因此會有兩個ApiResource
要宣告
- 內部
AuthServer
- 商業邏輯處站台(後台)
1 | public interface IAuthServerApiRepository |
註冊ApiRepository
這節筆者在其他Refit介紹文章中已經解釋過,不另外特別解釋,直接貼出code
1 | services.AddRefitClient<IAppServerApiRepository>() |
Response解析
開發思路大概是這樣,以前台來說從Api
入口收到Request
後,透過Refit
轉發HttpRequest
,收到HttpResponse
後要轉成IActionResult
的格式回傳ApiResponse
,中間多了一些轉換。
筆者這邊都習慣會先抽一個BaseController
或BaseApiController
放著,其他各自的Controller
都先繼承該BaseController
,好處馬上就用到了,這種統一解析Response
的功能就可以寫在BaseApiController
上面了
1 | using Refit; |
看了以上code
,不要說其他好處,光程式碼長度就已經是非用它不可的理由,程式碼邏輯清楚,簡短,對於錯誤追縱也是有很大的幫助的。
畢竟前台定位是左手進,右手出,因此不要處理過多的邏輯,出錯機率也會大大的降低,找問題也比較快,因此透過Refit
提供的ApiResponse
來包裝Response
是最好不過的選擇了。
前台Api宣告
上面把Api
處理所需的相關邏輯方法都宣告完畢,進入到最後一個環節,寫Api Controller
邏輯,Refit
的好處之一,就像呼叫方法一樣呼叫,其實是完成一個HttpRequest
1 | [ ] |
結論
筆者因文章篇幅及AuthServer
的使用跟Refit
無相關就不在此篇示範呼叫AuthServer
的相關程式碼,因為ApiResponse<T>
這個已經包含TryCatch
的程序,因此只要判斷Response
的StatusCode
,很輕易地處理BadRequest
的回應,對於這種開發前台站台來說,應該是不用到一天就可以完成開發,藉由此篇,祝大家都能早早下班。
參考