聊聊HTTP请求那一些事_HttpWebRequest_一篇就够了
Posted 程序员的修炼之旅
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了聊聊HTTP请求那一些事_HttpWebRequest_一篇就够了相关的知识,希望对你有一定的参考价值。
最近工作比较忙,很久没有写东西了,今天抽点时间整体一下最近工作的一个知识点小结。http请求对我们来说一点都不模式,程序员的我们有可能天天就是和这一些打交道。无论是BS架构的程序,前后端的数据交互,已经后台服务之间的数据交互,http还是主流。
最近接触的一个新项目,其项目是一个祖传项目,经历很多波小伙伴的手,代码风格也各不相同,重复性的代码一大波一大波的堆砌。在接手熟悉整理过程的,开始对一些公用方法进行封装打包,现在我就分享其中一个间的模块,那么就是对接口间的http请求处理封装。
当然了,其实http请求对绝大部分小伙伴来说都是家常便饭的熟悉,但是我今天还是要写出来,其目的是为了做一次知识总结和分享,也为了一个项目的统一,避免重复的造不同的轮子。在文中如有有说的不好的,或者错误的地方,希望你能够指点指点,谢谢!
言归正传,回到主题上来哈。至于http请的详细介绍,我就不在此啰嗦了,也免得占用大家时间。在实际使用过中,get和post是两种最常见不过的方式,下面也主要围绕这两个方式介绍。本文中主要是针对HttpWebRequest的封装进行分享。
一、聊聊Content-Type几种常见类
在聊http请求操作,首先需要了解的就是content-type(内容类型)关键,简单的说就是文档数据交互方法,其常见的主要有如下3种。
A:application/x-www-form-urlencoded
最常见的提交数据的方式,也是默认数据提交方式,其数据传递最终会转换为键值对的方式传递,key1=val1&key2=val2
B:multipart/form-data
表单方式提交,也是比较常见的提交方式。
C、application/json
该方式越来越流行,已json方式交互,很多开发接口数据交互都是json方式。
二、聊聊PAI的常见参数接收方式
其实我们在说http请求,API是离不开的话题,这也是本次分享的主要原因。尤其是现在都在提倡微服务,服务间的自调用就在所难免。那么下面我将简单总结一下常见的PAI数据接收方式:
按照有无参数分类,分了两大类,有参接口、无参接口。
其中,无参接口最为简单,没有什么好说的。下面主要说一下有参接口数据接收方式。
FromQuery:这一种比较简单的实现方式,也就是我们常见的url地址上的键值对方式传递接受,比如:url?key1=value1&key2=value2。该方式适用于get和post两种方式
FromRoute:路由参数,简单的说就是参数就是url地址的一部分。根据路由规则解析对应的参数。比如:urls/value1/value2。该方式适用于get和post两种方式
FromForm:表单方式传递,通过from表单方式接受参数,直接提交一个from表单。该方式使用与post。
FromBody:以json方式提交数据,接受时以一个对应的实体模型接收。该方式使用post
嗯,上面几种方式是我们常见的方式,了解了这一些方式,能解决掉90%的http请求。其他的方式就不在此详聊。
三、Content-Type与PAI常见参数接收方式对应关系
Content-Type |
参数接收方式 |
使用类型 |
application/x-www-form-urlencoded |
FromQuery FromRoute |
get、post |
multipart/form-data |
FromForm |
post |
application/json |
FromBody |
post |
四、http请求返回接收方式
其实严格的意义来说法不正确,其实接收方式都是一个字符串方式。我说的方式,是指在接收到请求结果后,其自己对数据的处理方式,也就两种方式,其一,请求结果字符串;其二、请求结果转换为对应的实体模型。
五、HttpWebRequest封装
结合上面的几点分析,下面主要针对这几种情况进行封装说明。
针对FromQuery参数:在封装中,通过字典方式交互
针对FromRoute参数:在封装中,通过list字符串集合交互
针对FromForm参数:在封装中,通过字典方式交互
针对FromBody参数:在分装中,通过数据模型方式交互
在每一种交互方式上,根据编码方式、过期时间、返回类型,又重载了几个方法
下面直接上代码:
get方式封装部分代码:
using Newtonsoft.Json; using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Text; namespace XYH.Tools.HttpTool { /// <summary> /// http get 请求相关的操作帮助类 /// </summary> public partial class HttpTool : HttpToolBase { #region 无参 /// <summary> /// http请求,不单独带有参数(返回一个泛型实体) /// </summary> /// <param name="url">请求地址</param> /// <param name="headerKeyValue">头部键值对参数</param> /// <returns>请求处理结果</returns> public static TReturn HttpGet<TReturn>(string url, List<MHeadParamet> headerKeyValue = null) { // 发起请求 return GetResponseResultForGet<TReturn>(url, defaultEncodType, defaultTimeout, headerKeyValue); } /// <summary> /// http请求,不单独带有参数(返回一个字符串) /// </summary> /// <param name="url">请求地址</param> /// <param name="headerKeyValue">头部键值对参数</param> /// <returns>请求处理结果</returns> public static string HttpGet(string url, List<MHeadParamet> headerKeyValue = null) { // 发起请求 return GetResponseResultForGet(url, defaultEncodType, defaultTimeout, headerKeyValue); } /// <summary> /// http请求,不单独带有参数 (返回一个泛型实体) /// 自定义编码方式 /// </summary> /// <param name="url">请求地址</param> /// <param name="encodType">编码方式</param> /// <param name="headerKeyValue">头部键值对参数</param> /// <returns>请求处理结果</returns> public static TReturn HttpGet<TReturn>(string url, Encoding encodType, List<MHeadParamet> headerKeyValue = null) { // 发起请求 return GetResponseResultForGet<TReturn>(url, encodType, defaultTimeout, headerKeyValue); } /// <summary> /// http请求,不单独带有参数(返回一个字符串) /// 自定义编码方式 /// </summary> /// <param name="url">请求地址</param> /// <param name="encodType">编码方式</param> /// <param name="headerKeyValue">头部键值对参数</param> /// <returns>请求处理结果</returns> public static string HttpGet(string url, Encoding encodType, List<MHeadParamet> headerKeyValue = null) { // 发起请求 return GetResponseResultForGet(url, encodType, defaultTimeout, headerKeyValue); } /// <summary> /// http请求,不单独带有参数 (返回一个泛型实体) /// 自定义超时时间 单位毫秒 默认为1分钟 /// </summary> /// <param name="url">请求地址</param> /// <param name="timeout">超时时间</param> /// <param name="headerKeyValue">头部键值对参数</param> /// <returns>请求处理结果</returns> public static TReturn HttpGet<TReturn>(string url, int timeout, List<MHeadParamet> headerKeyValue = null) { // 发起请求 return GetResponseResultForGet<TReturn>(url, defaultEncodType, timeout, headerKeyValue); } /// <summary> /// http请求,不单独带有参数(返回一个字符串) /// 自定义编码方式 /// 自定义超时时间 单位毫秒 默认为1分钟 /// </summary> /// <param name="url">请求地址</param> /// <param name="timeout">超时时间</param> /// <param name="headerKeyValue">头部键值对参数</param> /// <returns>请求处理结果</returns> public static string HttpGet(string url, int timeout, List<MHeadParamet> headerKeyValue = null) { // 发起请求 return GetResponseResultForGet(url, defaultEncodType, timeout, headerKeyValue); } /// <summary> /// http请求,不单独带有参数 (返回一个泛型实体) /// 自定义编码方式 /// 自定义超时时间 单位毫秒 默认为1分钟 /// </summary> /// <param name="url">请求地址</param> /// <param name="encodType">编码方式</param> /// <param name="timeout">超时时间</param> /// <param name="headerKeyValue">头部键值对参数</param> /// <returns>请求处理结果</returns> public static TReturn HttpGet<TReturn>(string url, Encoding encodType, int timeout, List<MHeadParamet> headerKeyValue = null) { // 发起请求 return GetResponseResultForGet<TReturn>(url, encodType, timeout, headerKeyValue); } /// <summary> /// http请求,不单独带有参数(返回一个字符串) /// 自定义超时时间 单位毫秒 默认为1分钟 /// </summary> /// <param name="url">请求地址</param> /// <param name="encodType">编码方式</param> /// <param name="timeout">超时时间</param> /// <param name="headerKeyValue">头部键值对参数</param> /// <returns>请求处理结果</returns> public static string HttpGet(string url, Encoding encodType, int timeout, List<MHeadParamet> headerKeyValue = null) { // 发起请求 return GetResponseResultForGet(url, encodType, timeout, headerKeyValue); } #endregion #region 参数字典 (键值对参数 path?kay1=value1&kay12=value2...) /// <summary> /// http请求,并带有请求参数字典 (键值对参数 path?kay1=value1&kay12=value2...)(返回一个字符串) /// </summary> /// <param name="url">地址</param> /// <param name="parameters">请求参数字典</param> /// <param name="headerKeyValue">头部键值对参数</param> /// <returns>请求处理结果</returns> public static string HttpGetDic(string url, Dictionary<string, string> parameters, List<MHeadParamet> headerKeyValue = null) { // 构建请求参数 url = GetRequestPath(url, parameters); // 发起请求 return GetResponseResultForGet(url, defaultEncodType, defaultTimeout, headerKeyValue); } /// <summary> /// http请求,并带有请求参数字典(键值对参数 path?kay1=value1&kay12=value2...)(返回一个泛型实体) /// </summary> /// <param name="url">地址</param> /// <param name="parameters">请求参数字典</param> /// <param name="headerKeyValue">头部键值对参数</param> /// <returns>请求处理结果</returns> public static TReturn HttpGetDic<TReturn>(string url, Dictionary<string, string> parameters, List<MHeadParamet> headerKeyValue = null) { // 构建请求参数 url = GetRequestPath(url, parameters); // 发起请求 return GetResponseResultForGet<TReturn>(url, defaultEncodType, defaultTimeout, headerKeyValue); } /// <summary> /// http请求,并带有请求参数字典 (键值对参数 path?kay1=value1&kay12=value2...)(返回一个字符串) /// 自定义编码方式 /// </summary> /// <param name="url">地址</param> /// <param name="parameters">请求参数字典</param> /// <param name="encodType">编码方式</param> /// <param name="headerKeyValue">头部键值对参数</param> /// <returns>请求处理结果</returns> public static string HttpGetDic(string url, Dictionary<string, string> parameters, Encoding encodType, List<MHeadParamet> headerKeyValue = null) { // 构建请求参数 url = GetRequestPath(url, parameters); // 发起请求 return GetResponseResultForGet(url, encodType, defaultTimeout, headerKeyValue); } /// <summary> /// http请求,并带有请求参数字典 (键值对参数 path?kay1=value1&kay12=value2...)(返回一个泛型实体) /// 自定义编码方式 /// </summary> /// <param name="url">地址</param> /// <param name="parameters">请求参数字典</param> /// <param name="encodType">编码方式</param> /// <param name="headerKeyValue">头部键值对参数</param> /// <returns>请求处理结果</returns> public static TReturn HttpGetDic<TReturn>(string url, Dictionary<string, string> parameters, Encoding encodType, List<MHeadParamet> headerKeyValue = null) { // 构建请求参数 url = GetRequestPath(url, parameters); // 发起请求 return GetResponseResultForGet<TReturn>(url, encodType, defaultTimeout, headerKeyValue); } /// <summary> /// http请求,并带有请求参数字典 (键值对参数 path?kay1=value1&kay12=value2...)(返回一个字符串) /// 自定义超时时间 单位毫秒 默认为1分钟 /// </summary> /// <param name="url">地址</param> /// <param name="parameters">参数集合</param> /// <param name="timeout">超时时间</param> /// <param name="headerKeyValue">头部键值对参数</param> /// <returns>请求处理结果</returns> public static string HttpGetDic(string url, Dictionary<string, string> parameters, int timeout, List<MHeadParamet> headerKeyValue = null) { // 构建请求参数 url = GetRequestPath(url, parameters); // 发起请求 return GetResponseResultForGet(url, defaultEncodType, timeout, headerKeyValue); } /// <summary> /// http请求,并带有请求参数字典 (键值对参数 path?kay1=value1&kay12=value2...)(返回一个泛型实体) /// 自定义超时时间 单位毫秒 默认为1分钟 /// </summary> /// <param name="url">地址</param> /// <param name="parameters">参数集合</param> /// <param name="timeout">超时时间</param> /// <param name="headerKeyValue">头部键值对参数</param> /// <returns>请求处理结果</returns> public static TReturn HttpGetDic<TReturn>(string url, Dictionary<string, string> parameters, int timeout, List<MHeadParamet> headerKeyValue = null) { // 构建请求参数 url = GetRequestPath(url, parameters); // 发起请求 return GetResponseResultForGet<TReturn>(url, defaultEncodType, timeout, headerKeyValue); } /// <summary> /// http请求,并带有请求参数字典 (键值对参数 path?kay1=value1&kay12=value2...)(返回一个字符串) /// 自定义编码方式 /// 自定义超时时间 单位毫秒 默认为1分钟 /// </summary> /// <param name="url">地址</param> /// <param name="parameters">参数集合</param> /// <param name="encodType">编码方式</param> /// <param name="timeout">超时时间</param> /// <param name="headerKeyValue">头部键值对参数</param> /// <returns>请求处理结果</returns> public static string HttpGetDic(string url, Dictionary<string, string> parameters, Encoding encodType, int timeout, List<MHeadParamet> headerKeyValue = null) { // 构建请求参数 url = GetRequestPath(url, parameters); // 发起请求 return GetResponseResultForGet(url, encodType, timeout, headerKeyValue); } /// <summary> /// http请求,并带有请求参数字典 (键值对参数 path?kay1=value1&kay12=value2...)(返回一个泛型实体) /// 自定义编码方式 /// 自定义超时时间 单位毫秒 默认为1分钟 /// </summary> /// <param name="url">地址</param> /// <param name="parameters">参数集合</param> /// <param name="encodType">编码方式</param> /// <param name="timeout">超时时间</param> /// <param name="headerKeyValue">头部键值对参数</param> /// <returns>请求处理结果</returns> public static TReturn HttpGetDic<TReturn>(string url, Dictionary<string, string> parameters, Encoding encodType, int timeout, List<MHeadParamet> headerKeyValue = null) { // 构建请求参数 url = GetRequestPath(url, parameters); // 发起请求 return GetResponseResultForGet<TReturn>(url, encodType, timeout, headerKeyValue); } #endregion #region rout路由参数 /// <summary> /// http请求,并带有list集合请求参数(rout路由参数)(返回一个泛型实体) /// </summary> /// <param name="url">地址</param> /// <param name="parameters">list集合请求参数</param> /// <param name="headerKeyValue">头部键值对参数</param> /// <returns>请求处理结果</returns> public static TReturn HttpGetRout<TReturn>(string url, List<string> parameters, List<MHeadParamet> headerKeyValue = null) { // 构建请求参数 url = GetRequestPath(url, parameters); // 发起请求 return GetResponseResultForGet<TReturn>(url, defaultEncodType, defaultTimeout, headerKeyValue); } /// <summary> /// http请求,并带有list集合请求参数(rout路由参数)(返回一个字符串) /// </summary> /// <param name="url">地址</param> /// <param name="parameters">list集合请求参数</param> /// <param name="headerKeyValue">头部键值对参数</param> /// <returns>请求处理结果</returns> public static string HttpGetRout(string url, List<string> parameters, List<MHeadParamet> headerKeyValue = null) { // 构建请求参数 url = GetRequestPath(url, parameters); // 发起请求 return GetResponseResultForGet(url, defaultEncodType, defaultTimeout, headerKeyValue); } /// <summary> /// http请求,并带有list集合请求参数(rout路由参数)(返回一个泛型实体) /// 自定义编码方式 /// </summary> /// <param name="url">地址</param> /// <param name="parameters">list集合请求参数</param> /// <param name="encodType">编码方式</param> /// <param name="headerKeyValue">头部键值对参数</param> /// <returns>请求处理结果</returns> public static TReturn HttpGetRout<TReturn>(string url, List<string> parameters, Encoding encodType, List<MHeadParamet> headerKeyValue = null) { // 构建请求参数 url = GetRequestPath(url, parameters); // 发起请求 return GetResponseResultForGet<TReturn>(url, encodType, defaultTimeout, headerKeyValue); } /// <summary> /// http请求,并带有list集合请求参数(rout路由参数)(返回一个字符串) /// 自定义编码方式 /// </summary> /// <param name="url">地址</param> /// <param name="parameters">list集合请求参数</param> /// <param name="encodType">编码方式</param> /// <param name="headerKeyValue">头部键值对参数</param> /// <returns>请求处理结果</returns> public static string HttpGetRout(string url, List<string> parameters, Encoding encodType, List<MHeadParamet> headerKeyValue = null) { // 构建请求参数 url = GetRequestPath(url, parameters); // 发起请求 return GetResponseResultForGet(url, encodType, defaultTimeout, headerKeyValue); } /// <summary> /// http请求,并带有list集合请求参数(rout路由参数)(返回一个泛型实体) /// 自定义超时时间 单位毫秒 默认为1分钟 /// </summary> /// <param name="url">地址</param> /// <param name="parameters">list集合请求参数</param> /// <param name="timeout">超时时间</param> /// <param name="headerKeyValue">头部键值对参数</param> /// <returns>请求处理结果</returns> public static TReturn HttpGetRout<TReturn>(string url, List<string> parameters, int timeout, List<MHeadParamet> headerKeyValue = null) { // 构建请求参数 url = GetRe以上是关于聊聊HTTP请求那一些事_HttpWebRequest_一篇就够了的主要内容,如果未能解决你的问题,请参考以下文章