在C#中使用RESTful API的幾種好方法


通過Web開發的路徑,您發現自己遲早需要處理外部API(應用程序編程接口)。在本文中,我的目標是列出在C#項目中使用RESTful API的方法的最全面列表,並通過一些簡單示例向您展示如何做到這一點。

閱讀該文章后,您將更深入地了解可以使用哪些選項,以及下次需要使用RESTful API[2]時如何選擇正確的選項。

什么是RESTful API?

因此,在開始之前,您可能想知道API[3]代表什么,以及RESTful的全部含義是什么?

簡而言之,API是軟件應用程序之間的層。您可以將請求發送到API[4],並從中獲得響應。API隱藏了軟件應用程序具體實現的所有細節,並公開了您用於與該應用程序通信的接口。

整個互聯網是由API組成的大型蜘蛛網。我們使用API在應用程序之間通信和關聯信息。我們有一個API[5],可以處理幾乎所有內容。您每天使用的大多數服務都有自己的API(GoogleMaps,Facebook,Twitter,Instagram,天氣門戶…)

RESTful部分意味着API是根據REST(表示狀態傳輸)的原理和規則來實現的,REST是網絡的基礎架構原理。RESTful API在大多數情況下會返回純文本,JSON或XML響應。更詳細地解釋REST不在本文的討論范圍之內,但是您可以在我們的文章REST API最佳實踐中[6]閱讀有關REST的更多信息。

如何使用RESTful API

好吧,讓我們進入整個故事中最重要的部分。

有幾種方法可以在C#中使用RESTful API:

HttpWebRequest/Response Class[7]WebClient Class[8]HttpClient Class[9]RestSharp NuGet Package[10]ServiceStack Http Utils[11]Flurl[12]DalSoft.RestClient[13]

這些中的每一個都有優點和缺點,因此讓我們仔細研究它們,看看它們提供了什么。

例如,我們將通過GitHub API收集有關RestSharp回購版本及其發布日期的信息。此信息是公開可用的,您可以在此處查看原始JSON響應的外觀: RestSharp版本[14]

我們將利用Json.NET庫的幫助來反序列化獲得的響應。同樣,對於某些示例,我們將使用庫的內置反序列化機制。選擇哪種方式取決於您,因為沒有正確的方法。(您可以在源代碼中[15]看到這兩種機制的實現)。

我期望通過接下來的幾個示例得到一個反序列化JArray(為簡單起見),其中包含RestSharp發布信息。之后,我們可以遍歷它以獲得以下結果。

 

HttpWebRequest / Response類

這是WebRequest 類的特定於HTTP的實現,該實現最初用於處理HTTP請求,但已過時並由WebClient該類代替 。

HttpWebRequest 提供細粒度控制的要求制定過程的每一個環節。您可以想象,這可能是一把雙刃劍,您很容易浪費大量時間來微調您的請求。另一方面,這可能正是您針對特定案例所需要的。

HttpWebRequest 類不會阻止用戶界面,也就是說,我相信您會同意這一點,這一點非常重要。

HttpWebResponse 類為傳入的響應提供了一個容器。

這是有關如何使用這些類使用API的簡單示例。

public class HttpWebRequestHandler : IRequestHandler{ public string GetReleases(string url) { var request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET"; request.UserAgent = RequestConstants.UserAgentValue; request.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;
var content = string.Empty;
using (var response = (HttpWebResponse)request.GetResponse()) { using (var stream = response.GetResponseStream()) { using (var sr = new StreamReader(stream)) { content = sr.ReadToEnd(); } } }
return content; }}

盡管是一個簡單的示例,但是當您需要處理更復雜的方案(例如,發布表單信息,授權等)時,它會變得更加復雜。

WebClient類別

這個類對HttpWebRequest的包裝。它通過HttpWebRequest從開發人員中提取的細節來簡化流程。該代碼更容易編寫,並且您通過這種方式犯錯誤的可能性較小。如果您想編寫更少的代碼,而不用擔心所有細節,並且執行速度是不重要的,請考慮使用WebClientclass。

這個示例應該使您大致了解WebClientHttpWebRequestHttpWebResponse方法相比使用起來要容易得多。

public string GetReleases(string url){ var client = new WebClient(); client.Headers.Add(RequestConstants.UserAgent, RequestConstants.UserAgentValue);
var response = client.DownloadString(url);
return response;}

容易得多,對嗎?

除了其他DownloadString方法,WebClient類還提供了許多其他有用的方法,使我們的生活更輕松。我們可以輕松地使用它來操作字符串,文件或字節數組,並且價格比HttpWebRequestHttpWebResponse方法要慢幾毫秒。

無論是HttpWebRequestHttpWebResponseWebClient類在舊版本的.NET可供選擇。如果您對其他產品感興趣,請務必查看MSDN[16]WebClient

HttpClient類

HttpClient 是“新人”,它提供了舊庫所缺乏的一些現代.NET功能。例如,您可以使用的單個實例發送多個請求HttpClient,它不綁定到特定的HTTP服務器或主機,而是使用async / await機制。

您可以在此視頻中[17]找到使用HttpClient[18]的五個很好的理由[19]

•強類型標題。•共享緩存,cookie和憑據•訪問cookie和共享cookie•控制緩存和共享緩存。•將您的代碼模塊注入ASP.NET管道。清潔和模塊化的代碼。

HttpClient在我們的示例中,這是實際的:

public string GetReleases(string url){ using (var httpClient = new HttpClient()) { httpClient.DefaultRequestHeaders.Add(RequestConstants.UserAgent, RequestConstants.UserAgentValue);
var response = httpClient.GetStringAsync(new Uri(url)).Result;
return response; }}

為了簡單起見,我同步實現了它。每個HttpClient方法都應異步使用,應該以這種方式使用。

另外,我還要提到一件事。是否HttpClient應該包裝在using塊中還是在應用程序級別上進行靜態討論。盡管它實現了IDisposable,但似乎通過將它包裝在using塊中,會使應用程序出現故障並獲得SocketException[20]而在ANKIT博客中,提供了基於很多有利於靜態初始化的[21]HttpClient性能測試結果是。請務必閱讀這些博客文章,因為它們可以幫助您更了解該HttpClient 庫的正確用法。

並且不要忘記,由於是新的,HttpClient是.NET 4.5以上版本才有,因此在某些舊項目中使用它可能會遇到麻煩。

RestSharp

RestSharp是標准.NET庫的OpenSource替代品,也是目前最酷的.NET庫之一。它以NuGet軟件包的形式提供,出於某些原因,您應該考慮嘗試一下。

就像HttpClientRestSharp 一樣,它是一個現代而全面的庫,易於使用且令人愉悅,同時仍支持舊版本的.NET Framework。它具有內置的身份驗證[22]和序列化/反序列化機制,[23]但允許您使用自定義機制[24]覆蓋它們。它可跨平台使用,[25]並支持OAuth1,OAuth2,基本,NTLM和基於參數的身份驗證。您可以選擇同步或異步工作。該庫還有很多其他功能,而這些只是它提供的眾多好處中的一部分。有關RestSharp的用法和功能的詳細信息,您可以訪問GitHub上[26]的RestSharp 頁面[27]

現在,讓我們嘗試使用RestSharp get獲取RestSharp版本的列表。

public string GetReleases(string url){ var client = new RestClient(url);
var response = client.Execute(new RestRequest());
return response.Content;}

很簡單。RestSharp非常靈活,擁有使用RESTful API時幾乎可以實現所有功能所需的所有工具。

在此示例中要注意的一件事是,由於示例的一致性,我沒有使用RestSharp的反序列化機制,這有點浪費,但是我鼓勵您使用它,因為它確實非常容易和方便。因此,您可以輕松地制作一個這樣的容器:

public class GitHubRelease{ [JsonProperty(PropertyName = "name")] public string Name { get; set; } [JsonProperty(PropertyName = "published_at")] public string PublishedAt { get; set; }}

然后使用該Execute方法直接反序列化對該容器的響應。您可以僅添加所需的屬性,並使用屬性JsonProperty將它們映射到C#屬性(很好的觸摸)。由於我們在響應中獲得了發布列表,因此我們將List 用作包含類型。

public List<GitHubRelease> GetDeserializedReleases(string url){ var client = new RestClient(url);
var response = client.Execute<List<GitHubRelease>>(new RestRequest());
return response.Data;}

一種非常直接而優雅的方式來獲取我們的數據。

RestSharp不僅具有發送GET請求的功能,還可以自己探索並觀察它的酷炫之處。

在RestSharp案例中要補充的最后一點是,其存儲庫需要維護者。如果您想了解更多有關這個很棒的庫的信息,我敦促您前往RestSharp存儲庫[28],幫助該項目繼續發展並變得更好。

ServiceStack Http實用程序

另一個庫,但與RestSharp不同,ServiceStack似乎得到了適當維護,並與現代API[29]趨勢保持同步。ServiceStack功能列表令人印象深刻,並且肯定具有各種應用程序。

在這里對我們最有用的是演示如何使用外部RESTful API。ServiceStack具有一種專門的方式來處理稱為Http Utils的[30]第三方HTTP API 。

讓我們看看如何首先使用Json.NET解析器來獲取RestSharp版本是如何使用ServiceStack Http Utils。

public string GetReleases(string url){ var response = url.GetJsonFromUrl(webReq => { webReq.UserAgent = RequestConstants.UserAgentValue; });
return response;}

您還可以選擇將其留給ServiceStack解析器。我們可以重用本文前面定義的Release類 。

public List<GitHubRelease> GetDeserializedReleases(string url){ var releases = url.GetJsonFromUrl(webReq => { webReq.UserAgent = RequestConstants.UserAgentValue; }).FromJson<List<GitHubRelease>>();
return releases;}

如您所見,無論哪種方式都可以正常工作,並且您可以選擇是獲取字符串響應還是立即反序列化它。

盡管ServiceStack是我們偶然發現的最后一個庫,但令我感到驚訝的是,它使用起來如此容易,而且我認為它將來可能成為我處理API和服務的首選工具。

Flurl

評論庫中許多人要求的圖書館之一,並在Internet上受到許多人的喜愛,但仍吸引着人們。

Flurl代表Fluent Url Builder,這是庫構建其查詢的方式。對於不熟悉flurl的做事方式的人來說,flurl只是意味着庫的構建方式是將方法鏈接在一起以實現更高的可讀性,類似於人類語言。

為了使事情更容易理解,讓我們舉一些例子(這個例子來自官方文檔):

// Flurl will use 1 HttpClient instance per hostvar person = await "https://api.com" .AppendPathSegment("person") .SetQueryParams(new { a = 1, b = 2 }) .WithOAuthBearerToken("my_oauth_token") .PostJsonAsync(new { first_name = "Claire", last_name = "Underwood" }) .ReceiveJson<Person>();

您可以看到方法如何鏈接在一起以完成“句子”。

在后台,Flurl使用HttpClient或通過自己的語法糖增強HttpClient庫。因此,這意味着Flurl是一個異步庫,因此請牢記這一點。

與其他高級庫一樣,我們可以通過兩種不同的方式來做到這一點:

public string GetReleases(string url){ var result = url .WithHeader(RequestConstants.UserAgent, RequestConstants.UserAgentValue) .GetJsonAsync<List<GitHubRelease>>() .Result;
return JsonConvert.SerializeObject(result);}

這種方式相當糟糕,因為我們只是序列化結果,以便稍后對其進行反序列化。如果您使用的是Flurl之類的庫,則不應以這種方式進行操作。

更好的做事方式是:

public List<GitHubRelease> GetDeserializedReleases(string url){ var result = url .WithHeader(RequestConstants.UserAgent, RequestConstants.UserAgentValue) .GetJsonAsync<List<GitHubRelease>>() .Result;
return result;}

隨着.Result我們強迫代碼的同步行為。使用Flurl的實際和預期方式如下所示:

public async Task<List<GitHubRelease>> GetDeserializedReleases(string url){ var result = await url .WithHeader(RequestConstants.UserAgent, RequestConstants.UserAgentValue) .GetJsonAsync<List<GitHubRelease>>();
return result;}

這展示了Flurl庫的全部潛力。

如果您想了解更多有關如何在不同的現實生活場景使用Flurl,看看我們的 消費GitHub的API(REST)隨着[31]Flurl[32] 文章

總而言之,它就像廣告一樣:易於使用,現代,可讀性和可測試性。您對這個庫還有什么期望?要開源?簽[33]出: Flurl存儲庫[34],如果您願意,可以貢獻自己的力量!

DalSoft.RestClient

現在,此列表與該列表中的任何內容都有些不同。但這一點有所不同。

讓我們看看如何使用DalSoft.RestClient來使用GitHub API,然后談論我們已完成的工作。

首先,您可以通過輸入以下內容,通過NuGet軟件包管理器下載DalSoft.RestClient: Install-Package DalSoft.RestClient

或通過.NET Core CLI: dotnet add package DalSoft.RestClient

兩種方法都可以。

擁有圖書館后,我們可以執行以下操作:

public string GetReleases(string url){ dynamic client = new RestClient(RequestConstants.BaseUrl, new Headers { { RequestConstants.UserAgent, RequestConstants.UserAgentValue } });
var response = client.repos.restsharp.restsharp.releases.Get().Result.ToString();
return response;}

或最好使用DalSoft.RestClient在充分利用其功能的同時立即反序列化響應:

public async Task<List<GitHubRelease>> GetDeserializedReleases(string url){ dynamic client = new RestClient(RequestConstants.BaseUrl, new Headers { { RequestConstants.UserAgent, RequestConstants.UserAgentValue } });
var response = await client.repos.restsharp.restsharp.releases.Get();
return response;}

因此,讓我們稍微討論一下這些例子。

乍一看,它似乎並不比我們使用的其他一些現代庫簡單得多。

但這歸結為形成請求的方式,那就是利用RestClient的動態特性。例如,我們的BaseUrl是https://api.github.com ,我們需要進入https://api.github.com/repos/restsharp/restsharp/releases。我們可以通過動態創建客戶端,然后通過鏈接Url的“部分”來形成Url來做到這一點:

await client.repos.restsharp.restsharp.releases.Get();

形成請求的一種非常獨特的方法。還有一個非常靈活的!

因此,一旦我們設置了基本的網址,就可以輕松地使用不同的端點。

還值得一提的是,我們得到的JSON響應會自動進行類型轉換。如您在第二個示例中看到的那樣,我們方法的返回值是Task>. So,該庫足夠聰明,可以將響應轉換為我們的類型(依賴於Json.NET)。這使我們的生活更加輕松。

除了易於理解和使用之外,DalSoft.RestClient還具有現代庫應具備的所有功能。它是可配置的,異步的,可擴展的,可測試的,並且支持多個平台

我們僅演示了DalSoft.RestClient功能的一小部分。如果您對使用DalSoft.RestClient感興趣,請轉至我們的文章,[35]以學習如何在不同情況下使用它,或參閱 GitHub官方倉庫[36]和文檔[37]

其他選擇

對於您的特定問題,還有許多其他選項可用。您可以使用任何這些庫來使用特定的RESTful API。例如,octokit.net專門 [38]用於GitHub API,Facebook SDK[39] 用於使用Facebook API,並且還有許多其他功能可用於任何用途。

雖然這些庫是專門為這些API而設計的,並且可能擅長於它們的用途,但它們的用途是有限的,因為您經常需要在應用程序中連接多個API[40]。這可能會導致每個實現都有不同的實現方式,以及更多的依賴關系,這可能導致重復並且容易出錯。庫越具體,其靈活性就越差。

GitHub上的源代碼

GitHub上的源代碼[41]

結論

因此,總而言之,我們已經討論了可用於使用RESTful API的不同工具。我們已經提到了一些.NET庫,可以這樣做HttpWebRequestWebClientHttpClient,以及一些驚人的第三方工具,如RestSharp和ServiceStack。您還對這些工具進行了簡短的介紹,並給出了一些非常簡單的示例來向您展示如何開始使用它們。

我認為您現在至少有95%准備使用一些REST。繼續展開翅膀,探索並找到更多有趣且有趣的方式來使用和連接不同的API。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM