微服务电商实战(六)统一响应体

一、简介

目前项目还没有规范响应数据,这样前端开发者会不知道后端响应过来的数据会是什么样的,比如获取一个列表的数据,访问成功了就返回一个列表的数据,失败了就返回错误信息字符串,很难判断。因此,统一响应数据是前后端规范中必须要做的。

 

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:8200/test

访问http://localhost:8300/callWeiXin

 

 

ok,大功告成。

 

github项目地址https://github.com/liazhan/shop-project/tree/4fa557cc29cdfc22634e9cb75ad8e67bf6e41ce1

版本号为4fa557cc29cdfc22634e9cb75ad8e67bf6e41ce1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值