通过web开发的路径,您发现自己迟早需要处理外部api(应用程序编程接口)。在本文中,我的目标是列出在c#项目中使用restful api的方法的最全面列表,并通过一些简单示例向您展示如何做到这一点。
阅读该文章后,您将更深入地了解可以使用哪些选项,以及下次需要使用restful api时如何选择正确的选项。
什么是restful api?
因此,在开始之前,您可能想知道api代表什么,以及restful的全部含义是什么?
简而言之,api是软件应用程序之间的层。您可以将请求发送到api,并从中获得响应。api隐藏了软件应用程序具体实现的所有细节,并公开了您用于与该应用程序通信的接口。
整个互联网是由api组成的大型蜘蛛网。我们使用api在应用程序之间通信和关联信息。我们有一个api,可以处理几乎所有内容。您每天使用的大多数服务都有自己的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
•webclient class
•httpclient class
•restsharp nuget package
•servicestack http utils
•flurl
•dalsoft
.restclient
这些中的每一个都有优点和缺点,因此让我们仔细研究它们,看看它们提供了什么。
例如,我们将通过github api收集有关restsharp回购版本及其发布日期的信息。此信息是公开可用的,您可以在此处查看原始json响应的外观: restsharp版本
我们将利用json.net库的帮助来反序列化获得的响应。同样,对于某些示例,我们将使用库的内置反序列化机制。选择哪种方式取决于您,因为没有正确的方法。(您可以在源代码中看到这两种机制的实现)。
我期望通过接下来的几个示例得到一个反序列化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
从开发人员中提取的细节来简化流程。该代码更容易编写,并且您通过这种方式犯错误的可能性较小。如果您想编写更少的代码,而不用担心所有细节,并且执行速度是不重要的,请考虑使用webclient
class。
这个示例应该使您大致了解webclient
与httpwebrequest
/ httpwebresponse
方法相比使用起来要容易得多。
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
类还提供了许多其他有用的方法,使我们的生活更轻松。我们可以轻松地使用它来操作字符串,文件或字节数组,并且价格比httpwebrequest
/ httpwebresponse
方法要慢几毫秒。
无论是httpwebrequest
/ httpwebresponse
和webclient
类在旧版本的.net可供选择。如果您对其他产品感兴趣,请务必查看msdn[16]webclient
。
httpclient类
httpclient
是“新人”,它提供了旧库所缺乏的一些现代.net功能。例如,您可以使用的单个实例发送多个请求httpclient
,它不绑定到特定的http服务器或主机,而是使用async / await机制。
您可以在此视频中找到使用httpclient的五个很好的理由:
•强类型标题。
•共享缓存,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。而在ankit博客中,提供了基于很多有利于静态初始化的httpclient
性能测试结果是。请务必阅读这些博客文章,因为它们可以帮助您更了解该httpclient
库的正确用法。
并且不要忘记,由于是新的,httpclient
是.net 4.5以上版本才有,因此在某些旧项目中使用它可能会遇到麻烦。
restsharp
restsharp是标准.net库的opensource替代品,也是目前最酷的.net库之一。它以nuget软件包的形式提供,出于某些原因,您应该考虑尝试一下。
就像httpclient
restsharp 一样,它是一个现代而全面的库,易于使用且令人愉悦,同时仍支持旧版本的.net framework。它具有内置的身份验证和序列化/反序列化机制,但允许您使用自定义机制[24]覆盖它们。它可跨平台使用,并支持oauth1,oauth2,基本,ntlm和基于参数的身份验证。您可以选择同步或异步工作。该库还有很多其他功能,而这些只是它提供的众多好处中的一部分。有关restsharp的用法和功能的详细信息,您可以访问github上的restsharp 页面。
现在,让我们尝试使用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存储库,帮助该项目继续发展并变得更好。
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 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>();
您可以看到方法如何链接在一起以完成“句子”。
在后台,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库的全部潜力。
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还具有现代库应具备的所有功能。它是可配置的,异步的,可扩展的,可测试的,并且支持多个平台。
其他选择
对于您的特定问题,还有许多其他选项可用。您可以使用任何这些库来使用特定的restful api。例如,octokit.net专门用于github api,facebook sdk用于使用facebook api,并且还有许多其他功能可用于任何用途。
虽然这些库是专门为这些api而设计的,并且可能擅长于它们的用途,但它们的用途是有限的,因为您经常需要在应用程序中连接多个api。这可能会导致每个实现都有不同的实现方式,以及更多的依赖关系,这可能导致重复并且容易出错。库越具体,其灵活性就越差。
结论
因此,总而言之,我们已经讨论了可用于使用restful api的不同工具。我们已经提到了一些.net库,可以这样做httpwebrequest
,webclient
和httpclient
,以及一些惊人的第三方工具,如restsharp和servicestack。您还对这些工具进行了简短的介绍,并给出了一些非常简单的示例来向您展示如何开始使用它们。
我认为您现在至少有95%准备使用一些rest。继续展开翅膀,探索并找到更多有趣且有趣的方式来使用和连接不同的api。
到此这篇关于一文详解如何在c#中使用restful api的文章就介绍到这了,更多相关c#使用restful api内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论