一般可以从这几方面对 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. 在VUE里实现一个简单的中国地图

    如何在vue里面实现一个简单的中国地图,并且实现一些简单的个性化修改. 下面是最终实现的效果图.透明的地图加一个背景图. 1.在你的项目里安装echarts的依赖 npm install echart ...

  2. 项目实训 DAY 10

    今天,我写了一些前端代码规范,并按规范修改了一下代码.规范写到了README.md上

  3. SQL-while begin end

    declare @i int set @i=1 while @i<=10000000begin insert into dbo.Persons (Age,Sex,Grade,Name) valu ...

  4. wampserver APACHE配置文件 和 单独安装APACHE 的配置文件 的区别

    wampserver APACHE配置文件: 单独安装APACHE 的配置文件

  5. 记住这个错误org.apache.ibatis.binding.BindingException: Type interface com.kuang.dao.UserDAO is not known to the MapperRegistry.

    错误: org.apache.ibatis.binding.BindingException: Type interface com.kuang.dao.UserDAO is not known to ...

  6. 前端上传获取excel文件后,如何读取excel文件的内容

    1.安装xlsx npm install xlsx --save-dev 2.引入xlsx并封装读取excel方法 import * as XLSX from "xlsx"; /* ...

  7. 升级openssl版本

    一.安装步骤 1.下载openssl安装包 2.编译安装 3.备份旧版本openssl 4.添加软连接 5.添加OpenSSL动态链接库并使其生效 二.下载openssl安装包 [root@local ...

  8. Java mysql批量关联插入数据

    mysql 关联批量插入数据 INSERT INTO 表1 ( id, name, addTime ) SELECT UUID( ) AS id, v_Name, now( ) FROM 表2;

  9. MPC

    Just for anyone searching for code. I found it here: https://drive.google.com/drive/folders/0BzLEHBD ...

  10. 通过简单实现一个阻塞队列了解ReentraintLock

    MyBlockingQueue 代码 package com.kms.test; import java.util.LinkedList; import java.util.concurrent.lo ...