前言
可能我们一般使用一些库去调用一些请求,但是我们在一些框架中常常看到httpclient这样的字段,其实无论什么框架如果调用请求,那么一般会使用httpclient,除非自己去底层重写。
httpclient例子
对于做网站的来说一般很少接触到socket,因为有一个httpclient帮我们封装好了,那就从httpclient开始写吧。
先来看一段:
static void Main(string[] args)
{
GetsimpleResponse();
}
private static void GetsimpleResponse()
{
using (var client = new HttpClient())
{
HttpResponseMessage response = client.GetAsync("http://baidu.com").Result;
if (response.IsSuccessStatusCode)
{
Console.WriteLine("请求状态:"+(int)response.StatusCode+":"+response.ReasonPhrase);
string responseBodystr = response.Content.ReadAsStringAsync().Result;
Console.WriteLine(responseBodystr);
}
Console.ReadKey();
}
}
按理说应该写异步的,因为我们使用webapi都是异步,还有一个原因就是编译器认为时间如果过长的话会报错,一般来说是40ms。
我们不能保证服务器不出现卡顿的情况,所以处理程序api写异步是一个比较好的选择。
这里我没有写,主要是为了突出这个httpclient,见谅,后面会写一章异步的,然后补上一章。
好了,我们可以看到用GetAsync去调用了一个网址,返回一个HttpResponseMessage,拿到response.Content转换为string。
ReadAsStringAsync用于转换成string。
ReadAsByteArrayAsync转换为字节数组。
ReadAsStreamAsync转换为流。
response.EnsureSuccessStatusCode();如果调用失败这个是会返回异常的,之所以这样处理,是因为client.GetAsync()默认不返回异常。
相应内容默认为xml,如果要其他的格式可以这样写如json:
client.DefaultRequestHeaders.Add("Accept","application/json;odata=verbose");
httpHeader的add并不会覆盖原来的,并且httpHeader里面的标题是不能相同的属于<string,IEnumerable
这些都可以看文档就不多说。
但是呢,自家的架构都会自定义httprequestMessage,因为我们需要做一些统一的处理。
自定义httprequestMessage
GetAsync()实际上是封装了对httprequestMessage的书写,然后调用了send进行发送,除了get,当然还有post,delete,put这几个方法。
我们知道了它是这样的一个流程,那我们自己也可以去自定义这个httprequestMessage;
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "http://aoximingetdata.cn");
HttpResponseMessage responses= client.SendAsync(request).Result;
这样我们不仅能发送帮我们封装好的四个基本的请求,还可以发送head,options,trace请求。
当然我们重写HttpRequestMessage
public class newhandler:HttpClientHandler
{
bool message;
public newhandler(bool message)
{
this.message = message;
}
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,CancellationToken cancellationToken)
{
if (message)
{
HttpResponseMessage response = new HttpResponseMessage();
//在这里做一些统一的处理
return Task.FromResult<HttpResponseMessage>(response);
}else{
return base.SendAsync(request, cancellationToken);
}
}
}
然后var client = new HttpClient(new newhandler(true));
这样就完成了SendAsync的重写,实现了对不同请求的分类的不同处理。