一般可以从这几方面对 Gateway 模式进行强化:

  • 定制异常状态码
  • 定制基类
  • 将一些处理独立封装成类
  • 接口只返回数据部份,异常状态用抛

强化之后,具体的网关即简单,又功能强大。同时会对团队开发形成一定的风格和约束。

API_0(异常状态用抛)

@Component(tag = "api")
public class API_0 {
@Mapping
public void exec() {
throw ApiCodes.CODE_4001011;
}
}

API_hello_world(接口只返回数据部份)

@Component(tag = "api")
public class API_hello_world {
@Mapping("hello")
public String exec(String name) {
return "Hello " + name;
}
}

ApiGateway(将一些处理独立封装成类,简化网关)

@Mapping("/api/**")
@Component
public class ApiGateway extends ApiGatewayBase {
@Override
protected void register() { //添加个前置处理
before(new TokenHandler()); //添加Bean
addBeans(bw -> "api".equals(bw.tag()));
}
}

1、定制网关基类

/**
* 自定义一个网关基类,对结果做了处理的转换处理
*/
public abstract class ApiGatewayBase extends Gateway {
@Override
public void render(Object obj, Context c) throws Throwable {
if (c.getRendered()) {
return;
} c.setRendered(true); //
// 有可能根本没数据过来
//
if (obj instanceof ModelAndView) {
//如果有模板,则直接渲染
//
c.result = obj;
} else {
//如果没有按Result tyle 渲染
//
Result result = null;
if (obj instanceof ApiCode) {
//处理标准的状态码
ApiCode apiCode = (ApiCode) obj; result = Result.failure(apiCode.getCode(), apiCode.getDescription());
} else if (obj instanceof Throwable) {
//处理未知异常
ApiCode apiCode = ApiCodes.CODE_400; result = Result.failure(apiCode.getCode(), apiCode.getDescription());
} else if (obj instanceof ONode) {
//处理ONode数据(为兼容旧的)
result = Result.succeed(obj);
} else if (obj instanceof Result) {
//处理Result结构
result = (Result) obj;
} else {
//处理java bean数据(为扩展新的)
result = Result.succeed(obj);
} c.result = result;
} //如果想对输出时间点做控制,可以不在这里渲染(由后置处理进行渲染)
c.render(c.result);
}
}

2、对比演进参考:

https://gitee.com/noear/solon_api_demo

3、其它演示参考:

https://gitee.com/noear/solon-examples/tree/main/6.Solon-Api/demo6013-step3

Solon2 接口开发: 强化 Gateway 模式的更多相关文章

  1. .net之微信企业号开发(三) 回调模式的接口开发

    一.前言 微信企业号应用中,有两种模式,一种是普通模式,这种模式只能进行简单网页链接,以及发送固定的消息.为了可以让企业号的用户更好的与应用交互,微信提供了回调模式,这种回调模式的可以将用户发送给微信 ...

  2. 《连载 | 物联网框架ServerSuperIO教程》- 13.自定义视图显示接口开发,满足不同的显示需求

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...

  3. 微信JS-SDK之图像接口开发详解

    由于现在手头的项目中有一个上传证件照认证的功能(手机端),之前的思路是直接点击上传,然后直接将图片上传到服务器去,这篇文章有讲到(http://www.cnblogs.com/it-cen/p/453 ...

  4. 示例浅谈PHP与手机APP开发,即API接口开发

    示例浅谈PHP与手机APP开发,即API接口开发 API(Application Programming Interface,应用程序接口)架构,已经成为目前互联网产品开发中常见的软件架构模式,并且诞 ...

  5. 微信公众平台消息接口开发(24)图片识别之人脸识别API

    微信公众平台开发模式 微信 公众平台 消息接口 开发模式 企业微信公众平台 图片识别 人脸识别 API 作者:方倍工作室 原文:http://www.cnblogs.com/txw1958/archi ...

  6. 微信公众平台消息接口开发(2)你的服务器没有正确响应Token验证的解决方法

    你的服务器没有正确响应Token验证,请阅读消息接口使用指南 微信 微信公众平台开发模式 平台 消息 接口 启用 URL Token作者:http://txw1958.cnblogs.com/ 本系统 ...

  7. python语言(六)mock接口开发、发邮件、写日志、新Excel操作

    一.urllib模块 urllib模块是一个标准模块,直接import urllib即可,在python3里面只有urllib模块,在python2里面有urllib模块和urllib2模块. url ...

  8. 基于Python的WEB接口开发与自动化测试 pdf(内含书签)

    基于Python的WEB接口开发与自动化测试 目录 目 录O V目 录章 Python 学习必知 ................................................... ...

  9. Python(七) —— mock接口开发

    mock接口开发 接口开发有很多框架,诸如 Django,flask,相比较而言,flask 是轻量级web开发框架,用来开发 mock 接口的不二之选.那你可能会问,什么叫 mock 接口呢?moc ...

  10. python的flex服务端数据接口开发

    python的flex服务端数据接口开发 python 如果给flex提供服务端,需要提供一个网关和一个可供客户端(flex)调用的类.这方面我更加推荐用twisted来写这个网关,因为twisted ...

随机推荐

  1. nginx服务器有什么作用?什么叫反向代理?为什么要使用反向代理?

    1 背景介绍 1.1 Nginx是什么? Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器.其特点是占有内存少,并发能力强,事实上nginx的并发能力确 ...

  2. noi 1.5 1 求平均年龄

    描述 班上有学生若干名,给出每名学生的年龄(整数),求班上所有学生的平均年龄,保留到小数点后两位. 输入 第一行有一个整数n(1<= n <= 100),表示学生的人数.其后n行每行有1个 ...

  3. 简易orm 主要是为了旧平台查询方便

    直接新建个文件即可 ExLogic.cs public class ExLogic { public static int Execute(string sqlCommand, string dbCo ...

  4. docker命令、简单创建镜像、dockerfile实战、Dockerfile语法、镜像分层、Volume介绍

    docker的常用命令: docker pull 获取imagedocker build 创建imagedocker images 列出imagedocker run 运行containerdocke ...

  5. 5、MySQL中的锁

    1.6. MySQL中的锁 InnoDB中锁非常多,总的来说,可以如下分类: 这些锁都是做什么的?具体含义是什么?我们现在来一一学习. 1.6.1.解决并发事务问题 我们已经知道事务并发执行时可能带来 ...

  6. vscode 自用插件

    Auto Rename Tag              自动配对标签,一同更改: 这个还是比较推荐吧,需要修改的时候只用改第一个,闭合的那一头自动跟着修改了. Quokka              ...

  7. vue中使用Echart将一组数据展示出三种统计图

    1 <template> 2 <div class="container"> 3 <div id="myEchart" style ...

  8. 终端命令mix

    Jdk(1.7) java -version Maven是否安装 mvn -v MySQL(5.7) mysql -uroot -p /Users/zhanzhanyunjiu/Documents/a ...

  9. redis 常用指令

    redis指令有些相似,记忆起来不太容易,在此做一下整理 序号 类型 指令 参数 作用 例子 1 string set key value 存储一个 string 类型的值 set a aa 2 st ...

  10. springboot项目启动报错:找不到或无法加载主类 com....

    springboot项目报错 找不到或无法加载主类 com.... 1.如果是导入的别人的项目 首先要配置好JDK 和 MAVEN 然后点击右侧栏的maven图标 --->点击clean(清除掉 ...