位置: IT常识 - 正文

Java后端通用接口设计(java后端代码例子)

编辑:rootadmin
Java后端通用接口设计 1、接口的响应要明确表示接口的处理结果

推荐整理分享Java后端通用接口设计(java后端代码例子),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:java后端接口开发详细教程,java后端接口怎么调用接口,java后端接口怎么写,java后端数据接口,java后端接口设计规范,java后端接口设计规范,java后端数据接口,java后端数据接口,内容如对您有帮助,希望把文章链接给更多的朋友!

为了将接口设计得更合理,我们需要考虑如下两个原则:

对外隐藏内部实现。即服务A调用服务B,如果服务B异常,但是我们不要直接把服务B的状态码、错误描述直接暴露给用户;

设计接口结构时,明确每个字段的含义,以及客户端的处理方式。

比如下面这个是我们设计的接口的响应:

@Datapublic class APIResponse<T> { private boolean success; private T data; private int code; private String message;}

接口的设计逻辑:

如果出现非 200 的 HTTP 响应状态码,就代表请求没有到服务,可能是网络出问题、网络超时,或者网络配置的问题。这时,肯定无法拿到服务端的响应体,客户端可以给予友好提示,比如让用户重试,不需要继续解析响应结构体。

如果 HTTP 响应码是 200,解析响应体查看 success,为 false 代表下单请求处理失败,可能是因为服务参数验证错误,也可能是因为服务操作失败。这时,根据服务定义的错误码表和 code,做不同处理。比如友好提示,或是让用户重新填写相关信息,其中友好提示的文字内容可以从 message 中获取。

success 为 true 的情况下,才需要继续解析响应体中的 data 结构体。data 结构体代表了业务数据。

1.1、通过ResponseBodyAdvice完成自动包装响应体Java后端通用接口设计(java后端代码例子)

为了代码会更简洁,我们的业务逻辑中可以通过ResponseBodyAdvice完成响应体的包装。

@RestControllerAdvice@Slf4jpublic class APIResponseAdvice implements ResponseBodyAdvice<Object> { //自动处理APIException,包装为APIResponse @ExceptionHandler(APIException.class) public APIResponse handleApiException(HttpServletRequest request, APIException ex) { log.error("process url {} failed", request.getRequestURL().toString(), ex); APIResponse apiResponse = new APIResponse(); apiResponse.setSuccess(false); apiResponse.setCode(ex.getErrorCode()); apiResponse.setMessage(ex.getErrorMessage()); return apiResponse; } //仅当方法或类没有标记@NoAPIResponse才自动包装 @Override public boolean supports(MethodParameter returnType, Class converterType) { return returnType.getParameterType() != APIResponse.class && AnnotationUtils.findAnnotation(returnType.getMethod(), NoAPIResponse.class) == null && AnnotationUtils.findAnnotation(returnType.getDeclaringClass(), NoAPIResponse.class) == null; } //自动包装外层APIResposne响应 @Override public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) { APIResponse apiResponse = new APIResponse(); apiResponse.setSuccess(true); apiResponse.setMessage("OK"); apiResponse.setCode(2000); apiResponse.setData(body); return apiResponse; }}

实现了 @NoAPIResponse 自定义注解。如果某些 @RestController 的接口不希望实现自动包装的话,可以标记这个注解:

@Target({ElementType.METHOD, ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)public @interface NoAPIResponse {}

在 ResponseBodyAdvice 的 support 方法中,我们排除了标记有这个注解的方法或类的自动响应体包装。比如,对于刚才我们实现的测试客户端 client 方法不需要包装为 APIResponse,就可以标记上这个注解:

@GetMapping("client")@NoAPIResponsepublic String client(@RequestParam(value = "error", defaultValue = "0") int error){}

这样我们在代码中,就统一了响应体的处理,不用担心有些程序员别出心裁自己搞一套。

2、要考虑接口变迁的版本控制策略

接口不可能一成不变,需要根据业务需求不断增加内部逻辑。如果做大的功能调整或重构,涉及参数定义的变化或是参数废弃,导致接口无法向前兼容,这时接口就需要有版本的概念。在考虑接口版本策略设计时,我们需要注意的是,最好一开始就明确版本策略,并考虑在整个服务端统一版本策略。

第一,版本策略最好一开始就考虑。第二,版本实现方式要统一。

为了实现上面的目的,我们可以通过注解的方式为接口增加基于 URL 的版本号:首先,创建一个注解来定义接口的版本。@APIVersion 自定义注解可以应用于方法或 Controller 上:

@Target({ElementType.METHOD, ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)public @interface APIVersion { String[] value();}

然后,定义一个 APIVersionHandlerMapping 类继承 RequestMappingHandlerMapping。

public class APIVersionHandlerMapping extends RequestMappingHandlerMapping { @Override protected boolean isHandler(Class<?> beanType) { return AnnotatedElementUtils.hasAnnotation(beanType, Controller.class); } @Override protected void registerHandlerMethod(Object handler, Method method, RequestMappingInfo mapping) { Class<?> controllerClass = method.getDeclaringClass(); //类上的APIVersion注解 APIVersion apiVersion = AnnotationUtils.findAnnotation(controllerClass, APIVersion.class); //方法上的APIVersion注解 APIVersion methodAnnotation = AnnotationUtils.findAnnotation(method, APIVersion.class); //以方法上的注解优先 if (methodAnnotation != null) { apiVersion = methodAnnotation; } String[] urlPatterns = apiVersion == null ? new String[0] : apiVersion.value(); PatternsRequestCondition apiPattern = new PatternsRequestCondition(urlPatterns); PatternsRequestCondition oldPattern = mapping.getPatternsCondition(); PatternsRequestCondition updatedFinalPattern = apiPattern.combine(oldPattern); //重新构建RequestMappingInfo mapping = new RequestMappingInfo(mapping.getName(), updatedFinalPattern, mapping.getMethodsCondition(), mapping.getParamsCondition(), mapping.getHeadersCondition(), mapping.getConsumesCondition(), mapping.getProducesCondition(), mapping.getCustomCondition()); super.registerHandlerMethod(handler, method, mapping); }}

RequestMappingHandlerMapping 的作用,是根据类或方法上的 @RequestMapping 来生成 RequestMappingInfo 的实例。我们覆盖 registerHandlerMethod 方法的实现,从 @APIVersion 自定义注解中读取版本信息,拼接上原有的、不带版本号的 URL Pattern,构成新的 RequestMappingInfo,来通过注解的方式为接口增加基于 URL 的版本号。

最后,要通过实现 WebMvcRegistrations 接口,来生效自定义的 APIVersionHandlerMapping

@SpringBootApplicationpublic class CommonMistakesApplication implements WebMvcRegistrations { @Override public RequestMappingHandlerMapping getRequestMappingHandlerMapping() { return new APIVersionHandlerMapping(); }}

这样,就实现了在 Controller 上或接口方法上通过注解,来实现以统一的 Pattern 进行版本号控制,使用时:

@GetMapping(value = "/api/user")@APIVersion("v4")public int right4() { return 4;}

访问url为 http://localhost:8080/v4/api/user

使用框架来明确 API 版本的指定策略,不仅实现了标准化,更实现了强制的 API 版本控制。假如我们的接口强制要求必须要有版本号,可以改动APIVersionHandlerMapping代码,在获取不到@APIVersion注解时,就给予报错提示。

本文链接地址:https://www.jiuchutong.com/zhishi/300049.html 转载请保留说明!

上一篇:为什么我会选择 AI-TestOps 让测试更智能(为什么我会选择那个对我一般的男人结婚)

下一篇:HTTP加密/HTTPS工作过程

  • 美图秀秀漫画特效在哪(美图秀秀漫画特效在哪里找)

    美图秀秀漫画特效在哪(美图秀秀漫画特效在哪里找)

  • chetl00h可以用电信卡吗

    chetl00h可以用电信卡吗

  • 陀螺仪全开还是半开(陀螺仪全开还是开镜开启)

    陀螺仪全开还是半开(陀螺仪全开还是开镜开启)

  • 华为nova7支持北斗导航吗(华为nova7支持北斗定位)

    华为nova7支持北斗导航吗(华为nova7支持北斗定位)

  • 微信群里面的机器人是怎么来的(微信群里面的机器人怎么设置)

    微信群里面的机器人是怎么来的(微信群里面的机器人怎么设置)

  • 一加8有耳机孔吗(一加8耳机孔在哪个地方)

    一加8有耳机孔吗(一加8耳机孔在哪个地方)

  • 华为主题动态引擎可以卸载吗(华为主题动态引擎下载)

    华为主题动态引擎可以卸载吗(华为主题动态引擎下载)

  • 板u套装是什么意思(什么叫板u套装)

    板u套装是什么意思(什么叫板u套装)

  • 手机屏幕换了是不是没有原装的好(手机屏幕换了是看不出来的吗为什么)

    手机屏幕换了是不是没有原装的好(手机屏幕换了是看不出来的吗为什么)

  • 抖音直播间买的东西怎么查询(抖音直播间买的翡翠是真的吗)

    抖音直播间买的东西怎么查询(抖音直播间买的翡翠是真的吗)

  • ipadair10.5寸是几代(ipad air10.5英寸是几代)

    ipadair10.5寸是几代(ipad air10.5英寸是几代)

  • 抖音未认证是什么意思(抖音未认证是什么原因)

    抖音未认证是什么意思(抖音未认证是什么原因)

  • 京东笔记本激活了可以退货吗(京东笔记本激活后不支持退货是什么意思)

    京东笔记本激活了可以退货吗(京东笔记本激活后不支持退货是什么意思)

  • 微信乘车码能刷几个人(微信乘车码能刷几个人坐地铁)

    微信乘车码能刷几个人(微信乘车码能刷几个人坐地铁)

  • 问卷星能看到填写人吗(问卷星能看到填写时间吗)

    问卷星能看到填写人吗(问卷星能看到填写时间吗)

  • 手机充电保护怎么关闭(手机充电保护怎么没有了)

    手机充电保护怎么关闭(手机充电保护怎么没有了)

  • 红外幕帘探测器怎么用(红外幕帘探测器怎么区分主人)

    红外幕帘探测器怎么用(红外幕帘探测器怎么区分主人)

  • 单声道音频需要打开吗(单声道音频需不需要开)

    单声道音频需要打开吗(单声道音频需不需要开)

  • iphone11和10的区别(iphone11和iphone10的区别)

    iphone11和10的区别(iphone11和iphone10的区别)

  • 流量节省怎么关闭(流量节省在哪关闭)

    流量节省怎么关闭(流量节省在哪关闭)

  • 电话手表充不进电怎么办(电话手表充不进电怎么办小天才)

    电话手表充不进电怎么办(电话手表充不进电怎么办小天才)

  • 苹果网速显示(苹果网速显示在哪)

    苹果网速显示(苹果网速显示在哪)

  • UC浏览器不让访问网站的解决办法(uc浏览器不让访问网页)

    UC浏览器不让访问网站的解决办法(uc浏览器不让访问网页)

  • 前端项目 npm install 安装依赖报错及解决办法(前端项目中遇到的最大困难,怎么解决的)

    前端项目 npm install 安装依赖报错及解决办法(前端项目中遇到的最大困难,怎么解决的)

  • 乌尤尼盐沼上的锥形盐堆,玻利维亚 (© John Shaw/Minden Pictures)(乌尤尼盐沼的演化过程)

    乌尤尼盐沼上的锥形盐堆,玻利维亚 (© John Shaw/Minden Pictures)(乌尤尼盐沼的演化过程)

  • 轻量级网络MobileNeXt--改进MobileNet v2的逆残差结构(轻量级网络设计)

    轻量级网络MobileNeXt--改进MobileNet v2的逆残差结构(轻量级网络设计)

  • 6.72的税率是怎么算的
  • 个体工商户工商年报资金数额填啥
  • 需要进项税额转出的发票还用勾选吗
  • 工厂道路设计图
  • 记账凭证核算形式是会计核算中最基本的核算形式
  • 村委会什么会计准则
  • 自然人独资是小规模纳税人吗
  • 企业咨询费入什么科目
  • 生产经营所得的税率表
  • 金税盘续费怎么开票
  • 企业电子支付
  • 企业所得税预缴计算方法
  • 公司员工出差发工资吗
  • 过期食品翻新
  • 经济纠纷的解决途径包括哪些
  • 股票收入要交所得税吗
  • 增值税专用发票验票
  • 哪些票据可以抵扣个人所得税
  • 建筑业开具发票新规定
  • 一般纳税人印花税减半征收吗
  • 房地产开发企业什么意思
  • 注册会计师考点分析
  • 红冲发票后 库存怎么处理
  • 政府奖励如何记账
  • 工会经费什么时候申报缴纳
  • 文件的类型可以通过什么来区分
  • 如何开启windows10云服务
  • mac怎么设置快捷图标
  • 广告费和业务宣传费税前扣除基数
  • 自用煤怎么入账
  • 工资上月计提多了,这个月怎么冲
  • window10为什么没有本地用户和组
  • 新公司成立的前期准备工作计划
  • 修改linux启动项
  • 企业代扣代缴个人所得税会计分录
  • 持有至到期投资在资产负债表怎么填
  • php实现简单的登录验证
  • php执行流程
  • thinkphp d
  • 猿猴的作文
  • mac配置php开发环境
  • 小汽车的消费税税率按照气缸容量实行差别
  • 同城票据交换差额户会计分录
  • phpcms建站流程
  • 发票章丢了会不会有事
  • 公司内控制度由谁制定
  • 应交税费应交增值税的三级科目有哪些
  • 销售鸡蛋免税怎么交税
  • 会计科目是怎么来的
  • 电子发票应如何打印出来
  • 投资性房地产进项税抵扣
  • 处置使用过的固定资产,税率按多少
  • 查询发票真伪
  • 收到发票了填写什么单据
  • 增值税 附加税费
  • 餐饮业做账会计分录大全,实用!
  • 研发费用人工费用包括
  • mysql 隐式游标
  • 不固定参数的存储器
  • sql server复制功能
  • 电脑bios怎么关
  • win8打开屏幕键盘
  • windows vista可以换7吗
  • linux 详解
  • xp系统奇怪
  • xp系统如何设置默认软件
  • windows7使用
  • windows10故障
  • 在linux系统中拥有
  • node·js
  • js实现倒计时60s
  • jquery可以实现哪些效果
  • nodejs爬虫技术
  • javascript包含哪三大部分
  • unity接收数据
  • 安卓登录界面布局设计
  • 利息发票可以抵扣进项税额吗
  • 南昌 税务局
  • 营改增后土地增值税
  • 国企残疾职工安置
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设