zoukankan      html  css  js  c++  java
  • 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的重写,实现了对不同请求的分类的不同处理。

  • 相关阅读:
    linux CentOS6.5 yum安装mysql 5.6
    CentOS6.5安装指定的PHP版本(php5.5)(转)
    openssl加密文件过程
    我的投资
    我的unity3d之路_01_序言
    我为什么想转Unity3d
    TensorFlow_01_真正从零开始,TensorFlow详细安装入门图文教程!
    为什么掌握 UML 建模是成为编程高手的一条捷径?
    《UML面向对象建模与设计》一书
    OOAD基本概念
  • 原文地址:https://www.cnblogs.com/aoximin/p/13129583.html
Copyright © 2011-2022 走看看