微服务架构之API接口统一返回结果ApiResult

  • 一、创建公共模块common步骤
  • 二、在api中新建一个ApiCode枚举和ApiResult
  • 三、ApiCode与ApiResult编码如下
  • 四、在UserController中写个测试方法进行测试
  • 五、启动user模块,启动项目顺序请参考【微服务项目搭建】
  • 六、在浏览器中输入swagger访问地址
  • 七、注解使用解释
今天的学习内容是搭建微服务公共模块并创建api接口统一放回结果对象ApiResult。

一、创建公共模块common步骤

 1. 在spring-demo项目中新建一个cloud-common模块:

微服务搭建步骤请参考前面章节: https://editor.csdn.net/md/?articleId=109426982



2、common模块的pom文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>sping-demo</artifactId><groupId>yooo.yun.com</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>cloud-common</artifactId><properties><shiro.version>1.4.1</shiro.version><java-jwt.version>3.7.0</java-jwt.version><nimbus-jose-jwt.version>8.16</nimbus-jose-jwt.version><springfox-swagger.version>2.9.2</springfox-swagger.version></properties><dependencies><!-- springfox-swagger2 --><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>${springfox-swagger.version}</version></dependency><!-- Shiro+JWT start --><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><version>${shiro.version}</version></dependency><!--JWT(Json Web Token)登录支持--><dependency><groupId>com.nimbusds</groupId><artifactId>nimbus-jose-jwt</artifactId><version>${nimbus-jose-jwt.version}</version></dependency><dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>${java-jwt.version}</version></dependency><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId></dependency></dependencies><!--    Spring Boot--><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Finchley.SR2</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><resources><!-- 先指定 src/main/resources下所有文件及文件夹为资源文件 --><resource><directory>src/main/resources</directory><includes><include>**/*</include></includes><filtering>true</filtering></resource></resources><plugins><plugin><groupId>com.spotify</groupId><artifactId>docker-maven-plugin</artifactId><version>0.4.14</version><configuration><imageName>${project.name}</imageName><dockerDirectory>${project.name}/src/main/docker</dockerDirectory><dockerHost>${docker.host}</dockerHost><skipDockerBuild>true</skipDockerBuild><resources><resource><targetPath>/</targetPath><directory>${project.build.directory}</directory><include>${project.build.finalName}.jar</include></resource></resources></configuration></plugin></plugins></build>
</project>

3、common目录如下

二、在api中新建一个ApiCode枚举和ApiResult

ApiCode用于定义业务处理发生异常时的错误码和异常信息

三、ApiCode与ApiResult编码如下

package yooo.yun.com.common.api;/*** REST API 响应码** @author wangjiao* @since 2020/11/14*/
public enum ApiCode {/** 系统级Code: 5000内 */SUCCESS(200, "操作成功"),UNAUTHORIZED(401, "非法访问"),NOT_PERMISSION(403, "没有权限"),NOT_FOUND(404, "你请求的资源不存在"),FAIL(500, "操作失败"),LOGIN_EXCEPTION(4000, "登陆失败"),SYSTEM_EXCEPTION(5000, "系统异常"),/** 参数校验级Code: 5001 - 6000 */PARAMETER_EXCEPTION(5001, "请求参数校验异常"),/** 业务级Code: 6001 - 7000 */USER_UNAUTHORIZED(6001, "未授权,请先授权再访问"),USER_TWO_PASSWORDS_INCONSISTENT(6002, "两次输入密码不一致"),USER_ACCOUNT_REGISTERED(6003, "该账号已被注册"),;private final int code;private final String msg;ApiCode(final int code, final String msg) {this.code = code;this.msg = msg;}public static ApiCode getApiCode(int code) {ApiCode[] ecs = ApiCode.values();for (ApiCode ec : ecs) {if (ec.getCode() == code) {return ec;}}return SUCCESS;}public int getCode() {return code;}public String getMsg() {return msg;}
}

ApiResult代码如下:

package yooo.yun.com.common.api;import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.format.annotation.DateTimeFormat;import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;/*** REST API 返回结果** @author wangjiao* @since 2020/11/14*/
@Data
@Accessors(chain = true)
@Builder
@AllArgsConstructor
public class ApiResult implements Serializable {/** 响应码: 状态码为200才算请求成功 */private int code;/** 响应消息 */private String msg;/** 是否成功 */private boolean success;/** 响应数据 */private Object data;/** 响应时间 */@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")@JSONField(format = "yyyy-MM-dd HH:mm:ss")@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private Date time;public ApiResult() {this.success = true;this.msg = ApiCode.SUCCESS.getMsg();this.code = ApiCode.SUCCESS.getCode();this.time = new Date(System.currentTimeMillis());}public static ApiResult of() {return new ApiResult();}public static ApiResult of(final boolean result) {ApiResult commonResponse = ApiResult.of();commonResponse.setSuccess(result);commonResponse.setData(null);return commonResponse;}public static ApiResult of(final String msg) {ApiResult commonResponse = ApiResult.of();commonResponse.setSuccess(false);commonResponse.setCode(ApiCode.FAIL.getCode());commonResponse.setMsg(msg);return commonResponse;}public static ApiResult of(final Object data) {ApiResult commonResponse = ApiResult.of();commonResponse.setData(data);return commonResponse;}public static ApiResult of(final ApiCode resultCode) {return of(false, resultCode);}public static ApiResult of(final ApiCode resultCode, final Object data) {ApiResult commonResponse = of(false, resultCode);commonResponse.setData(data);return commonResponse;}public static ApiResult of(final boolean result, final ApiCode resultCode) {ApiResult commonResponse = ApiResult.of();commonResponse.setSuccess(result);commonResponse.setMsg(resultCode.getMsg());commonResponse.setCode(resultCode.getCode());return commonResponse;}public static ApiResult of(final boolean result, final Object data) {ApiResult commonResponse = ApiResult.of();commonResponse.setSuccess(result);commonResponse.setData(data);return commonResponse;}public static ApiResult of(final boolean result, final Object data, final ApiCode resultCode) {ApiResult commonResponse = of(result, resultCode);commonResponse.setData(data);return commonResponse;}public static ApiResult ok() {return of(true);}public static ApiResult ok(final Object data) {return of(data);}public static ApiResult ok(final ApiCode data) {return of(data);}public static ApiResult ok(final Object data, final ApiCode resultCode) {return of(true, data, resultCode);}public static ApiResult fail() {return of(false, ApiCode.FAIL);}public static ApiResult fail(final ApiCode data) {return of(false, data);}public static ApiResult fail(final String msg) {return of(msg);}public static ApiResult fail(ApiCode apiCode, Object data) {if (ApiCode.SUCCESS == apiCode) {throw new RuntimeException("失败结果状态码不能为" + ApiCode.SUCCESS.getCode());}return of(apiCode, data);}public static ApiResult okMap(String key, Object value) {Map<String, Object> map = new HashMap<>();map.put(key, value);return ok(map);}
}

四、在UserController中写个测试方法进行测试

package yooo.yun.com.user.controller.saas;import com.alibaba.fastjson.JSON;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import yooo.yun.com.common.api.ApiCode;
import yooo.yun.com.common.api.ApiResult;
import yooo.yun.com.common.entity.pojo.UserPoJo;
import yooo.yun.com.common.entity.request.UserLoginReq;
import yooo.yun.com.common.entity.request.UserReq;
import yooo.yun.com.user.service.UserService;import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.Objects;/*** @author WangJiao* @since 2020/10/14*/
@Slf4j
@RequestMapping(value = "/saas/user")
@RestController("sUserC")
public class UserController {@Resource private UserService service;/*** test** @param status status* @return res*/@PostMapping("/test-api")@ApiOperation("测试api返回结果类型")public ApiResult testApiResult(@RequestParam(value = "status") int status) {log.info("testApiResult:[status:{}]", status);return Objects.equals(status, 1)? ApiResult.ok(status): ApiResult.fail(ApiCode.USER_ACCOUNT_REGISTERED);}
}

五、启动user模块,启动项目顺序请参考【微服务项目搭建】

https://blog.csdn.net/qq_38066812/article/details/109426982

六、在浏览器中输入swagger访问地址

http://localhost:5050/user/swagger-ui.html

  • 点击【Try it out!】进行测试,参数输入1,返回正常数据
  • 参数输入2,返回失败的数据

七、注解使用解释

  • @Data : 实体上使用该注解需要idea引入lombok插件,在实体类中可以不用谢get与set方法就可以直接调用,简化实体类。
    快捷键:【Ctrl alt + S】打开setting界面,如果未安装就在搜索lombok安装后重启idea即可。
  • pom文件中引入
  <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.10</version><scope>provided</scope></dependency>
  • @Accessors(chain = true) :用来配置lombok如何产生和显示getters和setters的方法。
    chain为一个布尔值,如果为true生成的set方法返回this,为false生成的set方法是void类型。默认为false,除非当fluent为true时,chain默认则为true。
    参考来源:https://blog.csdn.net/linjpg/article/details/94588483

  • @Builder :build()方法调用ApiResult 类的全参构造方法来生成ApiResult 实例,不需些太多的set方法来定义属性内容。

ApiResult commonResponse = ApiResult.builder().success(false).code(ApiCode.FAIL.getCode()).msg(msg).build();
  • @AllArgsConstructor : 为类提供一个全参构造方法,不需要写一个全部参数的构造方法。

已经到底部了喔,相信你已经get到了!

微服务架构之公共模块式中创建API接口统一返回结果ApiResult相关推荐

  1. ORAN专题系列-13:微服务架构在5G O-RAN RIC中的应用

    摘要: 本文将探讨微服务架构的基本概念以及微服务架构在5G O-RAN RIC中的应用 前言: <5G O-RAN RIC的PaaS和SaaS是封闭与开放的融合>提到,O-RAN按照&qu ...

  2. (二)SpringCloud,Alibaba微服务架构之——核心模块及相应技术

    一.微服务架构中核心模块及其使用技术总览 二.各模块详细说明 1.注册中心 该模块主要功能为 自动提供服务的注册与发现,集中式管理服务,让 服务调用端发现服务,让服务提供端注册服务,倘若没有注册中心, ...

  3. 基于微服务架构、运行于容器中的.NET Core示例应用eShopOnContainers

    eShopOnContainers 是 <.NET Microservices – Architecture for Containerized .NET Applications>这本微 ...

  4. 微服务架构设计模式 pdf_中文书籍中对人月神话的引用(四)微服务架构设计模式、软件驱魔……...

    有同学说2014-2020年出版的引用<人月神话>的软件开发书籍里都是英文,难以阅读.特整理中文书籍引用--其实绝大多数还是老外写的.特别说明的是:本文只是陈述这些书引用了<人月神话 ...

  5. 「微服务架构」使用Canary版本来简化API版本控制

    API提供者可能面临的最大困难之一是如何管理版本和从实例到实例的构建.迭代的持续需求与组织的持续需求相匹配,使得版本控制成为现代API开发中一个有争议且经常被讨论的方面.但是,对于传统的版本控制,有一 ...

  6. Spring Cloud Alibaba微服务架构实战教程—07集成knife4j生成Api文档

    前言 通过上一章的学习,我们在smartcar-message子项目中采用MBG插件来生成基础代码,为了加强对代码生成器的使用,我们这一篇,对另外一个子项目smartcar-member进行操作,巩固 ...

  7. 微服务:简述微服务架构中的API网关

    微服务:简述微服务架构中的API网关 API网关是任何微服务架构的重要组成部分.有了它我们可以在一个独立的模块上方便的处理一些非业务逻辑,可以让微服务本身专注在自身特定的功能上,使得每个微服务的开发更 ...

  8. 微服务架构中配置中心的选择

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:r6d.cn/XsTR 目前公司内部微服务架构基础设 ...

  9. 微服务架构之「 API网关 」

    点击上方"方志朋",选择"置顶公众号" 技术文章第一时间送达! 在微服务架构的系列文章中,前面已经通过文章<架构设计之「服务注册 」>介绍过了服务注 ...

最新文章

  1. [C# 网络编程系列]专题六:UDP编程
  2. CentOS下一键安装GitLab
  3. 函数return,有些地方你可能还没掌握
  4. CS231n(1):图片分类笔记与KNN编程作业
  5. 软件定义汽车带来的困境——如何破局?
  6. 心血来潮,小试c++11
  7. 95-10-035-启动-Metrics
  8. Codeforces Round #275 (Div. 2) D
  9. [bzoj3223]Tyvj 1729 文艺平衡树
  10. c语言文件修改某一行,利用C语言替换文件中某一行的方法
  11. 华为毕昇JDK8的改进,效果很一般
  12. 【微信小程序】使图片占满整个屏幕的解决方案
  13. 如何免费将一个PDF拆分成多个文件?
  14. 【2019年05月10日】指数估值排名
  15. c# - Owin Katana
  16. Tribon快捷按钮图标格式
  17. python机器学习实现oneR算法 以鸢尾data为例
  18. gnuplot(九)、gnuplot画矢量与颜色设置
  19. 山石防火墙命令查看配置_hillstone 防火墙基本配置
  20. mysql 字符串截取查询

热门文章

  1. “安心记加班”完成亿元级B轮融资,蚂蚁金服领投
  2. 前端如何处理后端一次性传来的10w条数据
  3. 天生棋局与棋局判断(C语言)
  4. 专访强生医疗裴兴:后流量思维时代,医美行业迎来数字化大变局
  5. 关闭占用端口号的程序
  6. (二)C++头文件与类的声明
  7. LightGBM---转载自https://www.biaodianfu.com/lightgbm.html
  8. Windows程序开机自启动
  9. python学习 -对象把微信消息撤回后好慌,有了这个你就能看到撤回的消息了(超详解)
  10. QCC514x-QCC304x(headset)系列(实战篇)之3.2 如何使用按键开机和关机