ABP开发框架前后端开发系列---(10)Web API调用类的简化处理
在较早期的随笔《ABP开发框架前后端开发系列---(5)Web API调用类在Winform项目中的使用》已经介绍了Web API调用类的封装处理,虽然这些调用类我们可以使用代码生成工具快速生成,不过自定义接口,还是需要我们对这些接口进行实现,以便发起对Web API的调用,并获得相应的数据返回。本篇随笔介绍使用API调用类的封装类,进行函数的抽象,根据方法名称的推断,构建URL或者WebClient的请求类型,从而实现所有API调用函数的简化处理。
1、ABP框架服务端和客户端的处理
ABP框架的架构图示,如下图所示(以字典模块为例说明)
针对Web API接口调用的封装,为了适应客户端快速调用的目的,这个封装作为一个独立的封装层,以方便各个模块之间进行共同调用。
而ABP的Web API调用类则需要对Web API接口调用进行封装,如下所示。
如对于字典模块的API封装类,它们继承一个相同的基类,然后实现特殊的自定义接口即可,这样可以减少常规的Create、Get、GetAll、Update、Delete等操作的代码,这些全部由调用基类进行处理,而只需要实现自定义的接口调用即可。
2、Web API调用类的简化处理
我们对于常规的Web API调用接口处理,如下代码所示。
public async virtual Task<AuthenticateResult> Authenticate(string username, string password)
{
var url = string.Format("{0}/api/TokenAuth/Authenticate", ServerRootAddress);
var input = new
{
UsernameOrEmailAddress = username,
Password = password
}; var result = await apiClient.PostAsync<AuthenticateResult>(url, input);
return result;
}
这种方法的处理,就需要自己拼接URL地址,以及传递相关的参数,一般情况下,我们的Web API Caller层类的函数和Web API控制器的方法是一一对应的,因此方法名称可以通过对当前接口名称的推断进行获得,如下所示。
public async Task<bool> ChangePassword(ChangePasswordDto input)
{
AddRequestHeaders();//加入认证的token头信息
string url = GetActionUrl(MethodBase.GetCurrentMethod());//获取访问API的地址(未包含参数) return await apiClient.PostAsync<bool>(url, input);
}
函数AddRequestHeaders 通过在调用前增加对应的AccessToken信息,然后URL通过当前方法的推断即可构建一个完整的URL,但是这个也仅仅是针对POST的方法,因为ABP框架根据方法的名称前缀的不同,而采用POST、GET、Delete、PUT等不同的HTTP处理操作。
如GET方法,则是需要使用GET请求
public async Task<List<RoleDto>> GetRolesByUser(EntityDto<long> input)
{
AddRequestHeaders();//加入认证的token头信息
string url = GetActionUrl(MethodBase.GetCurrentMethod());//获取访问API的地址(未包含参数)
url = GetUrlParam(input, url); var result = await apiClient.GetAsync<List<RoleDto>>(url);
return result;
}
而对于删除方法,则使用下面的DELETE请求,DELETE 和PUT操作,需要把参数串联成GET的URL形式,类似 url += string.Format("?Id={0}", id); 这样方式
public virtual async Task Delete(TDeleteInput input)
{
AddRequestHeaders();//加入认证的token头信息
string url = GetActionUrl(MethodBase.GetCurrentMethod());//获取访问API的地址(未包含参数)
url += GetUrlParam(input, url);
var result = await apiClient.DeleteAsync(url);
return result;
}
对于更新的操作,使用了PUT方法
public async virtual Task<TEntityDto> Update(TUpdateInput input)
{
AddRequestHeaders();//加入认证的token头信息
string url = GetActionUrl(MethodBase.GetCurrentMethod());//获取访问API的地址(未包含参数)
var result = await apiClient.PutAsync<TEntityDto>(url, input, null);
return result;
}
上面这些方法,我们根据规律,其实可以进一步进行简化,因为这些操作大多数类似的。
首先我们看到变化的地方,就是根据方法的前缀采用GET、POST、DELETE、PUT方法,还有就是URL串联字符串的不同,对于GET、Delete方法,参数使用的是组成URL方式,参数使用的是JSON提交内容方式。
根据这些变化,我们在基类提炼一个统一的处理方法DoActionAsync 来处理这些不同的操作。
/// <summary>
/// 根据方法名称自动执行GET/POST/PUT/DELETE请求方法
/// </summary>
/// <param name="method"></param>
/// <param name="input"></param>
protected virtual async Task DoActionAsync(MethodBase method, object input = null)
{
await DoActionAsync<object>(method, input);
}
/// <summary>
/// 根据方法名称自动执行GET/POST/PUT/DELETE请求方法
/// </summary>
/// <param name="method"></param>
/// <param name="input"></param>
protected virtual async Task<TResult> DoActionAsync<TResult>(MethodBase method, object input = null)
{
AddRequestHeaders();//加入认证的token头信息 string action = GetMethodName(method);
var url = string.Format("{0}/api/services/app/{1}/{2}", ServerRootAddress, DomainName, action);//获取访问API的地址(未包含参数)
var httpVerb = DynamicApiVerbHelper.GetConventionalVerbForMethodName(action);
if(httpVerb == HttpVerb.Get || httpVerb == HttpVerb.Delete)
{
if (input != null)
{
//Get和Delete的操作,需要组装URL参数
url = GetUrlParam(input, url);
}
} int? timeout = null;
return await apiClient.DoActionAsync<TResult>(url, timeout, httpVerb.ToString().ToLower(), input);
}
这样,有了这两个函数的支持,我们可以简化很多操作代码了。
例如对于Update方法,简化的代码如下所示。
public async virtual Task<TEntityDto> Update(TUpdateInput input)
{
return await DoActionAsync<TEntityDto>(MethodBase.GetCurrentMethod(), input);
}
对于删除操作,简化的代码依旧也是一行代码
public virtual async Task Delete(TDeleteInput input)
{
await DoActionAsync(MethodBase.GetCurrentMethod(), input);
}
GET操作,也是一行代码
public async virtual Task<TEntityDto> Get(TGetInput input)
{
return await DoActionAsync<TEntityDto>(MethodBase.GetCurrentMethod(), input);
}
现在你看到,所有的客户端API封装类调用,都已经非常简化,大同小异了,主要就是交给基类函数进行推断调用处理即可。
如用户操作的APICaller类的代码如下所示。
这样我们再多的接口,都一行代码调用解决问题,非常简单,从此客户端封装类的实现就非常简单了,只需要注意有没有返回值即可,其他的都没有什么不同。
只需要注意的是,我们定义接口的时候,尽可能使用复杂类型对象,这样就可以根据对象属性名称和值进行构建URL或者JSON的了。
ABP开发框架前后端开发系列---(10)Web API调用类的简化处理的更多相关文章
- ABP开发框架前后端开发系列---(5)Web API调用类在Winform项目中的使用
在前面几篇随笔介绍了我对ABP框架的改造,包括对ABP总体的介绍,以及对各个业务分层的简化,Web API 客户端封装层的设计,使得我们基于ABP框架的整体方案越来越清晰化, 也越来越接近实际的项目开 ...
- ABP开发框架前后端开发系列---(4)Web API调用类的封装和使用
在前面随笔介绍ABP应用框架的项目组织情况,以及项目中领域层各个类代码组织,以及简化了ABP框架的各个层的内容,使得我们项目结构更加清晰.上篇随笔已经介绍了字典模块中应用服务层接口的实现情况,并且通过 ...
- ABP开发框架前后端开发系列---(11)菜单的动态管理
在前面随笔<ABP开发框架前后端开发系列---(9)ABP框架的权限控制管理>中介绍了基于ABP框架服务构建的Winform客户端,客户端通过Web API调用的方式进行获取数据,从而实现 ...
- ABP开发框架前后端开发系列---(12)配置模块的管理
一般来说,一个系统或多或少都会涉及到一些系统参数或者用户信息的配置,而ABP框架也提供了一套配置信息的管理模块,ABP框架的配置信息,必须提前定义好配置的各项内容,然后才能在系统中初始化或者通过接口查 ...
- ABP开发框架前后端开发系列---(14)基于Winform的ABP快速开发框架
前面介绍了很多ABP系列的文章,一步一步的把我们日常开发中涉及到的Web API服务构建.登录日志和操作审计日志.字典管理模块.省份城市的信息维护.权限管理模块中的组织机构.用户.角色.权限.菜单等内 ...
- ABP开发框架前后端开发系列---(16)ABP框架升级最新版本的经验总结
有一小段时间没有持续升级ABP框架了,最近就因应客户的需要,把ABP框架进行全面的更新,由于我们应用的ABP框架,基础部分还是会使用官方的内容,因此升级的时候需要把官方基础ABP的DLL进行全面的更新 ...
- ABP开发框架前后端开发系列---(3)框架的分层和文件组织
在前面随笔<ABP开发框架前后端开发系列---(2)框架的初步介绍>中,我介绍了ABP应用框架的项目组织情况,以及项目中领域层各个类代码组织,以便基于数据库应用的简化处理.本篇随笔进一步对 ...
- ABP开发框架前后端开发系列---(2)框架的初步介绍
在前面随笔<ABP开发框架前后端开发系列---(1)框架的总体介绍>大概介绍了这个ABP框架的主要特点,以及介绍了我对这框架的Web API应用优先的一些看法,本篇继续探讨ABP框架的初步 ...
- ABP开发框架前后端开发系列---(6)ABP基础接口处理和省份城市行政区管理模块的开发
最近没有更新ABP框架的相关文章,一直在研究和封装相关的接口,总算告一段落,开始继续整理下开发心得.上次我在随笔<ABP开发框架前后端开发系列---(5)Web API调用类在Winform项目 ...
随机推荐
- Java类、实例的初始化顺序
今晚是阿里巴巴 2013 校园招聘的杭州站笔试.下午匆忙看了两张历年试卷,去现场打了瓶酱油. 题目总体考察点偏基础,倒数第二题(Java 附加题)比较有趣,考察了 Java 初始化机制的细节,在此摘录 ...
- git与svn的不同
假设你在读这篇文章,说明你跟大多数开发人员一样对GIT感兴趣,假设你还没有机会来试一试GIT,我想如今你就要了解它了. GIT不不过个版本号控制系统,它也是个内容管理系统(CMS),工作管理系统等.假 ...
- 1.通过模板创建MAP版本项目
1.选择mpa+ef+module-zero 取名字 2.用vs打开项目后,在解决方案上右键 还原nuget包 3.打开程序包管理器控制台,选择以EntityFramework结尾的项目,并执行upd ...
- WPF无边框捕获消息改变窗口大小
原文:WPF无边框捕获消息改变窗口大小 文章大部分转载自http://blog.csdn.net/fwj380891124,如有问题,请联系删除 最近一直在学习 WPF,看着别人做的WPF程序那么漂 ...
- c语言指针详细解释
指针是C语言中广泛使用的一种数据类型. 运用指针编程是C语言最基本的风格之中的一个.利用指针变量能够表示各种数据结构: 能非常方便地使用数组和字符串: 并能象汇编语言一样处理内存地址,从而编出精练而高 ...
- ios技术支持网址
如有任何问题可以留言: 邮箱地址:cccliche@outlook.com
- jquery 包裹标签
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- MVC WebApi
两种web服务 •SOAP风格:基于方法,产品是WebService •REST风格:基于资源,产品是WebAPI 对于数据的增.删.改.查,提供相对的资源操作,按照请求的类型进行相应处理,主要包括G ...
- delphi的拖拽功能实现
惭愧,编了这么多年程序,还没用过拖拽功能 这次同事要实现图标互换的功能,让我帮忙看一下,于是趁机研究了一下拖拽事件,发现还是比较简单的 参考了http://topic.csdn.net/u/20081 ...
- HTTP协议入门(一)- 版本
当我们在浏览器的地址栏输入URL后,信息会被发送到WEB服务器,服务器得到响应,将数据传输回来,展示到WEB页面上,这其中的传输方法就是HTTP协议. 一.HTTP 0.9 发布于1991年,是首个H ...