最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文詳解如何在C#中使用RESTful API

 更新時(shí)間:2025年03月18日 09:51:15   作者:caoruipeng  
通過(guò)Web開(kāi)發(fā)的路徑,大家會(huì)發(fā)現(xiàn)自己遲早需要處理外部API,本文將列出在C#項(xiàng)目中使用RESTful API的方法的最全面列表,希望對(duì)大家有所幫助

通過(guò)Web開(kāi)發(fā)的路徑,您發(fā)現(xiàn)自己遲早需要處理外部API(應(yīng)用程序編程接口)。在本文中,我的目標(biāo)是列出在C#項(xiàng)目中使用RESTful API的方法的最全面列表,并通過(guò)一些簡(jiǎn)單示例向您展示如何做到這一點(diǎn)。

閱讀該文章后,您將更深入地了解可以使用哪些選項(xiàng),以及下次需要使用RESTful API時(shí)如何選擇正確的選項(xiàng)。

什么是RESTful API?

因此,在開(kāi)始之前,您可能想知道API代表什么,以及RESTful的全部含義是什么?

簡(jiǎn)而言之,API是軟件應(yīng)用程序之間的層。您可以將請(qǐng)求發(fā)送到API,并從中獲得響應(yīng)。API隱藏了軟件應(yīng)用程序具體實(shí)現(xiàn)的所有細(xì)節(jié),并公開(kāi)了您用于與該應(yīng)用程序通信的接口。

整個(gè)互聯(lián)網(wǎng)是由API組成的大型蜘蛛網(wǎng)。我們使用API在應(yīng)用程序之間通信和關(guān)聯(lián)信息。我們有一個(gè)API,可以處理幾乎所有內(nèi)容。您每天使用的大多數(shù)服務(wù)都有自己的API(GoogleMaps,F(xiàn)acebook,Twitter,Instagram,天氣門(mén)戶…)

RESTful部分意味著API是根據(jù)REST(表示狀態(tài)傳輸)的原理和規(guī)則來(lái)實(shí)現(xiàn)的,REST是網(wǎng)絡(luò)的基礎(chǔ)架構(gòu)原理。RESTful API在大多數(shù)情況下會(huì)返回純文本,JSON或XML響應(yīng)。更詳細(xì)地解釋REST不在本文的討論范圍之內(nèi),但是您可以在我們的文章REST API最佳實(shí)踐中[6]閱讀有關(guān)REST的更多信息。

如何使用RESTful API

好吧,讓我們進(jìn)入整個(gè)故事中最重要的部分。

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

HttpWebRequest/Response Class

WebClient Class

HttpClient Class

RestSharp NuGet Package

ServiceStack Http Utils

Flurl

DalSoft

.RestClient

這些中的每一個(gè)都有優(yōu)點(diǎn)和缺點(diǎn),因此讓我們仔細(xì)研究它們,看看它們提供了什么。

例如,我們將通過(guò)GitHub API收集有關(guān)RestSharp回購(gòu)版本及其發(fā)布日期的信息。此信息是公開(kāi)可用的,您可以在此處查看原始JSON響應(yīng)的外觀: RestSharp版本

我們將利用Json.NET庫(kù)的幫助來(lái)反序列化獲得的響應(yīng)。同樣,對(duì)于某些示例,我們將使用庫(kù)的內(nèi)置反序列化機(jī)制。選擇哪種方式取決于您,因?yàn)闆](méi)有正確的方法。(您可以在源代碼中看到這兩種機(jī)制的實(shí)現(xiàn))。

我期望通過(guò)接下來(lái)的幾個(gè)示例得到一個(gè)反序列化JArray(為簡(jiǎn)單起見(jiàn)),其中包含RestSharp發(fā)布信息。之后,我們可以遍歷它以獲得以下結(jié)果。

HttpWebRequest / Response類

這是WebRequest 類的特定于HTTP的實(shí)現(xiàn),該實(shí)現(xiàn)最初用于處理HTTP請(qǐng)求,但已過(guò)時(shí)并由WebClient該類代替 。

HttpWebRequest 提供細(xì)粒度控制的要求制定過(guò)程的每一個(gè)環(huán)節(jié)。您可以想象,這可能是一把雙刃劍,您很容易浪費(fèi)大量時(shí)間來(lái)微調(diào)您的請(qǐng)求。另一方面,這可能正是您針對(duì)特定案例所需要的。

HttpWebRequest 類不會(huì)阻止用戶界面,也就是說(shuō),我相信您會(huì)同意這一點(diǎn),這一點(diǎn)非常重要。

HttpWebResponse 類為傳入的響應(yīng)提供了一個(gè)容器。

這是有關(guān)如何使用這些類使用API的簡(jiǎn)單示例。

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;
    }
}

盡管是一個(gè)簡(jiǎn)單的示例,但是當(dāng)您需要處理更復(fù)雜的方案(例如,發(fā)布表單信息,授權(quán)等)時(shí),它會(huì)變得更加復(fù)雜。

WebClient類別

這個(gè)類對(duì)HttpWebRequest的包裝。它通過(guò)HttpWebRequest從開(kāi)發(fā)人員中提取的細(xì)節(jié)來(lái)簡(jiǎn)化流程。該代碼更容易編寫(xiě),并且您通過(guò)這種方式犯錯(cuò)誤的可能性較小。如果您想編寫(xiě)更少的代碼,而不用擔(dān)心所有細(xì)節(jié),并且執(zhí)行速度是不重要的,請(qǐng)考慮使用WebClientclass。

這個(gè)示例應(yīng)該使您大致了解WebClientHttpWebRequestHttpWebResponse方法相比使用起來(lái)要容易得多。

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

    var response = client.DownloadString(url);

    return response;
}

容易得多,對(duì)嗎?

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

無(wú)論是HttpWebRequestHttpWebResponseWebClient類在舊版本的.NET可供選擇。如果您對(duì)其他產(chǎn)品感興趣,請(qǐng)務(wù)必查看MSDN[16]WebClient。

HttpClient類

HttpClient 是“新人”,它提供了舊庫(kù)所缺乏的一些現(xiàn)代.NET功能。例如,您可以使用的單個(gè)實(shí)例發(fā)送多個(gè)請(qǐng)求HttpClient,它不綁定到特定的HTTP服務(wù)器或主機(jī),而是使用async / await機(jī)制。

您可以在此視頻中找到使用HttpClient的五個(gè)很好的理由:

•強(qiáng)類型標(biāo)題。

•共享緩存,cookie和憑據(jù)

•訪問(wèn)cookie和共享cookie

•控制緩存和共享緩存。

•將您的代碼模塊注入ASP.NET管道。

清潔和模塊化的代碼。

HttpClient在我們的示例中,這是實(shí)際的:

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;
    }
}

為了簡(jiǎn)單起見(jiàn),我同步實(shí)現(xiàn)了它。每個(gè)HttpClient方法都應(yīng)異步使用,應(yīng)該以這種方式使用。

另外,我還要提到一件事。是否HttpClient應(yīng)該包裝在using塊中還是在應(yīng)用程序級(jí)別上進(jìn)行靜態(tài)討論。盡管它實(shí)現(xiàn)了IDisposable,但似乎通過(guò)將它包裝在using塊中,會(huì)使應(yīng)用程序出現(xiàn)故障并獲得SocketException。而在ANKIT博客中,提供了基于很多有利于靜態(tài)初始化的HttpClient性能測(cè)試結(jié)果是。請(qǐng)務(wù)必閱讀這些博客文章,因?yàn)樗鼈兛梢詭椭私庠?code>HttpClient 庫(kù)的正確用法。

并且不要忘記,由于是新的,HttpClient是.NET 4.5以上版本才有,因此在某些舊項(xiàng)目中使用它可能會(huì)遇到麻煩。

RestSharp

RestSharp是標(biāo)準(zhǔn).NET庫(kù)的OpenSource替代品,也是目前最酷的.NET庫(kù)之一。它以NuGet軟件包的形式提供,出于某些原因,您應(yīng)該考慮嘗試一下。

就像HttpClientRestSharp 一樣,它是一個(gè)現(xiàn)代而全面的庫(kù),易于使用且令人愉悅,同時(shí)仍支持舊版本的.NET Framework。它具有內(nèi)置的身份驗(yàn)證和序列化/反序列化機(jī)制,但允許您使用自定義機(jī)制[24]覆蓋它們。它可跨平臺(tái)使用,并支持OAuth1,OAuth2,基本,NTLM和基于參數(shù)的身份驗(yàn)證。您可以選擇同步或異步工作。該庫(kù)還有很多其他功能,而這些只是它提供的眾多好處中的一部分。有關(guān)RestSharp的用法和功能的詳細(xì)信息,您可以訪問(wèn)GitHub上的RestSharp 頁(yè)面。

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

public string GetReleases(string url)
{
    var client = new RestClient(url);

    var response = client.Execute(new RestRequest());

    return response.Content;
}

很簡(jiǎn)單。RestSharp非常靈活,擁有使用RESTful API時(shí)幾乎可以實(shí)現(xiàn)所有功能所需的所有工具。

在此示例中要注意的一件事是,由于示例的一致性,我沒(méi)有使用RestSharp的反序列化機(jī)制,這有點(diǎn)浪費(fèi),但是我鼓勵(lì)您使用它,因?yàn)樗_實(shí)非常容易和方便。因此,您可以輕松地制作一個(gè)這樣的容器:

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

然后使用該Execute方法直接反序列化對(duì)該容器的響應(yīng)。您可以僅添加所需的屬性,并使用屬性JsonProperty將它們映射到C#屬性(很好的觸摸)。由于我們?cè)陧憫?yīng)中獲得了發(fā)布列表,因此我們將List 用作包含類型。

public List<GitHubRelease> GetDeserializedReleases(string url)
{
    var client = new RestClient(url);

    var response = client.Execute<List<GitHubRelease>>(new RestRequest());

    return response.Data;
}

一種非常直接而優(yōu)雅的方式來(lái)獲取我們的數(shù)據(jù)。

RestSharp不僅具有發(fā)送GET請(qǐng)求的功能,還可以自己探索并觀察它的酷炫之處。

在RestSharp案例中要補(bǔ)充的最后一點(diǎn)是,其存儲(chǔ)庫(kù)需要維護(hù)者。如果您想了解更多有關(guān)這個(gè)很棒的庫(kù)的信息,我敦促您前往RestSharp存儲(chǔ)庫(kù),幫助該項(xiàng)目繼續(xù)發(fā)展并變得更好。

ServiceStack Http實(shí)用程序

另一個(gè)庫(kù),但與RestSharp不同,ServiceStack似乎得到了適當(dāng)維護(hù),并與現(xiàn)代API[29]趨勢(shì)保持同步。ServiceStack功能列表令人印象深刻,并且肯定具有各種應(yīng)用程序。

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

讓我們看看如何首先使用Json.NET解析器來(lái)獲取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;
}

如您所見(jiàn),無(wú)論哪種方式都可以正常工作,并且您可以選擇是獲取字符串響應(yīng)還是立即反序列化它。

盡管ServiceStack是我們偶然發(fā)現(xiàn)的最后一個(gè)庫(kù),但令我感到驚訝的是,它使用起來(lái)如此容易,而且我認(rèn)為它將來(lái)可能成為我處理API和服務(wù)的首選工具。

Flurl

評(píng)論庫(kù)中許多人要求的圖書(shū)館之一,并在Internet上受到許多人的喜愛(ài),但仍吸引著人們。

Flurl代表Fluent Url Builder,這是庫(kù)構(gòu)建其查詢的方式。對(duì)于不熟悉flurl的做事方式的人來(lái)說(shuō),flurl只是意味著庫(kù)的構(gòu)建方式是將方法鏈接在一起以實(shí)現(xiàn)更高的可讀性,類似于人類語(yǔ)言。

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

// Flurl will use 1 HttpClient instance per host
var 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>();

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

在后臺(tái),F(xiàn)lurl使用HttpClient或通過(guò)自己的語(yǔ)法糖增強(qiáng)HttpClient庫(kù)。因此,這意味著Flurl是一個(gè)異步庫(kù),因此請(qǐng)牢記這一點(diǎn)。

與其他高級(jí)庫(kù)一樣,我們可以通過(guò)兩種不同的方式來(lái)做到這一點(diǎn):

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

    return JsonConvert.SerializeObject(result);
}

這種方式相當(dāng)糟糕,因?yàn)槲覀冎皇切蛄谢Y(jié)果,以便稍后對(duì)其進(jìn)行反序列化。如果您使用的是Flurl之類的庫(kù),則不應(yīng)以這種方式進(jìn)行操作。

更好的做事方式是:

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

    return result;
}

隨著.Result我們強(qiáng)迫代碼的同步行為。使用Flurl的實(shí)際和預(yù)期方式如下所示:

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

    return result;
}

這展示了Flurl庫(kù)的全部潛力。

DalSoft.RestClient

現(xiàn)在,此列表與該列表中的任何內(nèi)容都有些不同。但這一點(diǎn)有所不同。

讓我們看看如何使用DalSoft.RestClient來(lái)使用GitHub API,然后談?wù)撐覀円淹瓿傻墓ぷ鳌?/p>

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

或通過(guò).NET Core CLI: dotnet add package DalSoft.RestClient

兩種方法都可以。

擁有圖書(shū)館后,我們可以執(zhí)行以下操作:

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在充分利用其功能的同時(shí)立即反序列化響應(yīng):

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;
}

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

乍一看,它似乎并不比我們使用的其他一些現(xiàn)代庫(kù)簡(jiǎn)單得多。

但這歸結(jié)為形成請(qǐng)求的方式,那就是利用RestClient的動(dòng)態(tài)特性。例如,我們的BaseUrl是https://api.github.com ,我們需要進(jìn)入https://api.github.com/repos/restsharp/restsharp/releases。我們可以通過(guò)動(dòng)態(tài)創(chuàng)建客戶端,然后通過(guò)鏈接Url的“部分”來(lái)形成Url來(lái)做到這一點(diǎn):

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

形成請(qǐng)求的一種非常獨(dú)特的方法。還有一個(gè)非常靈活的!

因此,一旦我們?cè)O(shè)置了基本的網(wǎng)址,就可以輕松地使用不同的端點(diǎn)。

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

除了易于理解和使用之外,DalSoft.RestClient還具有現(xiàn)代庫(kù)應(yīng)具備的所有功能。它是可配置的,異步的,可擴(kuò)展的,可測(cè)試的,并且支持多個(gè)平臺(tái)。

其他選擇

對(duì)于您的特定問(wèn)題,還有許多其他選項(xiàng)可用。您可以使用任何這些庫(kù)來(lái)使用特定的RESTful API。例如,octokit.net專門(mén)用于GitHub API,F(xiàn)acebook SDK用于使用Facebook API,并且還有許多其他功能可用于任何用途。

雖然這些庫(kù)是專門(mén)為這些API而設(shè)計(jì)的,并且可能擅長(zhǎng)于它們的用途,但它們的用途是有限的,因?yàn)槟?jīng)常需要在應(yīng)用程序中連接多個(gè)API。這可能會(huì)導(dǎo)致每個(gè)實(shí)現(xiàn)都有不同的實(shí)現(xiàn)方式,以及更多的依賴關(guān)系,這可能導(dǎo)致重復(fù)并且容易出錯(cuò)。庫(kù)越具體,其靈活性就越差。

結(jié)論

因此,總而言之,我們已經(jīng)討論了可用于使用RESTful API的不同工具。我們已經(jīng)提到了一些.NET庫(kù),可以這樣做HttpWebRequest,WebClientHttpClient,以及一些驚人的第三方工具,如RestSharp和ServiceStack。您還對(duì)這些工具進(jìn)行了簡(jiǎn)短的介紹,并給出了一些非常簡(jiǎn)單的示例來(lái)向您展示如何開(kāi)始使用它們。

我認(rèn)為您現(xiàn)在至少有95%準(zhǔn)備使用一些REST。繼續(xù)展開(kāi)翅膀,探索并找到更多有趣且有趣的方式來(lái)使用和連接不同的API。

到此這篇關(guān)于一文詳解如何在C#中使用RESTful API的文章就介紹到這了,更多相關(guān)C#使用RESTful API內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

洪湖市| 怀宁县| 馆陶县| 耒阳市| 河间市| 余江县| 麻城市| 柳河县| 枣庄市| 武城县| 保定市| 凤庆县| 建德市| 平凉市| 宁乡县| 额济纳旗| 仙游县| 巴林右旗| 长乐市| 新津县| 乐都县| 苍南县| 夹江县| 买车| 山东省| 历史| 栾城县| 平乐县| 大渡口区| 山西省| 东乌| 莱阳市| 和硕县| 邢台市| 岳池县| 晴隆县| 花莲市| 象州县| 贺州市| 夏邑县| 莱西市|