c# httpclient

前言

可能我们一般使用一些库去调用一些请求,但是我们在一些框架中常常看到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>这种定义方式,所以如果要变更原来的默认项需要先remove()然后添加。

这些都可以看文档就不多说。

但是呢,自家的架构都会自定义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的重写,实现了对不同请求的分类的不同处理。

posted @ 2020-06-15 10:43  敖毛毛  阅读(1456)  评论(0编辑  收藏  举报