通过采用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
/Response
和 WebClient
类都可以在较老版本的.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 库,可以像 HttpWebRequest
。WebClient
和 HttpClient
这样做,还有一些令人惊奇的第三方工具,比如RestSharp和 ServiceStack
。 我对这些工具做了非常简短的介绍,并做了一些简单的例子来展示如何开始使用它们。 我认为现在至少有 95%个准备使用一些 REST。 展开并展开你的翅膀,探索并找到更有趣和有趣的方式来消费和连接不同的api。 现在睡觉了,你知道
另外,我想知道你最喜欢使用rest式API的方式? 这个 List 有什么遗漏我应该知道? 请给我留言,让我知道。
GitHub上的源代码
相关链接
- 更多关于
- RestSharp GitHub仓库
- ServiceStack
- 使用HttpClient视频的五个不错的理由