WebApi系列~基于单请求封装多请求的设计
怎么说,单请求封装多请求,这句话确实有点绕了,但还是要看清楚,想明白这到底是怎么一回事,单请求即一次请求(get,post,put,delete),封闭多请求,即在客户端发送的一个请求中可能包含多个子请求(真实的请求,接口),这种设计确实看着很灵活,客户端可以根据自己的需要去拿服务器的数据,确实不错!
首先我们要定义一套自己的请求和响应对象
#region 请求对象
/// <summary>
/// 参数对象
/// </summary>
[DataContractAttribute]
public class RequestParam
{
public RequestParam(string name, string value)
{
this.ParamName = name;
this.ParamValue = value;
}
[DataMemberAttribute]
public string ParamName { get; private set; }
[DataMemberAttribute]
public string ParamValue { get; private set; }
}
/// <summary>
/// 数据包中的实体
/// </summary>
[DataContractAttribute]
public class RequestData
{
public RequestData()
{
this.HttpMethod = ;
this.RequestParam = new Dictionary<string, string>();
}
/// <summary>
/// 本次通讯唯一标示
/// </summary>
[DataMemberAttribute]
public string GuidKey { get; set; }
/// <summary>
/// 请求方式0:get,1:Post
/// </summary>
public int HttpMethod { get; set; }
/// <summary>
/// 要调用的方法
/// </summary>
[DataMemberAttribute]
public string Url { get; set; }
/// <summary>
/// 方法的参数列表
/// </summary>
[DataMemberAttribute]
public IDictionary<string, string> RequestParam { get; set; }
}
/// <summary>
/// 请求数据包
/// </summary>
[DataContractAttribute]
public class RequestDataSegment
{
public RequestDataSegment()
{
this.RequestData = new List<RequestData>();
}
[DataMemberAttribute]
public List<RequestData> RequestData { get; set; }
}
#endregion
再来看一下响应对象
#region 响应对象
/// <summary>
/// 数据包实体
/// </summary>
[DataContractAttribute]
public class ResponseData
{
/// <summary>
/// 本次传输过程中唯一标识
/// </summary>
[DataMemberAttribute]
public string GuidKey { get; set; }
/// <summary>
/// 状态:100失败,200成功
/// </summary>
[DataMemberAttribute]
public int Status { get; set; }
/// <summary>
/// 数据包:Json对象
/// </summary>
[DataMemberAttribute]
public string Data { get; set; }
}
/// <summary>
/// 响应数据包
/// </summary>
[DataContractAttribute]
public class ResponseDataSegment
{
public ResponseDataSegment()
{
this.ResponseData = new List<ResponseData>();
}
[DataMemberAttribute]
public List<ResponseData> ResponseData { get; set; }
}
#endregion
而我们服务器对客户端开放的是一个大接口,或者叫入口接口,它负责把客户端传来的请求进行解析,然后代理客户端,处理多请求,并将结果进行组装,返回给客户端,在mvc和web api里,我们为了让程序扩展性更强,通常把这个核心逻辑写在attribute里
下面看一下代码的实现
/// <summary>
/// Api代理过滤器(api多任务请求的入口)
/// </summary>
[AttributeUsage(AttributeTargets.Method)]
public class ApiProxyFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var Request = filterContext.HttpContext.Request;
var responseDataSegment = new ResponseDataSegment();
var data = VCommons.SerializeMemoryHelper.DeserializeFromJson<RequestDataSegment>(Request.Form["dataSeg"]);
if (data != null && data.RequestData.Any())
{
foreach (var item in data.RequestData)
{
try
{
HttpResponseMessage response;
var handler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip };
using (var http = new HttpClient(handler))
{ if (item.HttpMethod == )
{
if (item.RequestParam != null)
{
item.Url += "?";
foreach (var p in item.RequestParam)
item.Url += p.Key + "=" + p.Value + "&";
item.Url = item.Url.Remove(item.Url.Length - , );
}
response = http.GetAsync(item.Url).Result;
}
else
{
var content = new FormUrlEncodedContent(item.RequestParam);
response = http.PostAsync(item.Url, content).Result;
} response.EnsureSuccessStatusCode();
responseDataSegment.ResponseData.Add(new ResponseData
{
GuidKey = item.GuidKey,
Status = ,
Data = response.Content.ReadAsStringAsync().Result
});
}
}
catch (Exception ex)
{ responseDataSegment.ResponseData.Add(new ResponseData
{
GuidKey = item.GuidKey,
Status = ,
Data = ex.Message
});
} } }
filterContext.HttpContext.Response.ContentType = "applicatin/json";
filterContext.HttpContext.Response.Write(VCommons.SerializeMemoryHelper.SerializeToJson(responseDataSegment));
base.OnActionExecuting(filterContext);
}
}
对于你的具体项目,选个主入口,在它上面添加上ApiProxy特性即可
/// <summary>
/// Api统一处理的入口
/// </summary>
/// <returns></returns>
[ApiProxyFilter]
public JsonResult Index()
{
return null;
}
现在你就可以去测试你的客户端了,哈哈,看是否把你的单个请求里的(三个请求)转发并为你返回了,呵呵.
WebApi系列~基于单请求封装多请求的设计的更多相关文章
- WebApi系列~基于单请求封装多请求的设计~请求的安全性设计与实现
回到目录 对于一个Http请求如何保证它的安全,这已经不是一个新的话题,对于请求的安全我们通常考虑的无非就是"请求的被篡改性"和"请求的被复制性",第一个问题我们很容易实现,可以通过参数+密钥的方式, ...
- webapi基于单请求封装多请求的设计【转】
怎么说,单请求封装多请求,这句话确实有点绕了,但还是要看清楚,想明白这到底是怎么一回事,单请求即一次请求(get,post,put,delete),封闭多请求,即在客户端发送的一个请求中可能包含多个子 ...
- drf:restful概念,类继承关系,drf请求封装,drf请求流程,版本控制组件,认证组件(token),权限组件
1.restful规范 resfful规范的概念最重要: 是一套规范,规则,用于程序之间进行数据交换的约定. 他规定了一些协议,对我们感受最直接的就是,以前写增删改查的时候需要些四个视图寒素,rest ...
- WebApi系列~不支持put和delete请求的解决方法
回到目录 原因 由于安装了webDAV模块引起的,在web.config里的system.webserver节点,将webdav模块移动 将http请求的权限开放 实现 <system.webS ...
- WebApi系列~基于RESTful标准的Web Api
微软的web api是在vs2012上的mvc4项目绑定发行的,它提出的web api是完全基于RESTful标准的,完全不同于之前的(同是SOAP协议的)wcf和webService,它是简单,代码 ...
- WebApi系列~基于RESTful标准的Web Api 转载 https://www.cnblogs.com/lori/p/3555737.html
微软的web api是在vs2012上的mvc4项目绑定发行的,它提出的web api是完全基于RESTful标准的,完全不同于之前的(同是SOAP协议的)wcf和webService,它是简单,代码 ...
- WebApi系列~目录
回到占占推荐博客索引 写了这个系列的文章不少了,也应该为大家写个目录了,最近很刮了很多SOA的风,很多企业都将自己的系统进行分割,通常是按模块进行拆分,为这个模块提供统一的接口提供业务服务,这不紧可以 ...
- Flutter 实际开发常用工具类(全局提示,请求封装,token缓存,验证码倒计时、常用窗帘动画及布局)
介绍: 一星期从入门到实际开发经验分享及总结 代码传送门github Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面.未来App开发 ...
- 简单的基于Vue-axios请求封装
具体实现思路=>封装之前需要用npm安装并引入axios,使用一个单独的js模块作为接口请输出对象,然后export dafult 这个对象. 1.首先我们需要在Vue实例的原型prototyp ...
随机推荐
- RBAC用户权限管理数据库设计
RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角色- ...
- Trie树(c++实现)
转:http://www.cnblogs.com/kaituorensheng/p/3602155.html http://blog.csdn.net/insistgogo/article/detai ...
- ubuntu搜不到wifi信号
很多人刚刚装完ubuntu发现搜不到wifi信号,输入命令查看配置发现没有无线网卡驱动, 其实ubuntu是可以自动识别无线网卡自动安装驱动的,此时只需输入命令更新一下即可, 连上有线网,在终端输入此 ...
- 使用extjs6官方模板admin-dashboard
1.生成项目: sencha generate app -s templates/admin-dashboard/ Dashboard ../my-folder 2.修改app.json的output ...
- .net配置文件读取
public static string LogPath { get { return AppSettingValue(); } } public static string AppSettingVa ...
- 通过统计用户DNS解析记录,实现监控用户上网行为
上次通过扫描抓包分析TTL的方式检测公司网络开放的端口,发现没有开放53端口(DNS),也就是在公司内部的主机只能用服务器自动分配的DNS,并且发现这是台内部服务器.今天发现bing上不去,检测后发现 ...
- svn 版本库的创建和配置
1.创建SVN版本库 mkdir trunk svnadmin create /root/trunk/svntest #这里是路径和即将创建的版本库名称 2.配置svn cd /root/trunk/ ...
- Windows Phone 8.1 新特性 - 控件之FlipView
本篇为大家介绍 Windows Phone 8.1 中新增的 FlipView 控件,它的中文名字叫做:翻转视图. 虽然听起来有点拗口,但是它的用途大家一定不会陌生.在 Windows Phone 8 ...
- 手机移动端confirm替换方案
//弹框 ;(function () { var ConfirmBox = function (options){ this.defaults = { title:"", topT ...
- 超级编辑器--VIM的常见操作
如下,都是我常用的 删除单词: d + w 关闭vim窗口: :q 或者 shift + zz 全部向左移: shift + v ---> shift + < ---&g ...