日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

WebApi client 的面向切面编程

發布時間:2023/12/4 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WebApi client 的面向切面编程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

.Net的面向切面編程

.Net的服務端應用AOP很常見,在Asp.net MVC與Asp.net WebApi等新框架里到處都有AOP的影子,我們可以把一個服務方法“切”為很多面,日志面、驗證面、請求方式處理、接口業務實現等多個面,有一些面可以使用過濾器特性(FilterAttribute)進行編寫,然后很方便和打上特性即可,對于一般的工程師,只需要專注實現接口業務實現。

在流行SOAP的年代,很少需要一個強悍的Client,而今天restful時代,.net也出了一個HttpClient,可以說是與Asp.net WebApi相配吧,雖然HttpClient相對WebClient在http接口請求有了質的變化,但相比服務端的webApi,AOP的影子都不見了。

?

讓HttpClient支持AOP

所謂讓HttpClient支持AOP,是指在對HttpClient進行組合封裝,基于HttpClient再打造一款客戶端框架,將AOP的理念引入到新客戶端框架來,我們可以簡單分析一下HttpClient請求一個接口要做的基本事情,同時把這些事情“切”為多個面,Http請求大致如下:

{Method} {Path}?query1={value1}&query2={value2} {Header1} {Header2}{body}

我可以切出幾個面:

  • method與path處理

  • query參數處理

  • 請求body內容處理

  • 發送請求

  • 回復結果處理

  • 我們所做的框架,需要把1、2、3、5封裝為面,同時調用HttpClient來完成第4個動作。

    ?

    AOP基礎框架的選擇

    可以參考這個博客:NET AOP(一)七種AOP實現方法?

    這里我選擇了Castle,Castle可以動態創建接口的實現類并實例化,可以對接口方法調用前進行攔截,并設置返回結果。

    我們可以根據這個攔截功能,收集每個面的配置,組裝為http請求消息,然后調用HttpClient為完成發送請求,再讓第5個面來進行回復結果處理。基于Castle與HttpClient,我們就可以封裝出支持AOP的HttpClient新框架,這里命名為WebApiClient吧。

    ?

    WebApiClient設計

    現在,我們的目標是,讓調用WebApi與編寫WebApi一樣,聲明接口、參數、返回值,打上請求方法與路徑(面)特性、返回結果處理(面)特性、請求內容(面)特性。然后框架幫我們實現并取得實例,然后就可以調用這些接口了。

    Step1:聲明接口

    namespace Demo

    {

    ? ? [JsonReturn]

    ? ? [HttpHost("http://www.mywebapi.com")]

    ? ? public interface MyWebApi

    ? ? {

    ? ? ? ? [HttpGet("/webapi/{type}/about")] // GET webapi/typeValue/about

    ? ? ? ? Task<ApiResult<string>> GetAboutAsync(string type);



    ? ? ? ? [HttpGet("/webapi/user")] ?// GET webapi/user?userName=aa&nickName=bb&&BeginTime=cc&EndTime=dd

    ? ? ? ? Task<ApiResult<UserInfo>> GetUserAsync(string userName, string nickName, TimeFilter timeFilter);



    ? ? ? ? [HttpPut("/webapi/user")] // PUT webapi/user

    ? ? ? ? Task<ApiResult<bool>> UpdateUserAsync([JsonContent] UserInfo loginInfo);



    ? ? ? ? [HttpDelete("/webapi/user")] // DELETE ?webapi/user?id=idValue

    ? ? ? ? Task<ApiResult<bool>> DeleteUserAsync(string id);



    ? ? ? ? [HttpDelete("/webapi/user/{id}")] // DELETE ?webapi/user/idValue

    ? ? ? ? Task<ApiResult<bool>> DeleteUser2Async(string id);

    ? ? }

    }

    Step2:獲取接口實并調用

    namespace Demo

    {

    ? ? class Program

    ? ? {

    ? ? ? ? static async void Test()

    ? ? ? ? {

    ? ? ? ? ? ? var myWebApi = new WebApiClient.HttpApiClient().GetHttpApi<MyWebApi>();


    ? ? ? ? ? ? await myWebApi.GetAboutAsync("typeValue");

    ? ? ? ? ? ? await myWebApi.UpdateUserAsync(new UserInfo { UserName = "abc", Password = "123456" });

    ? ? ? ? ? ? await myWebApi.DeleteUser2Async(id: "id001");

    ? ? ? ? }


    ? ? ? ? static void Main(string[] args)

    ? ? ? ? {

    ? ? ? ? ? ? Test();

    ? ? ? ? ? ? Console.ReadLine();

    ? ? ? ? }

    ? ? }

    }

    WebApiClient更多的面

    我們可以給框架增加更多的自定義面,比如日志記錄、返回結果統一驗證等等,這些就不一一介紹,但思想還是一樣的。

    ?

    WebApiClient開放

    這是一個開放的框架,托管在?https://github.com/xljiulang/WebApiClient?,已經支持.net core平臺。 如果你喜歡,點個星吧。

    相關文章:

    • 自動類型安全的REST .NET標準庫refit

    • Swagger+AutoRest 生成web api客戶端(.Net)

    原文地址:?http://www.cnblogs.com/kewei/p/6646601.html


    .NET社區新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com

    總結

    以上是生活随笔為你收集整理的WebApi client 的面向切面编程的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。