完成OSS.Http底层HttpClient重构封装 支持标准库

2019-12-30 16:31:52丽君

The default HttpClient is the simplest way in which you can start sending requests. A single HttpClient can be used to send as many HTTP requests as you want concurrently so in many scenarios you can just create one HttpClient and then use that for all your requests.

也就是当你系统中要发起不同的请求时,可以共用一个HttpClient,而不用像HttpWebReqest基本每次请求都需要重新定义一个对象,以减少资源的消耗。

二. 重构OSS.Http

  回到正题,重构我们的当前代码模块,如我所说,由于.Net Standard下完全不提供httpWebRequest的支持,直接导致了我做出重新实现的决定,因为以前httpWebRequest的简陋,所以我基本上做了很大的封装框架,上层完全不需要接触具体的底层实现,基本上实现了RestSharp的核心,有兴趣的同学可以参考代码 OSS.Http 下Old分支。

  重构之前由于对HttpClient不是十分了解,本想延续已有框架流程,转换实现。不过随着对Client文档的查看研究,发现很多封装已经完全不需要,流程也发生了变化,所以删除很多原来框架下的东西,重新整理出最终的实现。

  当然现在的HttpClient本身实现已经足够简单清晰,不过在很多情况下直接调用POST,GET等方法,会减少部分代码的重用,像在OSS.Social项目中,底层我只需要实现一个RestCommon方法,即可达到全局请求控制,调用方只需要提供Url,HttpMothed,Parameter即可。

  这里我画了一个简单的流程图作为呈现:

HttpClient,封装

流程基本没有太大的出入,代码在Github,文件的结构如下:

  Mos文件下: Enum.cs  枚举类,FileParameter.cs 文件参数类,FormParameter Form表单参数类 ,OsHttpRequest 请求参数类,

  OsRest.cs  是当前封装类的主要实现,同时为了保证HttpClient本身功能通用,OsRest继承自HttpClient,同时提供了RestSend方法,在这个方法中完成流程的实现并最终调用SendAsync方法执行请求。

  RestUtil.cs  辅助类,完成了全局OsRest(HttpClient)的共用,并定义了一个默认HttpClientHandler实现,正常直接调用这个类就可以了。

  流程中的执行用户自定义设置,可以在OSHttpRequest中的RequestSet委托属性中设置,例如可以设置访问类型是json:

HttpClient,封装

三.  容易遇到的问题

  虽然整个重构后的代码已经不多了,但是应该还是有些问题可以给大家分享下

  1.  Header赋值问题,请参见我第一部分,一定要分清不同Headers,否则就可能给你报不正确的值错误