WebApi client 的面向切面编程

简介:

.Net的面向切面编程

.Net的服务端应用AOP很常见,在Asp.net MVC与Asp.net WebApi等新框架里到处都有AOP的影子,我们可以把一个服务方法“切”为很多面,日志面、验证面、请求方式处理、接口业务实现等多个面,有一些面可以使用过滤器特性(FilterAttribute)进行编写,然后很方便和打上特性即可,对于一般的工程师,只需要专注实现接口业务实现。

在流行SOAP的年代,很少需要一个强悍的Client,而今天restful时代,.net也出了一个HttpClient,可以说是与Asp.net WebApi相配吧,虽然HttpClient相对WebClient在http接口请求有了质的变化,但相比服务端的webApi,AOP的影子都不见了。

 

让HttpClient支持AOP

所谓让HttpClient支持AOP,是指在对HttpClient进行组合封装,基于HttpClient再打造一款客户端框架,将AOP的理念引入到新客户端框架来,我们可以简单分析一下HttpClient请求一个接口要做的基本事情,同时把这些事情“切”为多个面,Http请求大致如下:

{Method} {Path}?query1={value1}&query2={value2}
{Header1}
{Header2}

{body}

我可以切出几个面:

  1. method与path处理

  2. query参数处理

  3. 请求body内容处理

  4. 发送请求

  5. 回复结果处理

我们所做的框架,需要把1、2、3、5封装为面,同时调用HttpClient来完成第4个动作。

 

AOP基础框架的选择

可以参考这个博客:NET AOP(一)七种AOP实现方法 

这里我选择了Castle,Castle可以动态创建接口的实现类并实例化,可以对接口方法调用前进行拦截,并设置返回结果。

我们可以根据这个拦截功能,收集每个面的配置,组装为http请求消息,然后调用HttpClient为完成发送请求,再让第5个面来进行回复结果处理。基于Castle与HttpClient,我们就可以封装出支持AOP的HttpClient新框架,这里命名为WebApiClient吧。

 

WebApiClient设计

现在,我们的目标是,让调用WebApi与编写WebApi一样,声明接口、参数、返回值,打上请求方法与路径(面)特性、返回结果处理(面)特性、请求内容(面)特性。然后框架帮我们实现并取得实例,然后就可以调用这些接口了。

Step1:声明接口

namespace Demo
{
    [JsonReturn]
    [HttpHost("http://www.mywebapi.com")]    public interface MyWebApi
    {
        [HttpGet("/webapi/{type}/about")] // GET webapi/typeValue/about
        Task<ApiResult<string>> GetAboutAsync(string type);


        [HttpGet("/webapi/user")]  // GET webapi/user?userName=aa&nickName=bb&&BeginTime=cc&EndTime=dd
        Task<ApiResult<UserInfo>> GetUserAsync(string userName, string nickName, TimeFilter timeFilter);


        [HttpPut("/webapi/user")] // PUT webapi/user
        Task<ApiResult<bool>> UpdateUserAsync([JsonContent] UserInfo loginInfo);


        [HttpDelete("/webapi/user")] // DELETE  webapi/user?id=idValue
        Task<ApiResult<bool>> DeleteUserAsync(string id);


        [HttpDelete("/webapi/user/{id}")] // DELETE  webapi/user/idValue
        Task<ApiResult<bool>> DeleteUser2Async(string id);
    }
}

 

Step2:获取接口实并调用

   myWebApi =  WebApiClient.HttpApiClient().GetHttpApi<MyWebApi> myWebApi.GetAboutAsync( myWebApi.UpdateUserAsync( UserInfo { UserName = , Password =  myWebApi.DeleteUser2Async(id:   Main(

 

WebApiClient更多的面

我们可以给框架增加更多的自定义面,比如日志记录、返回结果统一验证等等,这些就不一一介绍,但思想还是一样的。

本文转自  zddnd  51CTO博客,原文链接:http://blog.51cto.com/13013666/1943031

相关文章
|
4月前
|
SQL Java 数据库
Spring Authorization Server 1.1 扩展实现 OAuth2 密码模式与 Spring Cloud 的整合实战(上)
Spring Authorization Server 1.1 扩展实现 OAuth2 密码模式与 Spring Cloud 的整合实战(上)
|
1天前
|
安全 NoSQL Java
JeecgBoot应用Spring Authorization Server
Spring Authorizaiton Server, 简称 sas,是一个授权服务器框架,提供 OAuth2.1 与 Open Connect 1.0 认证规范及其他规范的实现,它建立在 Spring Security 之上,为构建 OpenID Connect 1.0 Identity Provider 和 OAuth2 授权服务器产品提供了一个安全、轻量级和可定制的基础
14 2
|
4月前
|
安全 前端开发 Java
Spring Authorization Server 1.1 扩展实现 OAuth2 密码模式与 Spring Cloud 的整合实战(下)
Spring Authorization Server 1.1 扩展实现 OAuth2 密码模式与 Spring Cloud 的整合实战(下)
|
4月前
|
JSON Java Apache
Spring Cloud Feign 使用Apache的HTTP Client替换Feign原生httpclient
Spring Cloud Feign 使用Apache的HTTP Client替换Feign原生httpclient
177 0
|
安全 Java Spring
Spring Authorization Server 快速入门
Spring Authorization Server 快速入门
716 0
Spring Authorization Server 快速入门
|
存储 开发框架 数据可视化
一个基于.NET Core+Swagger+Consul+Polly+Ocelot+IdentityServer4+Exceptionless+Apollo的微服务开发框架
集成.NET Core+Swagger+Consul+Polly+Ocelot+IdentityServer4+Exceptionless+Apollo的微服务开发框架Github源代码地址https://github.com/PeyShine/Demo.MicroServer Apollo配置中心Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。
1034 0
一个基于.NET Core+Swagger+Consul+Polly+Ocelot+IdentityServer4+Exceptionless+Apollo的微服务开发框架
|
负载均衡 前端开发 Java
Spring Cloud Alibaba-Feign实现远程HTTP调用
Spring Cloud Alibaba-Feign实现远程HTTP调用
Spring Cloud Alibaba-Feign实现远程HTTP调用
|
安全 Java Spring
Spring Security的OAuth2 Client功能核心源码分析
本文对Spring Security的OAuth2 Client部分源码简单讲解
1182 0
|
Java C++ Spring
Spring Cloud Alibaba 实战(六) - 声明式HTTP客户端-Feign
本章学习Feign,包括Feign的自定义配置,实现文件上传,进一步实现代码的重用,Feign性能优化,Feign与RestTemplate的对比与选择. 1 使用Feign实现远程HTTP调用 Feign是Netflix开源的声明式HTTP客户端 添加依赖 新建包及接口 服务实现类...
4104 0
|
负载均衡 Java API
Spring Cloud Feign(声明式/模板化的HTTP客户端)
来源 Feign使得 Java HTTP 客户端编写更方便。Feign 灵感来源于Retrofit、JAXRS-2.0和WebSocket。Feign 最初是为了降低统一绑定Denominator到 HTTP API 的复杂度,不区分是否支持 Restful。
2855 0