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

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

OSS.Http项目对于.Net Standard标准库的支持已经迁移完毕,OSS开源系列两个最底层的类库已经具备跨运行时支持的能力。由于OSS.Http类库是几年前我参照RestSharp的思路,完成的一个轻量型Http请求框架。因为时间较久底层使用的还是HttpWebRequest,这次基本上是完全重构,这篇文章主要包含 1. HttpClient的介绍,2. 重构的思路, 3. 容易遇到的问题。

一. httpclient的基本介绍

HttpClient应该是在.net framework4.5版本左右引用的新功能,在此之前常用的是HttpWebRequest,相比较而言,前者更加的简单清晰,最重要的是完全支持.net standard API,这也是我选择它的重要原因。

HttpClient在结构上做了很大的调整,并且是完全异步的实现,可以说从底层上完成了异步的支持,这里先介绍对应的几个主要类:

1.  HtttpRequestMessage

请求的基本信息,请求地址,请求动作等,此值是在HttpClient发起请求的方法中当参数传入,与他对应的是响应 HttpResponseMessage

2.  HttpContent

请求的内容体,主要包含请求的具体内容,contenttype,contentlenght等,是HtttpRequestMessage的一个属性,这两个都包含Headers属性,但是范围分别不一样,这个是很容易混淆出错的地方,我给做了简单分类:

HttpRequestMessage的头部(HttpRequestHeaders )主要是请求的属性,如Accept,UserAgent,AcceptEncoding等http链接的基本属性。

HttpContent的头部(HttpContentHeaders)主要是当前请求内容的属性,主要有:Allow,Content-Encoding,Content-Length,Content-Type ,Expires ,Last-Modified 等,详见官方类库。

HttpContent 系统提供了几个默认实现,主要如下几个:

HttpClient,封装

3.  HttpMessageHandler

此类主要作用是请求内容处理动作等的定义,如是否支持重定向,是否可以使用cookie,代理Proxy等,偏向于系统的设置,可以此值通过HttpClient构造函数传入其中,系统默认的提供的子类为HttpClientHandler。

4.  HttpClient

具体的请求实现调用实现,完整实现了POST,GET,Delete等Http请求方法,所有的方法最终调用的是SendAsync方法。

上边的四个主要类,构成了HttpClient请求的主要实现,如果你只是简单的使用,那么只需要关心HttpClient即可,如下:

HttpClient,封装

其实在它内部已经默认实现了HttpRequestMessage和HttpClientHandler的赋值。

虽然简单介绍,但是基本上可以看出,HttpClient的实现做了非常明确的分工,不是再像以前所有的设置都集中在webrequest中。分工的明确最直接的优势是HttpClient实现了多请求共用,参见博文: