[Tools] 簡化使用HttpClient呼叫API的好工具 - Microsoft.AspNet.WebApi.Client、Flurl

簡化使用HttpClient呼叫API的好工具 - Microsoft.AspNet.WebApi.Client、Flurl

 

每次用到都忘記要裝誰,反正一樣筆記一下

1.前者針對Request和Response

2.後者針對Url


Microsoft.AspNet.WebApi.Client

1.先簡單示範平常發request的方式

        [HttpGet]
        public async Task<MyClass> Get()
        {
            HttpClient httpClient = _clientFactory.CreateClient();

            var myClass = new MyClass()
            {
                Id = 123,
                Name = "Test"
            };
            var stringContent = new StringContent(JsonConvert.SerializeObject(myClass));
            var message = await httpClient.PostAsync("http://www.google.com", stringContent);
            message.EnsureSuccessStatusCode();
            var responseContent = await message.Content.ReadAsStringAsync();
            var responseModel = JsonConvert.DeserializeObject<MyClass>(responseContent);

            return responseModel;
        }

2.在改造前先裝個package

dotnet add package Microsoft.AspNet.WebApi.Client

3.接著改造上面的程式碼

        [HttpGet]
        public async Task<MyClass> Get()
        {
            HttpClient httpClient = _clientFactory.CreateClient();

            var myClass = new MyClass()
            {
                Id = 123,
                Name = "Test"
            };
            // var stringContent = new StringContent(JsonConvert.SerializeObject(myClass));
            // var message = await httpClient.PostAsync("http://www.google.com", stringContent);
            var message = await httpClient.PostAsJsonAsync("http://www.google.com", myClass);
            message.EnsureSuccessStatusCode();
            // var responseContent = await message.Content.ReadAsStringAsync();
            // var responseModel = JsonConvert.DeserializeObject<MyClass>(responseContent);
            var responseModel = await message.Content.ReadAsAsync<MyClass>();

            return responseModel;
        }

4.第一部分省略了Request自行轉json的動作,另外的API則是可以省去轉xml的工

5.第二部分則是省略了Response轉回物件的動作,當然也有其他的方法可以玩玩,不過個人常用的還是這兩個


Flurl

1.首先調整下上面的程式碼

        [HttpGet]
        public async Task<MyClass> Get()
        {
            var httpClient = _clientFactory.CreateClient();

            var url = "http://www.google.com/api/search?a=123&b=qwe&c=6643";
            var message = await httpClient.GetAsync(url);
            message.EnsureSuccessStatusCode();

            var response = await message.Content.ReadAsAsync<MyClass>();
            return response;
        }

2.想想看那串url,如果要動態產生會遇到什麼問題,加斜線、加問號、加&,每次都要寫幾個方法處理這些

3.這次直接用現成的來完成它

dotnet add package Flurl

4.使用Flurl調整上面的程式碼,為了方便說明,移除多餘的程式碼

        [HttpGet]
        public void Get()
        {
            var urlBase = "http://www.google.com";

            // var url = "http://www.google.com/api/search?a=123&b=qwe&c=6643";
            var url = urlBase.AppendPathSegment("api")
                             .AppendPathSegment("search")
                             .SetQueryParam("a", "123")
                             .SetQueryParam("b", "qwe")
                             .SetQueryParam("c", "6643");

            QueryParamCollection queryParams = url.QueryParams;
            var queryParam = queryParams["a"];

            var newUrl = url.RemoveQueryParam("c");
        }

5.第一部分 - 可以透過 AppendPathSegment 和 SetQueryParam 動態的組合Url的Path和QueryString(也會幫QueryParameter做Encoding呢)

6.第二部分 - 可以直接取得Url上的QueryParameters,並且透過key取得對應的value

7.第三部分 - 可以動態的刪減QueryParameter,並且返回一個Url

8.加個中斷點確認執行結果,從後面灰色部分可以看到各個變數的值

9.除了Url操作外,Flurl也有額外提供針對Http的處理,不過又是另一個package了,有興趣的可以再研究研究

dotnet add package Flurl.Http

雖然都是一些簡單的功能,實作起來也都不會太花時間,

不過既然有現成的工具,不如省下這些時間直接用吧!


Flurl https://flurl.dev/

Sample Code https://github.com/ianChen806/MicrosoftAspNetWebApiClientSample