溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

自動(dòng)類型安全的REST .NET標(biāo)準(zhǔn)庫(kù)refit是怎樣的

發(fā)布時(shí)間:2022-01-05 17:08:55 來(lái)源:億速云 閱讀:102 作者:柒染 欄目:大數(shù)據(jù)

本篇文章為大家展示了自動(dòng)類型安全的REST .NET標(biāo)準(zhǔn)庫(kù)refit是怎樣的,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

在SCOTT HANSELMAN 博客上看到一個(gè)好東西《Exploring refit, an automatic type-safe REST library for .NET Standard》,他推薦了一個(gè).NET標(biāo)準(zhǔn)1.4 的自動(dòng)類型安全的REST庫(kù)refit。 refit 類似于Java的Retrofit,是一套R(shí)ESTful架構(gòu)的.NET客戶端實(shí)現(xiàn),基于特性,提供把REST API返回的數(shù)據(jù)轉(zhuǎn)化為(Plain Ordinary C# Object,簡(jiǎn)單C#對(duì)象),POCO to JSON,網(wǎng)絡(luò)請(qǐng)求(POST,GET,PUT,DELETE等)封裝,內(nèi)部封裝使用HttpClient,前者專注于接口的封裝,后者專注于網(wǎng)絡(luò)請(qǐng)求的高效,二者分工協(xié)作。我們的應(yīng)用程序通過(guò) refit請(qǐng)求網(wǎng)絡(luò),實(shí)際上是使用 refit接口層封裝請(qǐng)求參數(shù)、Header、Url 等信息,之后由 HttpClient完成后續(xù)的請(qǐng)求操作,在服務(wù)端返回?cái)?shù)據(jù)之后,HttpClient將原始的結(jié)果交給 refit,后者根據(jù)用戶的需求對(duì)結(jié)果進(jìn)行解析的過(guò)程。

例如:

public interface IGitHubApi
{
    [Get("/users/{user}")]
    Task<User> GetUser(string user);
}

定義上面的一個(gè)REST API接口。 該接口定義了一個(gè)函數(shù) GetUser,該函數(shù)會(huì)通過(guò)HTTP GET請(qǐng)求去訪問服務(wù)器/users/{user}路徑并把返回的結(jié)果封裝為User POCO 對(duì)象返回。

其中URL路徑中的{user}的值為GetUser函數(shù)中的參數(shù) user的取值。

然后通過(guò) RestService 類來(lái)生成一個(gè) IGitHubApi 接口的實(shí)現(xiàn),使用HttpClient 調(diào)用;

var gitHubApi = RestService.For<IGitHubApi>(https://api.github.com);
var octocat = await gitHubApi.GetUser("octocat");

從上面的示例可以看出, refit使用特性來(lái)聲明HTTP請(qǐng)求

  • 支持 URL 參數(shù)替換和查詢參數(shù)

  • 返回結(jié)果轉(zhuǎn)換為C#對(duì)象(返回結(jié)果可以為JSON)

  • 支持 Multipart請(qǐng)求和文件上傳

具體使用文檔

函數(shù)和函數(shù)參數(shù)上的特性聲明了請(qǐng)求方式

1、請(qǐng)求方式

每個(gè)函數(shù)都必須帶有 HTTP特性來(lái)表明請(qǐng)求方式和請(qǐng)求的URL路徑。類庫(kù)中有5個(gè)HTTP注解:GETPOSTPUT,DELETEHEAD。注解中的參數(shù)為請(qǐng)求的相對(duì)URL路徑

[Get("/users/list")]

在URL路徑中也可以指定URL參數(shù):

[Get("/users/list?sort=desc")]
2、URL處理

請(qǐng)求的URL可以根據(jù)函數(shù)參數(shù)動(dòng)態(tài)更新。一個(gè)可替換的區(qū)塊為用 { 和 } 包圍的字符串,而函數(shù)參數(shù)必需用 @AliasAs特性標(biāo)明,并且特性的參數(shù)為 同樣的字符串

[Get("/group/{id}/users")]//注意 字符串id
Task<List<User>> GroupList([AliasAs("id")] int groupId); //注意 AliasAs特性的參數(shù)要和前面的字符串一樣 id
還支持查詢參數(shù)
[Get("/group/{id}/users")]
Task<List<User>> GroupList([AliasAs("id")] int groupId, [AliasAs("sort")] string sortOrder);

GroupList(4, "desc");
>>> "/group/4/users?sort=desc"
3、請(qǐng)求體(Request Body)

通過(guò)[Body]特性可以聲明一個(gè)對(duì)象作為請(qǐng)求體發(fā)送到服務(wù)器。

[Post("/users/new")]
Task CreateUser([Body] User user);
對(duì)象將被RestService 使用對(duì)應(yīng)的轉(zhuǎn)換器轉(zhuǎn)換為字符串或者字節(jié)流提交到服務(wù)器。
4、FORM ENCODED AND MULTIPART 表單和Multipart

函數(shù)也可以注解為發(fā)送表單數(shù)據(jù)和multipart 數(shù)據(jù)

5、服務(wù)器結(jié)果轉(zhuǎn)換為C# 對(duì)象

使用RestService 的轉(zhuǎn)換器把HTTP請(qǐng)求結(jié)果(默認(rèn)為JSON)轉(zhuǎn)換為C#對(duì)象,C#對(duì)象通過(guò)函數(shù)返回值指定

6、添加請(qǐng)求頭

我們可以通過(guò)[Headers]來(lái)添加請(qǐng)求頭,支持動(dòng)態(tài)的請(qǐng)求頭。

refit是非常強(qiáng)大的,小編通過(guò)豐富的示例和對(duì)源碼的挖掘,向大家展示了 refit自身強(qiáng)大的功能以及擴(kuò)展性

上述內(nèi)容就是自動(dòng)類型安全的REST .NET標(biāo)準(zhǔn)庫(kù)refit是怎樣的,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI