在 C# 中,使用rest API的几个好处

分享于 

15分钟阅读

桌面开发

  繁體

通过采用Web开发的路径,你会发现自己需要更快或者更晚地处理外部 api。 在这篇文章中,我的目标是让最全面 List 消费restfulapi的方式在你 C# 项目,并向你展示如何做一些简单的例子。 在阅读本文之后,你将希望更多地了解哪些选项可以供你使用,以及在下次需要使用 rest API时如何选择合适的选项。

什么是rest式 API?

因此,在开始之前,你可能想知道什么是 API,什么是rest式部分?

简单来说,api是软件应用程序之间的层。 你可以将请求发送到 API,作为回报,你可以从它得到响应。 api隐藏了软件应用程序具体实现的所有细节细节,并暴露了应该用来与应用程序通信的接口。

整个互联网是由api构成的大蜘蛛网。 它们用于在应用程序之间通信和关联信息。 你有一个 API,几乎所有的东西。 你每天使用的大部分服务都有自己的api ( GoogleMaps。Facebook。Twitter。Instagram。weather门户)。

RESTfulapi意味着一部分按照实现原则和规则的其余( 具象状态转移) 底层网络的架构原则。 大多数情况下,rest式api返回纯文本。JSON或者XML响应。 详细解释其他超出了本文的范围,但是我的同事和朋友 Mladen 他的文章解释得很精彩。 你应该阅读它,然后再读一次,如果你有兴趣理解 REST。

如何使用rest式 api

好吧,让我们看看整个故事的内容。

在 C# 中使用rest式API有几种方法:

  • HttpWebRequest/Response
  • WebClient
  • HttpClient
  • RestSharp NuGet封装
  • ServiceStack http跑龙套

每一个都有优点和缺点,让我们看看它们,看看他们提供了什么。

作为一个例子,我将通过 GitHub API收集关于RestSharp仓库发布和发布日期的信息。 这里信息是公开的,你可以看到原始JSON响应的外观: RestSharp发布

我将利用异常 Json.NET 库的帮助来反序列化我们得到的响应。

在接下来的几个示例中,我希望得到一个反序列化的动态对象( 为了简单),它包含RestSharp发布信息。

http web request/响应类

它是 WebRequest 类的HTTP-specific实现。 它最初是用来处理HTTP请求的,但它已经被废弃并被 WebClient 类取代。

它提供了对请求的每个方面的fine-grained控制。 就像你所想象的,这可能是doubleedged的剑,你可以很容易的在你的请求中丢失大量的时间。 另一方面,这可能只是针对特定案例所需要的。

HttpWebRequest 类不会阻止用户界面,当然,我相信你会同意这个,非常重要。

HttpWebResponse 类为传入响应提供容器。

这是一个简单的例子,说明如何使用这些类使用一个 API。

HttpWebRequest request = (HttpWebRequest)WebRequest.Create
("https://api.github.com/repos/restsharp/restsharp/releases");
request.Method = "GET";
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) 
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36";
request.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();string content = string.Empty;using (Stream stream = response.GetResponseStream())
{
 using (StreamReader sr = new StreamReader(stream))
 {
 content = sr.ReadToEnd();
 }
}var releases = JArray.Parse(content);

虽然一个简单的例子,当你需要处理诸如过帐信息。授权等更复杂的场景时,它变得更加复杂。

WebClient 类

此类是 HttpWebRequest的包装器。 通过从开发人员那里提取 HttpWebRequest的细节来简化这个过程。 代码更容易写,你不太可能以这种方式出错。 如果你想编写更少的代码,不用担心所有细节,并且执行速度是 non-factor,那么考虑使用 WebClient 类。

HttpWebRequest/Response 方法相比,这个示例应该让你大致了解使用 WebClient的简单程度。

var client = new WebClient();
client.Headers.Add("user-agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 
(KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36");var response = client.DownloadString("https://api.github.com/repos/restsharp/restsharp/releases");var releases = JArray.Parse(response);

简单多了,对吧?

另外,DownloadString 方法,WebClient 类提供了许多其他有用的方法,使你的生活更加轻松。 你可以使用它轻松操作字符串。文件或者字节数组,而且比 HttpWebRequest/Response 方法慢几毫秒。

HttpWebRequest/ResponseWebClient 类都可以在较老版本的.NET 中使用。 如果你对其他 WebClient 提供的内容感兴趣,请务必查看 MSDN

HttpClient类

HttpClient 是"new的孩子",提供一些老的库缺乏的现代. NET 功能。 例如可以使用 HttpClient的单个实例发送多个请求,它不绑定到特定的HTTP服务器或者主机,使用 async/await 机制。

你可以找到关于五个很好的理由使用httpclient在这个视频 :

  • 强类型标头
  • 共享缓存,Cookies 和凭据
  • 访问 Cookies 和共享 Cookies
  • 控制缓存和共享缓存
  • 将代码模块插入 ASP.NET 管道。 更清晰和模块化的代码

下面是我们的示例中的HttpClient 操作:

using (var httpClient = new HttpClient())
{
 httpClient.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 
 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) 
 Chrome/58.0.3029.110 Safari/537.36");
 var response = httpClient.GetStringAsync(new Uri(url)).Result;
 var releases = JArray.Parse(response);
}

为了简单起见,我同时实现了它。 每个 HttpClient 方法都是异步使用的,应该以这种方式使用。

另外我还需要再提一个。 关于 HttpClient 是否应该使用块或者静态在应用程序级别上进行包装的争论。 尽管它实现 IDisposable, 似乎 using 块裹,你可以使你的应用程序故障,得到socketexception。 在Ankit博客中,性能测试结果是的,它支持 HttpClient的静态初始化( )。 请务必阅读这些博客文章,因为它们可以帮助你更清楚地了解 HttpClient的正确用法。

不要忘记,现代 HttpClient 是. NET 4.5独有的,所以在一些遗留项目中可能会遇到麻烦。

RestSharp

RestSharp是标准. NET 库的开源替代品,也是其中最酷的.NET 库之一。 它可以作为一个NuGet包,并且有几个原因,你应该考虑尝试它。

HttpClient 一样,RestSharp是一个现代化的。全面的库,使用起来很方便,而且还支持旧版本的.NET 框架。 它有内置的认证序列化/反序列化机制但允许你覆盖定制的。 跨平台可用和支持OAuth1oauth2,基本,ntlmParameter-based身份验证。 它还可以同步或者异步工作。 这个库还有很多内容,但是它们提供了一些巨大的好处。 RestSharp的用法和功能的详细信息,你可以访问 RestSharp GitHub页面。

现在让我们尝试使用RestSharp获取RestSharp发行版的List。 😀

var client = new RestClient(url);
IRestResponse response = client.Execute(new RestRequest());var releases = JArray.Parse(response.Content);

很简单,但不要被欺骗,RestSharp非常灵活,而且在使用 RESTful API时,几乎所有的工具都需要实现。

在本例中要注意的一点是,由于示例一致性,我没有使用restsharp机制的反序列化,这是一个浪费,但我鼓励你使用它,因为它非常容易和方便。 因此,你可以轻松地制作这样一个容器:

publicclass Release
{
 [DeserializeAs(Name = "name")]
 publicstring Name { get; set; }
 [DeserializeAs(Name = "published_at")]
 publicstring PublishedAt { get; set; }
}

然后,使用 Execute 方法将响应直接反序列化到该容器。 你可以只添加需要的属性,并使用属性 DeserializeAs 将它们映射到 C# 属性( 漂亮的触摸)。 由于我们在响应中获得了版本的List,所以我们将 List<Release> 用作包含类型。

var client = new RestClient(url);var response = client.Execute<List<Release>>(new RestRequest());var releases = response.Data;

非常直观和优雅的方法来获取我们的数据。

有更多比发送 RestSharp GET 请求,所以探索和看到自己有多酷。

要添加到RestSharp案例的最后一个注释是,它的存储库需要维护。 如果你想了解更多关于这个很酷的图书馆,我敦促你去 RestSharp回购和帮助这个项目生存和更好。 你还可以帮助移植RestSharp到. NET 核心

ServiceStackhttp跑龙套

另一个库,但与RestSharp不同的是,ServiceStack似乎被适当地维护并保持了。 它的List ServiceStack 特性令人印象深刻,它肯定有各种应用程序。

这里对我们最有用的是演示如何使用外部rest式 API。 ServiceStack 具有处理 3rd 方 Http api的专门方式,称为 Http

让我们看看如何使用 Json.NET 解析器首先使用 ServiceStack Http获取RestSharp版本。

var response = url.GetJsonFromUrl(requestFilter: webReq =>{
 webReq.UserAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) 
 AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36";
});var releases = JArray.Parse(response);

你也可以选择将它留给 ServiceStack 解析器。 我们可以重用前面定义的Release class

List<Release> releases = url.GetJsonFromUrl(requestFilter: webReq =>{
 webReq.UserAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) 
 AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36";
}).FromJson<List<Release>>();

就像你所看到的,无论哪种方法都很好,你可以选择是否获得 string 响应,或者立即。

尽管 ServiceStack 是我发现的最后一个库,但我惊喜地发现它很容易使用,我认为它可能成为将来处理api和服务的go-to工具。

其他选项

你的特定问题还有许多其他可用的选项。 这些库是用来使用单个REST服务的。 其example,unk yf 1 yf _ _ _ _ 2 yf unk yf is used to ar _ specifically,githubapi直接with unk yf _ _ 3 Facebook SDK yf _ ar _ yf is usedconsuming其facebook API and there are many almostanything其others。

虽然这些库是专门针对那些API做的,并且可能很好地完成了它们的用途,但是它们的实用性受到限制,因为你经常需要在应用程序中连接多。 这可能导致每一个实现都有不同的实现,并且有更多的依赖性可能导致重复性和。 库越具体,它的灵活性就越小。

结束语

因此,总结一下,我们讨论了可以用来使用rest式API的不同工具。 我提到了一些. NET 库,可以像 HttpWebRequestWebClientHttpClient 这样做,还有一些令人惊奇的第三方工具,比如RestSharp和 ServiceStack。 我对这些工具做了非常简短的介绍,并做了一些简单的例子来展示如何开始使用它们。 我认为现在至少有 95%个准备使用一些 REST。 展开并展开你的翅膀,探索并找到更有趣和有趣的方式来消费和连接不同的api。 现在睡觉了,你知道 🙂

另外,我想知道你最喜欢使用rest式API的方式? 这个 List 有什么遗漏我应该知道? 请给我留言,让我知道。

GitHub上的源代码

相关链接


API  REST  CONS  restful  
相关文章