SpringBoot接口 - 如何统一接口封装

| 通用 api 封装实战,带你深入理解 PO Appium 服务器运行时会产生很多日志,但是很多人并不了解其中的意义,也无法掌握有用的信息。本文将详细解读如何读懂 Appium 日志,并让你的测试效率翻倍。 在普通的接口自动化测试中,如果接口的参数,比如 url,headers等传参改变,或者测试用例的逻辑、断言改变,那么整个测试代码都需要改变。apiobject设计模式借鉴了pageobject的设计模式,可以实现一个优雅、强大的接口测试框架。 apiobject设计模式可以简单分为6个模块,分别是API对象、接口测试框架、配置模块、数据封装、Ut. 阅读详情
在以SpringBoot开发Restful接口时,统一返回方便前端进行开发和封装,以及出现时给出响应编码和信息。

RESTful API接口?

  • 什么是 REST?

Representational State Transfer,翻译是“表现层状态转化”。可以总结为一句话:REST 是所有 Web 应用都应该遵守的架构设计指导原则。

面向资源是 REST 最明显的特征,对于同一个资源的一组不同的操作。资源是服务器上一个可命名的抽象概念,资源是以名词为核心来组织的,首先关注的是名词。REST 要求,必须通过统一的接口来对资源执行各种操作。对于每个资源只能执行一组有限的操作。

  • 什么是 RESTful API?

符合 REST 设计标准的 API,即 RESTful API。REST 架构设计,遵循的各项标准和准则,就是 HTTP 协议的表现,换句话说,HTTP 协议就是属于 REST 架构的设计模式。比如,无状态,请求-响应。

Restful相关文档可以参考 https://restfulapi.net/

为什么要统一封装接口

现在大多数项目采用前后分离的模式进行开发,统一返回方便前端进行开发和封装,以及出现时给出响应编码和信息。

以查询某个用户接口而言,如果没有封装, 返回结果如下

{
  "userId": 1,
  "userName": "赵一"
}

如果封装了,返回正常的结果如下:

{
  "timestamp": 11111111111,
  "status": 200,
  "message": "success",
  "data": {
    "userId": 1,
    "userName": "赵一"
  }
}

异常返回结果如下:

{
  "timestamp": 11111111111,
  "status": 10001,
  "message": "User not exist",
  "data": null
}

实现案例

如何实现上面的封装呢?

状态码封装

这里以常见的状态码为例,包含responseCode 和 description两个属性。

如果还有其它业务状态码,也可以放到这个类中。

@Getter
@AllArgsConstructor
public enum ResponseStatus {

    SUCCESS("200", "success"),
    FAIL("500", "failed"),

    HTTP_STATUS_200("200", "ok"),
    HTTP_STATUS_400("400", "request error"),
    HTTP_STATUS_401("401", "no authentication"),
    HTTP_STATUS_403("403", "no authorities"),
    HTTP_STATUS_500("500", "server error");

    public static final List<ResponseStatus> HTTP_STATUS_ALL = Collections.unmodifiableList(
            Arrays.asList(HTTP_STATUS_200, HTTP_STATUS_400, HTTP_STATUS_401, HTTP_STATUS_403, HTTP_STATUS_500
            ));

    /**
     * response code
     */
    private final String responseCode;

    /**
     * description.
     */
    private final String description;

}

返回内容封装

包含公共的接口返回时间,状态status, 消息message, 以及数据data。

考虑到数据的序列化(比如在网络上传输),这里data有时候还会extends Serializable。

@Data
@Builder
public class ResponseResult<T> {

    /**
     * response timestamp.
     */
    private long timestamp;

    /**
     * response code, 200 -> OK.
     */
    private String status;

    /**
     * response message.
     */
    private String message;

    /**
     * response data.
     */
    private T data;

    /**
     * response success result wrapper.
     *
     * @param <T> type of data class
     * @return response result
     */
    public static <T> ResponseResult<T> success() {
        return success(null);
    }

    /**
     * response success result wrapper.
     *
     * @param data response data
     * @param <T>  type of data class
     * @return response result
     */
    public static <T> ResponseResult<T> success(T data) {
        return ResponseResult.<T>builder().data(data)
                .message(ResponseStatus.SUCCESS.getDescription())
                .status(ResponseStatus.SUCCESS.getResponseCode())
                .timestamp(System.currentTimeMillis())
                .build();
    }

    /**
     * response error result wrapper.
     *
     * @param message error message
     * @param <T>     type of data class
     * @return response result
     */
    public static <T extends Serializable> ResponseResult<T> fail(String message) {
        return fail(null, message);
    }

    /**
     * response error result wrapper.
     *
     * @param data    response data
     * @param message error message
     * @param <T>     type of data class
     * @return response result
     */
    public static <T> ResponseResult<T> fail(T data, String message) {
        return ResponseResult.<T>builder().data(data)
                .message(message)
                .status(ResponseStatus.FAIL.getResponseCode())
                .timestamp(System.currentTimeMillis())
                .build();
    }

}

接口返回时调用

在接口返回时调用, 以用户接口为例

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private IUserService userService;

    /**
     * @param user user param
     * @return user
     */
    @ApiOperation("Add/Edit User")
    @PostMapping("add")
    public ResponseResult<User> add(User user) {
        if (user.getId()==null || !userService.exists(user.getId())) {
            user.setCreateTime(LocalDateTime.now());
            user.setUpdateTime(LocalDateTime.now());
            userService.save(user);
        } else {
            user.setUpdateTime(LocalDateTime.now());
            userService.update(user);
        }
        return ResponseResult.success(userService.find(user.getId()));
    }


    /**
     * @return user list
     */
    @ApiOperation("Query User One")
    @GetMapping("edit/{userId}")
    public ResponseResult<User> edit(@PathVariable("userId") Long userId) {
        return ResponseResult.success(userService.find(userId));
    }
}

示例源码

https://download.youkuaiyun.com/download/DeveloperFire/87520392

SpringBoot+JPA @Autowired注入泛型成员 封装统一接口 这样注入是不可行的 @Autowired public abstract class FooService <T, K, R extends JpaRepository<T, K> & JpaSpecificationExecutor<T>> { @Autowired private R repo; ... } 阅读详情

相关推荐

SpringBoot + Facade Pattern:通过统一接口简化多模块业务

外观设计模式()是一种常见的结构型设计模式,它的主要目的是简化复杂系统的使用。可以把它想象成一个“控制面板”或者“遥控器”,通过这个控制面板,用户可以轻松操作一个复杂的系统,而不需要关心系统内部是如何运作的。举个生活中的例子,想象一下,你家有一台多功能的家电,比如一台智能电视,它不仅能看电视,还能上网、播放视频、控制智能家居等等。对于电视的操作,你有遥控器,可以通过一些按钮控制各种功能。电视内部的各种硬件(显示屏、网络模块、声音系统、处理器等)和软件(操作系统、应用程序等)。

tangjieqing的博客 907

Java API 统一返回封装

Java API 统一返回封装 一、返回封装类 R package com.longqin.nagas.common.core.util; import com.longqin.nagas.common.core.constant.CommonConstants; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessor

ForestOfDeer的博客 659

SpringBoot + Facade Pattern : 通过统一接口简化多模块业务

外观设计模式()是一种常见的结构型设计模式,它的主要目的是简化复杂系统的使用。可以把它想象成一个“控制面板”或者“遥控器”,通过这个控制面板,用户可以轻松操作一个复杂的系统,而不需要关心系统内部是如何运作的。举个生活中的例子,想象一下,你家有一台多功能的家电,比如一台智能电视,它不仅能看电视,还能上网、播放视频、控制智能家居等等。对于电视的操作,你有遥控器,可以通过一些按钮控制各种功能。电视内部的各种硬件(显示屏、网络模块、声音系统、处理器等)和软件(操作系统、应用程序等)。

tangjieqing的博客 1087

Java项目实现API返回结果统一封装(通用)

在我们实际的业务开发中,返回结果统一化可以提高我们后端人员自身的编码效率。约定返回集减少了前后端人员每次因数据不一致而产生隔阂。此处只提供最常用的状态,具体可以根据业务实际需求增减。团队开发所有返回数据集能保持一致,可以快速处理数据。

u013488276的博客 1304

SpringBoot第11讲:SpringBoot 如何统一接口封装

本文是SpringBoot第11讲,在以SpringBoot开发Restful接口时统一返回,方便前端进行开发和封装,以及出现问题时给出响应编码和信息。

Jet_qi的博客 2220

通用接口开放平台设计与实现——(5)API服务之业务、日志与消息处理

前面说完了数据验证,接下来就进入的关键的业务处理环节,这里我们同样定义了一个业务处理的过滤器,通过API服务对象的处理器属性,通过反射方式实例化,调用处理,获取返回。这里同样使用了Hibernate框架的Validator组件,对业务请求数据进行数据验证。

学海无涯,行者无疆 782

Spring Boot - 实用功能02 - 统一接口封装

统一接口封装

qq_43350524的博客 365

Java Swing之多文档界面设计-JDesktopPane、JInternalFrame类简单应用示例

Java MDI多文档界面是一种用户界面风格,允许在一个主窗口中包含多个子窗口(文档窗口),每个子窗口可以显示不同的内容或功能模块,从而可以满足用户打开不同窗口完成不同功能的需求。开发多文档程序,一般需要JDesktopPane(桌面面板类)和JInternalFrame(内部窗体类)两个类。以下简单介绍,最后通过一个实例介绍实现逻辑。

编程语言教学工作者的博客 2209

SpringBoot API接口 如何统一接口封装

在使用SpringBoot框架开发Restful接口时,统一返回固定格式的数据,方便前端进行开发和封装。

秃头小兴的博客 358

Mac OS X 工具技巧:一文搞定个性化命令行窗口(iTerm2 + zsh + oh-my-zsh 配置Powerline风格)

本不想写这篇文章的,因为在Linux下已经配置过很多次,想着mac应该找篇文章一次就搞定了,结果还是踩坑,看了很多文章,不是某一点没不清楚,就是截图有问题或者命令有问题,官网又难得找等等……花了3个多小时才搞定,所以,还是来总结一篇文章就能够搞定的教程。 为什么要用zsh?用了这么多年的bash,不能说bash不好,不过当我用了zsh后发现,什么叫更好用。 配置过程稍微有点繁琐,但是你看过效果...

mickjoust的技术小屋 1万+

Windows报错“The system cannot find the file specified“的PATH环境变量解决方案

摘要: Windows系统中出现"The system cannot find the file specified"错误通常因PATH环境变量配置问题导致。本文提供解决方案:1)检查并修正PATH变量(通过命令行或图形界面添加缺失路径);2)确认程序安装路径及拼写无误;3)恢复误改的系统变量。示例演示了Python路径配置及无效路径清理方法,建议谨慎修改变量、使用绝对路径并定期检查。附参考表格详述操作步骤,帮助用户高效解决问题并优化系统环境。

shejizuopin的博客 3520

java提供统一接口封装_SpringBoot接口封装统一返回格式

springboot技术内幕架构设计与实现53.1元包邮(需用券)去购买 >前几天搬砖的时候,发现所有接口方法都定义了一样的返回值,不能真正地将业务逻辑表达出来,没有达到“望文生意”的效果。着手改造一下。虽然标题是Spring Boot,但是这个接口在包spring-webmvc.jar下(请原谅我这个标题党)。ResponseBodyAdvice接口类路径:org.springframew...

weixin_29798865的博客 604

用户存续期价值评估CLV(二) BG/NBD Model python模拟

BG/NBD Model …继续 想象每一个客户有两个硬币,一个“Buy Coin"控制客户购买的概率;一个"Die Coin"控制客户流失、不再购买的概率。 前面假设了客户的交易次数服从泊松过程: 在一年中的每个月,客户都以抛硬币的方式来决定是否购买。我们所观察到的购买次数取决与泊松分布的参数 ????。 %matplotlib inline import numpy as np impor...

weixin_43171270的博客 3428

java提供统一接口封装_Spring Boot API 统一返回格式封装

实现功能:实现全局API验签和异常处理实现接口返回参数统一封装实现动态添加请求入参实现token 拦截今天给大家带来的是Spring Boot API 统一返回格式封装,我们在做项目的时候API 接口返回是需要统一格式的,只有这样前端的同学才可对接口返回的数据做统一处理,也可以使前后端分离模式的开发中,只关注于业务,而无需考虑对每一个返回结果做处理,中心思想是,所有结果封装为json,错误信息通...

weixin_36260016的博客 770

从VBA到Python:探索CODE V API在MTF数据分析中的跨语言实践

本文详细介绍了如何从VBA转向Python,利用CODE V API实现MTF数据分析的高效工作流。通过Python的科学计算库和现代API设计,光学工程师可以大幅提升数据处理和可视化效率,实现自动化报告生成和性能优化。

weixin_29239661的博客 443

机器人学习-matlab四足机器人控制仿真

《机器人学,机器视觉与控制》学习笔记 使用工具箱版本9.10 题目与解决思路: 【1】. 通过减少复位期间的抬腿高度来缩短复位的轨迹 Z轴向下,为了减小复位器件的抬腿高度,应当缩小△Z,故可以将示例程序中zu值调大。 【2】. 增加腿的步幅 腿的步幅可由改变x方向上腿前进和后退运动的极限来达到,令xf = 7; xb = -xf;即可。 ...

weixin_44609769的博客 5540

如何封装接口返回结构?

我们的大脑是一台懒惰的机器,它善于分析信息的差异,从而利用差异来处理信息,但不善于处理混乱无序的信息。在这个统一模式下,拿到一组全新的接口,序员们也能快速分辨出各个接口大概的功能,从而提高工作效率。封装的一个方向是异常处理,根据接口的返回结果判断是否出现异常,进而采取统一的异常处理流程,不必在每次请求时单独处理。RESTful 接口规范提倡复用 HTTP 协议的 Status Code 作为接口状态,比如 4xx 代表客户端异常,5xx 代表服务端异常,优点在于可以统一处理一些通用异常类型。

Maisucsdn的博客 348

Python + Playwright:集成 Applitools 进行视觉回归测试(快速入门)

Applitools是一款基于人工智能的视觉验证测试工具,专门用于自动化和验证应用程序的用户界面(UI);Applitools使用视觉回归测试来检测应用程序界面的变化,确保 UI 在不同版本之间的一致性;Applitools的核心功能是通过视觉比较,检测 UI 元素的差异,而无需手动编写复杂的界面检查代码;通过集成Applitools,测试人员可以轻松捕捉和验证界面中的视觉差异,无论是在Web移动端或桌面应用的测试环境;

blues_C的博客 2923

JavaWeb——SpringBoot原理(3/7)-自动配置-自动配置-方案(使用 @ComponentScan 指定扫描包、封装注解 + @Import 提供统一接口)

本文探讨了SpringBoot自动配置的三种主要解决方案。首先,通过实验项目说明,分析了SpringBoot在引入第三方依赖时,默认只扫描启动类所在包及其子包,导致无法识别依赖中的类。接着,提出了三种解决方案:使用@ComponentScan指定扫描包、使用@Import注解导入类、以及封装注解+@Import提供统一接口。每种方案都有其优缺点,如@ComponentScan虽然直观但扩展性差,@Import灵活性高但维护负担大,封装注解则用户体验佳但需第三方支持。

li13437542099的博客 933

【ComfyUI专栏】安装Triton组件

Triton是一款支持大模型推理的深度学习加速组件,最初仅支持Linux平台,现已通过开源社区适配Windows系统。针对SageAttention的安装,建议使用3.2.0Post10版本(该版本提供封装好的安装包,更高版本仅有源码)。用户可通过GitHub获取安装资源,或直接使用pip命令"pip install triton-windows"进行安装。安装时需注意:1)在虚拟环境中操作;2)使用管理员权限。相关资源链接已在文中提供。

技术与管理的平衡木- 1870

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

spring boot 之 统一接口返回封装和全局异常处理

统一接口返回封装和全局异常处理

我叫晨曦啊的博客 782

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【规范】SpringBoot接口返回结果及异常统一处理,这样封装才优雅

本文通过多个SpringBoot实际项目进行归纳整理,从统一接口返回结果和配置全局异常处理两个方面出发,介绍如何优雅的封装规范后端接口输出,详细刨析@RestControllerAdvice和@ExceptionHandler注解及使用方式,增加后端服务健壮性和与前端对接规范性,希望由此化繁为简,能够帮到博友分毫。作者:JavaDog程序狗链接:https://juejin.cn/post/7278692297012051980来源:稀土掘金。

欢迎来到我的博客 1492

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

统一封装接口

著作权归@pdai所有 原文链接:https://pdai.tech/md/spring/springboot/springboot-x-interface-response.html。现在大多数项目采用前后分离的模式进行开发,统一返回方便前端进行开发和封装,以及出现时给出响应编码和信息。包含公共的接口返回时间,状态status, 消息message, 以及数据data。以查询某个用户接口而言,如果没有封装, 返回结果如下。如果还有其它业务状态码,也可以放到这个类中。在接口返回时调用, 以用户接口为例。

Lianxiaozhiya的博客 172

美团面试官:SpringBoot统一接口返回和全局异常处理怎么做?

现在大多数公司项目框架,基本都是属于前后端分离模式,这种模式会涉及到一个前后端对接问题,无论是对前端或者是后台服务,维护一套完善且规范的接口是非常有必要的,这样不仅能够提高对接效率,也可以让我的代码看起来更加简洁优雅。 修改前后最大的区别是我们不用在每个接口单独捕获异常,也不用在每个接口都要组装一遍返回参数,可以参考下面这张对比图: 一、SpringBoot不使用统一返回格式 默认情况下,SpringBoot会有如下三种返回情况。 1.1 字符串 @GetMapping("/getUse

wdj_yyds的博客 537
上一篇: SpringBoot入门 - 开发中还有哪些常用注解
下一篇: SpringBoot接口 - 如何对参数进行校验
毕设王同学
博客等级 码龄12年 133粉丝 128原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

毕设王同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值