簡化使用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