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 体系供应了几个默许完成,主要以下几个:
3. HttpMessageHandler
此类主要作用是要求内容处置惩罚行动等的定义,如是不是支撑重定向,是不是能够运用cookie,代办Proxy等,倾向于体系的设置,能够此值经由过程HttpClient组织函数传入个中,体系默许的供应的子类为HttpClientHandler。
4. HttpClient
细致的要求完成挪用完成,完全完成了POST,GET,Delete等Http要求要领,一切的要领终究挪用的是SendAsync要领。
上边的四个主要类,构成了HttpClient要求的主要完成,假如你只是简朴的运用,那末只须要体贴HttpClient即可,以下:
其实在它内部已默许完成了HttpRequestMessage和HttpClientHandler的赋值。
虽然简朴引见,然则基础上能够看出,HttpClient的完成做了非常明白的分工,不是再像之前一切的设置都集合在webrequest中。分工的明白最直接的上风是HttpClient完成了多要求共用,拜见博文:
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即可。
这里我画了一个简朴的流程图作为显现:
流程基础没有太大的相差,代码在Github,文件的构造以下:
Mos文件下: Enum.cs 罗列类,FileParameter.cs 文件参数类,FormParameter Form表单参数类 ,OsHttpRequest 要求参数类,
OsRest.cs 是当前封装类的主要完成,同时为了保证HttpClient自身功用通用,OsRest继续自HttpClient,同时供应了RestSend要领,在这个要领中完成流程的完成并终究挪用SendAsync要领实行要求。
RestUtil.cs 辅佐类,完成了全局OsRest(HttpClient)的共用,并定义了一个默许HttpClientHandler完成,一般直接挪用这个类就能够了。
流程中的实行用户自定义设置,能够在OSHttpRequest中的RequestSet托付属性中设置,比方能够设置接见范例是json:
三. 轻易碰到的题目
虽然全部重构后的代码已不多了,然则应当照样有些题目能够给人人分享下
1. Header赋值题目,请拜见我第一部份,一定要分清差别Headers,不然便可能给你报不正确的值毛病
2. 能够发明上边的流程图中有个“是不是是Get”的推断,由于假如是Get要求,Content是不能赋值的,就像在HttpWebReqest中,假如get要求挪用了GetRequestStream要领,会有“没法发送具有此谓词范例的内容正文”的非常毛病。固然假如你运用的是OSS.Http作为要求,那末就没有这个题目了。
3. 和上传文件同时上传的表单参数,与零丁的表单参数提交,是不一样的,请注意处置惩罚,不晓得拜见OsRest类即可,已做了处置惩罚。
以上就是完成OSS.Http底层HttpClient重构封装 支撑规范库的细致引见的内容,更多相关内容请关注ki4网(www.ki4.cn)!