当前位置: 首页 > 科技观察

如何选择WebClientHttpWebRequestHttpClient?

时间:2023-03-16 11:55:44 科技观察

本文转载自微信公众号“马农读书”,作者马农读书。转载本文请联系码农阅读公众号。我们在使用.NET调用RestAPI时,通常有三种选择:WebClient、HttpWebRequest、HttpClient。在本文中,我们将讨论如何使用这三种方法来调用RestAPI,我也会提供相应的代码案例,帮助您更好地理解这三种方法的概念和用法。简单地说:HttpWebRequest是一种相对低级的处理Http请求/响应的方式。WebClient对HttpWebRequest进行了高度封装,简化了用户的调用。HttpClient是一个新的工具包,用于处理具有更高性能的Http请求/响应。接下来我们讨论抽象类WebRequest。WebRequestWebRequest是基于特定的http实现。它是一个抽象类,所以在处理Reqeust请求时,底层会根据传入的url生成相应的子类,如:HttpWebRequest或FileWebRequest。下面的代码展示了如何使用WebRequest。WebRequestwebRequest=WebRequest.Create(uri);webRequest.Credentials=CredentialCache.DefaultCredentials;webRequest.Method="GET";HttpWebResponsewebResponse=(HttpWebResponse)webRequest.GetResponse();WebRequest是.NETFramework中第一个处理Http请求的类为调用者提供了很多处理Http请求和响应的灵活性。您还可以使用此类来访问标头、cookie、协议和超时等。下面的代码显示了它的实现子类HttpWebRequest是如何使用它的。HttpWebRequesthttp=HttpWebRequest)WebRequest.Create(“http://localhost:8900/api/default”);WebResponseresponse=http.GetResponse();MemoryStreammemoryStream=response.GetResponseStream();StreamReadersstreamReader=newStreamReader(memoryReadStream);stringerdata=streamReadToEnd();WebClientWebClient是对HttpWebRequest的高层封装,为调用者提供更方便的使用方式。当然,做出的牺牲是WebClient的性能略逊于HttpWebRequest。如果你的业务场景只是简单的访问第三方的HttpService,那我建议你使用WebClient。同样,如果您有更细粒度的配置,请使用HttpWebRequest。下面的代码展示了如何使用WebClient。stringdata=null;using(varwebClient=newWebClient()){data=webClient.DownloadString(url);}HttpClientHttpClient是在.NETFramework4.5中引入的,如果你的项目是基于.NET4.5或以上的,除了一些特定的之外究其原因,建议大家先使用HttpClient。从本质上讲,HttpClient是后来的东西。它吸收了HttpWebRequest的灵活性和WebClient的方便性,因此可以兼得。HttpWebRequest在请求/响应对象上提供了非常细粒度的配置。同时你也要注意,HttpClient的出现并不是为了取代WebClient。言外之意HttpClient也有缺点,比如:不能提供进度处理和URI定制,不支持FTP等等等,HttpClient的优点还是有很多的。它所有的IO操作方法都是异步的。当然,如果有特殊原因,也可以使用同步方式。下面的代码展示了如何使用HttpClient。publicasyncTaskGetAuthorsAsync(stringuri){Authorauthor=null;HttpResponseMessageresponse=awaitclient.GetAsync(uri);if(response.IsSuccessStatusCode){author=awaitresponse.Content.ReadAsAsync();}returnauthor;}发生错误时在响应中,HttpClient默认不会抛出异常。如果您必须要求HttpClient在这种情况下抛出异常,您可以更改IsSuccessStatusCode=false以更改此默认行为。方法是调用response.EnsureSuccessStatusCode();。publicasyncTaskGetAuthorsAsync(stringuri){Authorauthor=null;HttpResponseMessageresponse=awaitclient.GetAsync(uri);response.EnsureSuccessStatusCode();if(response.IsSuccessStatusCode){author=awaitresponse.Content.ReadAsauthort>reAsync(;Author};}在项目开发中,推荐的方法是保持HttpClient为单实例,如果不这样做,为每个Request实例化HttpClient,那么大量的请求会耗尽你的socket并抛出SocketException。翻译链接:https://www.infoworld.com/article/3198673/when-to-use-webclient-vs-httpclient-vs-httpwebrequest.html