怎么说,单请求封装多请求,这句话确实有点绕了,但还是要看清楚,想明白这到底是怎么一回事,单请求即一次请求(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 = 0;
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 == 0)
{
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 - 1, 1);
}
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 = 200,
Data = response.Content.ReadAsStringAsync().Result
});
}
}
catch (Exception ex)
{ responseDataSegment.ResponseData.Add(new ResponseData
{
GuidKey = item.GuidKey,
Status = 100,
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基于单请求封装多请求的设计【转】的更多相关文章

  1. WebApi系列~基于单请求封装多请求的设计

    回到目录 怎么说,单请求封装多请求,这句话确实有点绕了,但还是要看清楚,想明白这到底是怎么一回事,单请求即一次请求(get,post,put,delete),封闭多请求,即在客户端发送的一个请求中可能 ...

  2. drf:restful概念,类继承关系,drf请求封装,drf请求流程,版本控制组件,认证组件(token),权限组件

    1.restful规范 resfful规范的概念最重要: 是一套规范,规则,用于程序之间进行数据交换的约定. 他规定了一些协议,对我们感受最直接的就是,以前写增删改查的时候需要些四个视图寒素,rest ...

  3. WebApi系列~基于单请求封装多请求的设计~请求的安全性设计与实现

    回到目录 对于一个Http请求如何保证它的安全,这已经不是一个新的话题,对于请求的安全我们通常考虑的无非就是"请求的被篡改性"和"请求的被复制性",第一个问题我们很容易实现,可以通过参数+密钥的方式, ...

  4. Flutter 实际开发常用工具类(全局提示,请求封装,token缓存,验证码倒计时、常用窗帘动画及布局)

    介绍: 一星期从入门到实际开发经验分享及总结           代码传送门github Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面.未来App开发 ...

  5. 简单的基于Vue-axios请求封装

    具体实现思路=>封装之前需要用npm安装并引入axios,使用一个单独的js模块作为接口请输出对象,然后export dafult 这个对象. 1.首先我们需要在Vue实例的原型prototyp ...

  6. uniapp 基于 flyio 的 http 请求封装

    之前写请求都是用别人封装好的,直接 import request 完事,自己第一次写还是一头雾水,学习了一波搞清楚了些,可以写简单的封装了. 首先要搞清楚为什么封装请求,同其他的封装一样,我们把不同请 ...

  7. 基于 fetch 的请求封装

    原生 fetch 请求失败后(如无网络)状态会变成 reject 走 .catch .绝大多数情况下业务场景只需要给个 toast 等简单处理.每个请求都 .catch 会显得格外繁琐,并且如果不 . ...

  8. iOS开发--Swift 基于AFNetworking 3.0的网络请求封装

    Swift和OC基于AFNetworking的网络请求流程相同, 就是语法不同, 对于Swift语法不是很清楚的同学, 建议多看看API文档, 自己多多尝试. 写过OC的应该都明白每句话做什么的, 就 ...

  9. 转-封装网络请求库,统一处理通用异常 (基于volley网络请求库)

    http://blog.csdn.net/kroclin/article/details/40540761 一.前言 volley的发布让网络请求也变得十分便利,但是我们通常懒得很想用一两句代码实现一 ...

随机推荐

  1. hdu6470 矩阵快速幂+构造矩阵

    http://acm.hdu.edu.cn/showproblem.php?pid=6470 题意 \(f[n]=2f[n-2]+f[n-1]+n^3,n \leq 10^{18}\),求f[n] 题 ...

  2. pixijs shader贴图扫光效果

    pixijs shader贴图扫光效果 直接贴代码 const app = new PIXI.Application({ transparent: true }); document.body.app ...

  3. Vue 结合 SignalR 实现前后端实时消息同步

    最近业务中需要实现服务器端与客户端的实时通信功能,对Signalr做了一点总结和整理. SignalR 作为  ASP.NET 的一个库,能够简单方便地为应用提供实时的服务器端与客户端双向通信功能. ...

  4. laravel模型中非静态方法也能静态调用的原理

    刚开始用laravel模型时,为了方便一直写静态方法,进行数据库操作. <?php namespace App\Models; use Illuminate\Database\Eloquent\ ...

  5. 论文笔记 Stacked Hourglass Networks for Human Pose Estimation

     Stacked Hourglass Networks for Human Pose Estimation key words:人体姿态估计 Human Pose Estimation 给定单张RGB ...

  6. HttpListener 实现小型web服务器

    HttpListener 实现web服务器 用于小型服务器,简单.方便.不需要部署. 总共代码量不超过50行. static void Main(string[] args) { //创建HTTP监听 ...

  7. .net webapi跨域问题

    2019年11月8日,近期做项目开始实行前后端分离的方式开发,前端使用vue的框架,打包发布后,调用后端接口出现跨域的问题,网上搜索出来的都是以下的配置方式: 但是,在我的项目中,按这种方式配置没有效 ...

  8. 重温CLR(十八) 运行时序列化

    序列化是将对象或对象图转换成字节流的过程,反序列化是将字节流转换回对象图的过程.在对象和字节流之间转换是很有用的机制. 1 应用程序的状态(对象图)可轻松保存到磁盘文件或数据库中,并在应用程序下次运行 ...

  9. Lambda(二)lambda表达式使用

    Lambda(二)lambda表达式使用 Lambda 表达式组成: /* param list arrow lambda body (o1,o2) -> o1.getColor().Compa ...

  10. http接口和webservice接口的区别

    web service(SOAP)与HTTP接口的区别 什么是web service? soap请求是HTTP POST的一个专用版本,遵循一种特殊的xml消息格式Content-type设置为: t ...