当我们在用 .NET 调用 RestAPI 时通常有三种选择,分别为:WebClient, HttpWebRequest,HttpClient,这篇文章我们将会讨论如何使用这三种方式去调用 RestAPI,我还会提供相应的代码案例来帮助你更好的理解这三者的概念和使用方式,简单来说:

  • HttpWebRequest 是一种相对底层的处理 Http request/response 的方式。

  • WebClient 提供了对 HttpWebRequest 的高层封装,来简化使用者的调用。

  • HttpClient 是一种新的处理 Http request/response 工具包,具有更高的性能。

接下来我们讨论一下抽象类 WebRequest

WebRequest

WebRequest 是一种基于特定的 http 实现, 它是一个抽象类, 所以在处理 Reqeust 请求时底层会根据传进来的 url 生成相应的子类,如:HttpWebRequest 或 FileWebRequest ,下面的代码展示了如何使用 WebRequest。


WebRequest webRequest = WebRequest.Create(uri);
webRequest.Credentials = CredentialCache.DefaultCredentials;
webRequest.Method ="GET";
HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();

WebRequest 是 .NET Framework 中第一个用来处理 Http 请求的类,在处理 Http请求和响应 方面给调用者提供了诸多的灵活性,你还可以使用这个类来存取 headers, cookies, protocols 和 timeouts 等等,下面的代码展示了其实现子类 HttpWebRequest 是如何使用的。


HttpWebRequest http = HttpWebRequest)WebRequest.Create(“http://localhost:8900/api/default”);
WebResponse response = http.GetResponse();
MemoryStream memoryStream = response.GetResponseStream();
StreamReader streamReader = new StreamReader(memoryStream);
string data = streamReader.ReadToEnd();

WebClient

WebClient 是 HttpWebRequest 的高层封装,它给调用者提供了更便捷的使用方式,理所当然做出的牺牲就是 WebClient 的性能略逊于 HttpWebRequest,如果你的业务场景只是简单访问第三方的 Http Service,那么我建议你使用 WebClient ,同理如果你有更多的精细化配置则使用 HttpWebRequest,下面的代码展示了如何使用 WebClient 。


string data = null;using (var webClient = new WebClient())
{data = webClient.DownloadString(url);
}

HttpClient

HttpClient 是在 .NET Framework 4.5 中被引入的,如果你的项目是基于 .NET 4.5 以上版本,除一些特定的原因之外,建议你优先使用 HttpClient,本质上来说,HttpClient 作为后来之物,它吸取了 HttpWebRequest 的灵活性及 WebClient 的便捷性,所以说 ???? 和 ???? 可兼得。

HttpWebRequest 在 request/response 对象上提供了非常精细化的配置,同时你也要注意 HttpClient 的出现并不是为了取代 WebClient,言外之意就是 HttpClient 也有缺点,比如说:不能提供 进度处理URI 定制,不支持 FTP 等等,HttpClient 的优点也有很多,它所有关于 IO 操作的方法都是异步的,当然有特殊原因的话也可以使用同步方式,下面的代码展示了如何使用 HttpClient。


public async Task<Author> GetAuthorsAsync(string uri)
{Author author = null;HttpResponseMessage response = await client.GetAsync(uri);if (response.IsSuccessStatusCode){author = await response.Content.ReadAsAsync<Author>();}return author;
}

值得注意的是当 response 出现错误时,默认情况下 HttpClient 并不会抛出异常,如果你一定要求 HttpClient 在这种情况下抛出异常,可更改 IsSuccessStatusCode = false 来改变这种默认行为,做法就是调用 response.EnsureSuccessStatusCode();


public async Task<Author> GetAuthorsAsync(string uri)
{Author author = null;HttpResponseMessage response = await client.GetAsync(uri);response.EnsureSuccessStatusCode();if (response.IsSuccessStatusCode){author = await response.Content.ReadAsAsync<Author>();}return author;
}

在项目开发中,推荐的做法是保持 HttpClient 的单例化,如果不这么做的话,每次 Request 请求实例化一次 HttpClient ,那么大量的请求必将你的 socket 耗尽并抛出 SocketException 异常。

译文链接:https://www.infoworld.com/article/3198673/when-to-use-webclient-vs-httpclient-vs-httpwebrequest.html

如何选择 WebClient HttpWebRequest HttpClient ?相关推荐

  1. webrequest、httpwebrequest、webclient、HttpClient 四个类的区别?

    WebClient与HttpWebRequest的区别见:http://stackoverflow.com/a/4988325 WebClient与HttpClient的区别见:WebClient v ...

  2. C#中HttpWebRequest、WebClient、HttpClient 、HttpClientFactory Flurl、的使用总结

    C#中HttpWebRequest.WebClient.HttpClient .HttpClientFactory. Flurl的使用总结 三者的区别 HttpWebRequest 命名空间: Sys ...

  3. C#通过WebClient/HttpWebRequest实现http的post/get方法

    HttpWebRequest //body是要传递的参数,格式"roleId=1&uid=2" //post的cotentType填写: //"applicati ...

  4. Atitit s2018.5 s5 doc list on com pc.docx  v2

    Atitit s2018.5 s5  doc list on com pc.docx  Acc  112237553.docx Acc Acc  112237553.docx Acc baidu ne ...

  5. .net core 下的HttpClient、WebClient性能测试

    有许多服务需要拉取api接口数据,因此后端开发少不了对Http访问请求进行封装,最主要的应用方式莫过于采用WebClient进行封装,简单易用:而.net core微软官方推荐的是HttpClient ...

  6. Spring的WebClient基本使用

    WebClient是从Spring WebFlux 5.0版本开始提供的一个非阻塞的基于响应式编程的进行Http请求的客户端工具.它的响应式编程的基于Reactor的.WebClient中提供了标准H ...

  7. 使用HttpClient消费ASP.NET Web API服务

    本篇体验使用HttpClient消费ASP.NET Web API服务,例子比较简单. 依次点击"文件","新建","项目". 选择&quo ...

  8. springboot-webFlux的webclient详细使用介绍,细节拉满

    文章目录 写在前面 一.配置-Configuration 1.基本用法 2.最大内存大小-MaxInMemorySize 3.配置Reactor Netty 4.配置使用Jetty 5.配置Apach ...

  9. WebClient 原理及实践—官方原版

    WebClient是一种非阻塞.响应式客户端,用于执行HTTP请求.它在5.0中引入,并提供了RestTemplate的替代方案,支持同步.异步和流式场景. WebClient支持以下功能: 非阻塞I ...

最新文章

  1. python下载文件到指定文件夹-python实现指定文件夹下的指定文件移动到指定位置...
  2. 3.ELK 之elasticsearch CRUD
  3. Codeforces Round #554 (Div. 2) 1152A - Neko Finds Grapes
  4. Redis的简单实践
  5. [导入]为Exchange Server安装WAP电子邮件网关
  6. Vue安装npm长时间停留WARN deprecated request@2.88.2: request has been deprecated
  7. angular下拉框点击无反应_固定床反应器,你知道多少?
  8. C语言边角料:结构体中指针类型的成员变量,它的类型重要吗?
  9. 干货集锦:200+生信范文、30+款软件、12类图片素材PPT,今年的SCI稳了!(附下载)...
  10. Word 插入参考文献 通过尾注插入并更改尾注罗马数字为阿拉伯数字
  11. 安卓实现每日一句功能-一言API调用
  12. 基于LMS算法的DFE判决反馈均衡器
  13. 使用 SAP UI5 Smart Chart 控件轻松绘制十数种不同类型的专业图表试读版
  14. 使用pycharm去掉表格中的重复数据
  15. linux系统下的程序开发报告册,linux系统及其应用(应用开发)实验报告册.doc
  16. 期望风险最小化、经验风险最小化、结构风险最小化
  17. 网上搜索电子书的办法
  18. matlab中设置不同的点的形状,matlab点的形状
  19. 四参数坐标转换c语言,四参数坐标转换原理和程序设计
  20. 什么叫组网_什么是Mesh自组网?这篇文章是讲清楚了!

热门文章

  1. python调用api应用接口_Python接口测试之urllib2库应用
  2. apache目录的访问控制
  3. springboot小笔记
  4. python下sqlite增删查改方法(转)
  5. MongoDB 设置权限认证
  6. Public DNS (公共域名解析服务)
  7. 扩展Windows Mobile模拟器存储空间的方法
  8. 从零开始学习jQuery (九) jQuery工具函数 【转】
  9. 从无到有到完善 - Teams抽奖机器人开发历程
  10. 在PowerPoint 2010中将鼠标用作激光笔