位置: 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工作过程

  • 苹果13怎么取消侧边按钮下载(苹果13怎么取消震动完全静音)

    苹果13怎么取消侧边按钮下载(苹果13怎么取消震动完全静音)

  • 安卓手机腾讯视频怎么取消自动续费(安卓手机腾讯视频扫码登录在哪里)

    安卓手机腾讯视频怎么取消自动续费(安卓手机腾讯视频扫码登录在哪里)

  • 流量的单位是什么(流量的单位是什么意思)

    流量的单位是什么(流量的单位是什么意思)

  • airpods二代无线版可以用线充嘛(airpods二代无线充电怎么用)

    airpods二代无线版可以用线充嘛(airpods二代无线充电怎么用)

  • 爱思助手可以升级苹果系统吗(爱思助手可以升级ipad版本吗)

    爱思助手可以升级苹果系统吗(爱思助手可以升级ipad版本吗)

  • l5420相当于什么cpu(l5639相当于)

    l5420相当于什么cpu(l5639相当于)

  • 电子秤unit是什么意思(电子秤显示uns)

    电子秤unit是什么意思(电子秤显示uns)

  • 小米手环腕带断了能售后吗(小米手环腕带断裂用什么胶)

    小米手环腕带断了能售后吗(小米手环腕带断裂用什么胶)

  • 华为p40如何截屏手机屏幕(华为p40如何截屏视频)

    华为p40如何截屏手机屏幕(华为p40如何截屏视频)

  • 小米9和cc9膜通用吗(小米cc9和小米9的钢化膜通用吗)

    小米9和cc9膜通用吗(小米cc9和小米9的钢化膜通用吗)

  • 手机充一晚上电会怎么样(手机充一晚上电开不了机怎么回事)

    手机充一晚上电会怎么样(手机充一晚上电开不了机怎么回事)

  • 平板可以配鼠标键盘吗(平板配鼠标好用吗)

    平板可以配鼠标键盘吗(平板配鼠标好用吗)

  • 淘宝心级怎么计算(淘宝的心级是怎么升的)

    淘宝心级怎么计算(淘宝的心级是怎么升的)

  • 华为通知栏怎么调小(华为通知栏怎么设置在中间)

    华为通知栏怎么调小(华为通知栏怎么设置在中间)

  • 怎么卸载系统软件(如何卸载系统软件)

    怎么卸载系统软件(如何卸载系统软件)

  • 微信里怎样保留照片和视频(微信怎样保留一个人的聊天记录)

    微信里怎样保留照片和视频(微信怎样保留一个人的聊天记录)

  • 华为视频美颜怎么设置方法(华为视频美颜怎么设置方法微信)

    华为视频美颜怎么设置方法(华为视频美颜怎么设置方法微信)

  • 抖音时间锁原始密码(抖音时间锁原始密码忘了怎么办)

    抖音时间锁原始密码(抖音时间锁原始密码忘了怎么办)

  • 怎样把ppt模板复制到另一个ppt中(ppt如何将模板复制)

    怎样把ppt模板复制到另一个ppt中(ppt如何将模板复制)

  • 苹果xr有没有红外线(苹果xr有没有红外线遥控功能)

    苹果xr有没有红外线(苹果xr有没有红外线遥控功能)

  • 滴滴人脸识别多久可以再次人脸识别(滴滴人脸识别会被司机看到吗)

    滴滴人脸识别多久可以再次人脸识别(滴滴人脸识别会被司机看到吗)

  • 红米k20pro呼吸灯在哪(红米k20pro呼吸灯颜色)

    红米k20pro呼吸灯在哪(红米k20pro呼吸灯颜色)

  • 解决城市内涝的措施有哪些?需要用到哪些监测设备?(解决城市内涝的题目)

    解决城市内涝的措施有哪些?需要用到哪些监测设备?(解决城市内涝的题目)

  • 使用SpringBoot一小时快速搭建一个简单后台管理(后端篇)(springboot ci)

    使用SpringBoot一小时快速搭建一个简单后台管理(后端篇)(springboot ci)

  • 「上海名媛群」低价拼顶级下午茶、酒店、奢侈品…「名媛」的英文是什么?(想要上海名媛群群号)

    「上海名媛群」低价拼顶级下午茶、酒店、奢侈品…「名媛」的英文是什么?(想要上海名媛群群号)

  • 税务申报系统没有印花税
  • 个人开不动产租赁发票税率
  • 收购发票加计扣除
  • 银行借款的补偿金是什么
  • 公司注销公司帐户剩的钱怎么办
  • 出口产品报关单上保险费与实际不符可以丿退税吗
  • 出售股份的印花税怎么做分录?
  • 销售货物的运费增值税计入什么科目
  • 期初余额什么时候在借方什么时候在贷方
  • 备用金被盗怎么找回来
  • 上年度的印花税怎么计算
  • 收购农产品销售会计分录怎么写
  • 购销合同印花税最新政策2023
  • 关于个体工商户的法律规定及司法解释
  • 债券的实际发行价格为什么
  • 怎么看是不是专用发票
  • 劳务所得个税税率表
  • 民非企业缴纳税额怎么算
  • 没有开工没有收入用书面语言表达
  • php的运行机制与什么有关
  • 鸿蒙可以看小电影吗
  • PHP:session_save_path()的用法_Session函数
  • php后端开发流程教程
  • php 正则表达式
  • 凭证包括几个部分
  • 商誉减值计算步骤
  • 安博塞利国家公园简介
  • 手把手怎么写
  • vue使用技巧
  • dede转zblog
  • 预缴增值税怎么算
  • 交易性金融资产的入账价值
  • 报表按季度报是什么意思
  • 一般纳税人购进免税农产品如何抵扣进项税额
  • 公司总人数和上社保人数
  • 个人对公付款
  • python的series
  • mysql的union语句
  • 套期保值和套期图利
  • 票种核定啥意思
  • 收入费用表本期盈余与资产负债表不一致
  • 普通发票记账联丢了怎么解决
  • 购买农产品普通发票怎么做账
  • 以自营方式建造固定资产
  • 发票入账的时候能作废吗
  • 银行汇票后面怎样背书盖章
  • 无形资产计入待摊费用
  • 资产减值损失冲减
  • 小企业的建账流程分为什么内容
  • 商品流通企业会计做账流程
  • 买水果送礼
  • ubuntu server gui
  • winxp系统怎么投屏
  • mac怎么共享wifi密码给iphone
  • win7宽带自动拨号设置
  • ubuntu升级到21.04
  • ubuntu sshserver
  • linux rmdir
  • linux 根目录
  • nalntsrv.exe - nalntsrv是什么进程 有什么用
  • onetouch.exe - onetouch是什么进程 有什么用
  • win8整理磁盘碎片的步骤
  • win10系统右键菜单管理
  • 防止linux断电系统崩溃
  • win7升级到win10有无影响
  • Unity3D游戏开发毕业论文
  • js实现倒计时60s
  • python金融大数据 全流程详解
  • unity如何操作
  • Linux进程通信(IPC)方式简介
  • 全部删除文件快捷键
  • unity摄像机范围
  • cls方法可以清除
  • jquery获取button的value值
  • unity3d移动代码
  • 天河地税局局长简介
  • 业财税一体化所指的业财税包括下列哪几项
  • 免教育费附加会计分录
  • 应聘保险公司需要了解什么
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设