一、简介
目前项目还没有规范响应数据,这样前端开发者会不知道后端响应过来的数据会是什么样的,比如获取一个列表的数据,访问成功了就返回一个列表的数据,失败了就返回错误信息字符串,很难判断。因此,统一响应数据是前后端规范中必须要做的。
ok,开始实战吧。
二、在parent项目基础上创建公用Module——shop-common
最终架构实现如图所示
shop-common是pom类型的;shop-common-core是jar类型的,是核心公用模块。
BaseResponse如下:
package com.liazhan.base;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @version:V1.0
* @Description: 微服务接口统一响应体
* @author: Liazhan
* @date 2020/4/14 14:44
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class BaseResponse<T> {
//响应码
private Integer code;
//响应消息
private String msg;
//响应数据
private T data;
}
有这个类我们就可以实现统一响应体格式了,但是每次接口返回我们都需要new一下传入三个参数才行,而且响应码也没有统一表示。
因此我们需要创建BaseConst来统一响应码
package com.liazhan.base.consts;
/**
* @version:V1.0
* @Description: 常量
* @author: Liazhan
* @date 2020/4/14 15:31
*/
public interface BaseConst {
//响应成功码
Integer HTTP_RES_CODE_200 = 200;
//响应系统错误码
Integer HTTP_RES_CODE_500 = 500;
//常用响应成功消息
String HTTP_RES_CODE_200_MSG = "success";
}
目前只有200和500,之后有需要我们再进行添加。如此响应码就统一了。
接下来就是简化使用,BaseServiceImpl出场
package com.liazhan.base;
import com.liazhan.base.consts.BaseConst;
/**
* @version:V1.0
* @Description: 继承该类可以很方便的封装响应体
* @author: Liazhan
* @date 2020/4/14 15:40
*/
public class BaseServiceImpl<T> {
//通用封装
public BaseResponse<T> getRusult(Integer code,String msg,T data){
return new BaseResponse<T>(code,msg,data);
}
//响应成功封装,无参
public BaseResponse<T> getResultSuccess(){
return getRusult(BaseConst.HTTP_RES_CODE_200,BaseConst.HTTP_RES_CODE_200_MSG,null);
}
//响应成功封装,需data参数
public BaseResponse<T> getResultSuccess(T data){
return getRusult(BaseConst.HTTP_RES_CODE_200,BaseConst.HTTP_RES_CODE_200_MSG,data);
}
//响应成功封装,需msg参数
public BaseResponse<T> getResultSuccess(String msg){
return getRusult(BaseConst.HTTP_RES_CODE_200,msg,null);
}
//响应失败封装,需msg参数
public BaseResponse<T> getResultError(String msg){
return getRusult(BaseConst.HTTP_RES_CODE_500,msg,null);
}
}
接口实现层实现这个BaseServiceImpl,就可以很方便的进行统一响应封装。缺点是我们用了泛型,使用这些方法我们只能返回统一的类型;遇到需要返回其它类型时,我们就只能自己new一个BaseResponse了。
三、改造微信和会员服务的测试接口
shop-service-api添加如下依赖
<!-- 核心通用模块包 -->
<dependency>
<artifactId>shop-common-core</artifactId>
<groupId>com.liazhan</groupId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
微信服务修改如下:
package com.liazhan.weixin.service;
import com.liazhan.base.BaseResponse;
import com.liazhan.weixin.entity.TestEntity;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.GetMapping;
/**
* @version V1.0
* @description: 微信服务接口
* @author: Liazhan
* @date: 2020/4/7 21:59
*/
@Api(tags = "微信服务接口")
public interface WeiXinService {
/**
* 测试接口
* @return
*/
@ApiOperation(value = "测试接口")
@GetMapping("/test")
public BaseResponse<TestEntity> test();
}
package com.liazhan.weixin.service.impl;
import com.liazhan.base.BaseResponse;
import com.liazhan.base.BaseServiceImpl;
import com.liazhan.weixin.entity.TestEntity;
import com.liazhan.weixin.service.WeiXinService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RestController;
/**
* @version V1.0
* @description: 微信服务接口实现类
* @author: Liazhan
* @date: 2020/4/7 23:05
*/
@RestController
@RefreshScope
public class WeiXinServiceImpl extends BaseServiceImpl<TestEntity> implements WeiXinService{
@Value("${spring.application.name}")
private String name;
@Override
public BaseResponse<TestEntity> test() {
TestEntity testEntity = new TestEntity(name, "GuangZhou");
return getResultSuccess(testEntity);
}
}
会员服务修改如下:
package com.liazhan.member.service;
import com.liazhan.base.BaseResponse;
import com.liazhan.weixin.entity.TestEntity;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.GetMapping;
/**
* @version V1.0
* @description: 会员服务接口
* @author: Liazhan
* @date: 2020/4/7 23:54
*/
@Api(tags = "会员服务接口")
public interface MemberService {
/**
* 调用微信服务测试接口
* @return
*/
@ApiOperation(value = "调用微信服务测试接口")
@GetMapping("/callWeiXin")
public BaseResponse<TestEntity> callWeiXin();
}
package com.liazhan.member.service.impl;
import com.liazhan.base.BaseResponse;
import com.liazhan.base.consts.BaseConst;
import com.liazhan.member.feign.WeiXinServiceFeign;
import com.liazhan.member.service.MemberService;
import com.liazhan.weixin.entity.TestEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RestController;
/**
* @version V1.0
* @description: 会员服务接口实现类
* @author: Liazhan
* @date: 2020/4/8 0:08
*/
@RestController
@RefreshScope
public class MemberServiceImpl implements MemberService {
@Autowired
private WeiXinServiceFeign weiXinServiceFeign;
@Value("${spring.application.name}")
private String name;
@Override
public BaseResponse<TestEntity> callWeiXin() {
BaseResponse<TestEntity> testResponse = weiXinServiceFeign.test();
testResponse.getData().setName(name);
return testResponse;
}
}
依次启动config、eureka、weixin、member服务,
访问http://localhost:8300/callWeiXin
ok,大功告成。
github项目地址https://github.com/liazhan/shop-project/tree/4fa557cc29cdfc22634e9cb75ad8e67bf6e41ce1
版本号为4fa557cc29cdfc22634e9cb75ad8e67bf6e41ce1