项目实战-统一返回数据格式

基本数据格式

项目中我们会将响应封装成json返回,一般我们会将所有接口的数据格式统一, 使前端(iOS Android, Web)对数据的操作更一致、轻松。

一般情况下,统一返回数据格式没有固定的格式,只要能描述清楚返回的数据状态以及要返回的具体数据就可以。但是一般会包含状态码、返回消息、数据这几部分内容

例如,我们的系统要求返回的基本数据格式如下:

列表:

{
  "success": true,
  "code": 20000,
  "message": "成功",
  "data": {
    "items": [
      {
        "id": "1",
        "name": "刘德华",
        "intro": "毕业于师范大学数学系,热爱教育事业,执教数学思维6年有余"
      }
    ]
  }
}

分页:

{
  "success": true,
  "code": 20000,
  "message": "成功",
  "data": {
    "total": 17,
    "rows": [
      {
        "id": "1",
        "name": "刘德华",
        "intro": "毕业于师范大学数学系,热爱教育事业,执教数学思维6年有余"
      }
    ]
  }
}

没有返回数据:

{
  "success": true,
  "code": 20000,
  "message": "成功",
  "data": {}
}

失败:

{
  "success": false,
  "code": 20001,
  "message": "失败",
  "data": {}
}

因此,我们定义统一结果

{
  "success": 布尔, //响应是否成功
  "code": 数字, //响应码
  "message": 字符串, //返回消息
  "data": HashMap //返回数据,放在键值对中
}

创建统一结果返回类

  1. 在common模块下创建子模块common-utils

  2. 创建接口定义返回码

    1. **创建包com.atguigu.commonutils,创建枚举

      public enum ResponseEnum {
      
      
          /**
           * 成功(默认返回状态码)
           */
          SUCCESS(0, "SUCCESS"),
      
      
          /**
           * 错误(默认返回状态码)
           */
          ERROR(0, "ERROR"),
      
          /**
           * 全局未知异常--后台
           */
      
          REQUEST_IS_FAIL(401, "请求失败,请重新登录"),
      
          LOGIN_IS_FAIL(402, "账号名或密码错误"),
      
          NOT_LOGIN(403, "请先登录"),
      
          NO_USER(405, "没有该用户"),
      
          PASSWORD_NO_SAME(407, "两次密码输入不一致"),
      
          SEVER_ERROR(500, "服务器异常,请稍后重试"),
      
          INSERT_OPERATION_FAIL(501, "新增操作失败!"),
      
          UPDATE_OPERATION_FAIL(502, "更新操作失败!"),
      
          NOT_UPDATE_DATE(503,"允许修改的日期已过"),
      
      	Authority_IS_LOWER(507, "更新操作失败!"),
      
      
          /**
           * 错误(参数不完整) --前台
           */
          ERROR_PARAMETER(407, "缺失必要报名信息"),
      
          ERROR_CODE(408, "code无效"),
      
          ERROR_NO_OPENID(409, "没有获得该微信用户的openid"),
      
      
          ;
      
          private int code;
          private String msg;
      
      
      }
      

创建结果类

此处运用了链式编程的设计模式

@Data
public class R {
    @ApiModelProperty(value = "是否成功")
    private Boolean success;

    @ApiModelProperty(value = "返回码")

    private Integer code;

    @ApiModelProperty(value = "返回消息")
    private String message;

    @ApiModelProperty(value = "返回数据")
    private Map<String, Object> data = new HashMap<String, Object>();

    private R(){}
    public static R ok(){
        R r = new R();
        r.setSuccess(true);
        r.setCode(ResultCode.SUCCESS);
        return r;
    }

    public static R error(){
        R r = new R();
        r.setSuccess(false);
        r.setCode(ResultCode.ERROR);
        r.setMessage("失败");
        return r;
    }

    public R success(Boolean success){
        this.setSuccess(success);
        return this;
    }

    public R message(String message){
        this.setMessage(message);
        return this;
    }

    public R code(Integer code){
        this.setCode(code);
        return this;
    }

    public R data(String key, Object value){
        this.data.put(key, value);
        return this;
    }
    public R data(Map<String, Object> map){
        this.setData(map);
        return this;
    }
}

此处运用了方法的重载技术

@Data
public class ResponseResult<T> {


    private Integer status;
    
    private String message;

    private T data;

    public ResponseResult(ResponseEnum responseEnum, T data ) {
        this.status = responseEnum.getCode();
        this.message = responseEnum.getMsg();
        this.data = data;
    }

    public ResponseResult( T data ) {
        this.status = ResponseEnum.SUCCESS.getCode();
        this.message = ResponseEnum.SUCCESS.getMsg();
        this.data = data;
    }

    public ResponseResult() {
        this.status = ResponseEnum.SUCCESS.getCode();
        this.message = ResponseEnum.SUCCESS.getMsg();
    }

    public ResponseResult( ResponseEnum responseEnum ) {
        this.status = responseEnum.getCode();
        this.message = responseEnum.getMsg();
    }


    public static ResponseResult<ResponseEnum> error (String msg ) {
        ResponseResult<ResponseEnum> responseResult = new ResponseResult<>();
        responseResult.setMessage(msg);
        responseResult.setStatus(500);
        return responseResult;
    }

    public static ResponseResult<ResponseEnum> error (Integer status, String msg ) {
        ResponseResult<ResponseEnum> responseResult = new ResponseResult<>();
        responseResult.setMessage(msg);
        responseResult.setStatus(status);
        return responseResult;
    }
    

    public static <E> ResponseResult<E> error (E data ) {
        return new ResponseResult<>(ResponseEnum.ERROR, data);
    }

    public static <E> ResponseResult<E> error (ResponseEnum responseEnum) {
        return new ResponseResult<>(responseEnum);
    }


    public static <E> ResponseResult<E> error (ResponseEnum responseEnum, E data ) {
        return new ResponseResult<>(responseEnum, data);
    }

    public static <E> ResponseResult<E> error () {
        ResponseResult result = new ResponseResult();
        result.setStatus(ResponseEnum.ERROR.getCode());
        result.setMessage(ResponseEnum.ERROR.getMsg());
        return new ResponseResult();
    }


    public static <E> ResponseResult<E> ok (ResponseEnum responseEnum, E data ) {
        return new ResponseResult<>(responseEnum, data);
    }


    public static <E> ResponseResult<E> ok (E data ) {
        return new ResponseResult<>(ResponseEnum.SUCCESS, data);
    }


    public static <E> ResponseResult<E> ok () {
        return new ResponseResult<>();
    }

  
    public static <E> ResponseResult<E> ok (ResponseEnum responseEnum) {
        return new ResponseResult<>(responseEnum);
    }



}

使用

列表

@ApiOperation(value = "所有讲师列表")
@GetMapping
public R list(){
    List<Teacher> list = teacherService.list(null);
    return R.ok().data("items", list);
}

删除

@ApiOperation(value = "根据ID删除讲师")
@DeleteMapping("{id}")
public R removeById(
    @ApiParam(name = "id", value = "讲师ID", required = true)
    @PathVariable String id){
    teacherService.removeById(id);
    return R.ok();
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 2019年黑马项目-畅购商城springcloud微服务实战是一门以实战为主的课程,旨在通过项目实践的方式,帮助学员深入理解和掌握SpringCloud微服务架构以及相关技术的应用。 课程的主要内容包括搭建基础的微服务架构、使用SpringCloud构建服务注册与发现、实现服务间的负载均衡、实现分布式配置中心、服务间的调用与容错处理、使用网关统一接入服务等。通过这些实战练习,学员不仅能够熟悉SpringCloud架构与组件,还能够了解微服务架构下的常见问题与解决方案。 畅购商城项目是一个典型的电商应用,通过实现该项目,学员可以接触到真实的业务场景与需求,并能够将所学知识应用到实际项目中。课程中通过模块化的方式逐步完善商城的功能,包括用户注册登录、商品浏览、购物车管理、订单生成与支付等。通过这些实践,学员除了掌握SpringCloud微服务的开发技术,还能够了解和掌握电商项目的开发流程和注意事项。 该课程的目标是让学员通过实战项目,全面了解和掌握SpringCloud微服务架构的设计与开发,在此基础上能够独立完成具有较高要求的微服务项目。通过参与实战项目的过程,学员还能够提升团队协作能力、解决问题的能力以及项目管理能力。 通过这门课程的学习,学员将会对SpringCloud微服务架构有更深入的理解,并能够将这些知识应用到实际项目中,提高自己在微服务开发领域的竞争力。 ### 回答2: 2019年黑马项目-畅购商城springcloud微服务实战是一个基于springcloud微服务架构的商城项目。该项目的目标是通过运用微服务的理念和技术,构建一个高可用、可扩展的商城系统。 在该项目中,使用了springcloud的多个组件,如Eureka注册中心、Feign负载均衡、Ribbon客户端负载均衡、Hystrix服务降级和容错、Zuul网关等。这些组件共同协作,实现了系统的弹性伸缩和高可用性。 畅购商城的功能包括商品展示、购物车、订单管理、支付、用户管理等。通过将这些功能拆分成独立的微服务,使得系统更加灵活和可维护。同时,使用分布式事务和消息队列来保障数据的一致性和可靠性。 在项目的开发过程中,采用了敏捷开发的方法,以迭代的方式进行开发和测试。通过使用Jenkins进行持续集成和部署,保证了代码的质量和系统的稳定性。 在项目的实战过程中,面临了许多挑战和困难,如微服务之间的通信、服务的负载均衡、服务的容错等。但通过团队的共同努力和不断的学习,最终成功地完成了该项目的开发和部署。 在该项目的实施过程中,不仅学到了springcloud微服务架构的相关知识和技术,还体会到了团队合作和解决问题的能力。该项目的成功实施,不仅为公司带来了商业价值,也提升了团队的技术水平和项目管理能力。 ### 回答3: 2019年黑马项目-畅购商城springcloud微服务实战是一个以Spring Cloud为基础的微服务项目。微服务架构是一种将应用拆分成多个小型服务的架构模式,这些服务可以独立开发、部署、扩展和管理。 畅购商城项目使用了Spring Cloud的一系列子项目,如Eureka、Ribbon、Feign、Hystrix、Zuul等,来实现各个微服务之间的通信、负载均衡、服务降级与熔断等功能。 在项目中,我们会通过Eureka来实现服务的注册与发现,每个微服务都会向Eureka注册自己的地址,其他微服务可以通过Eureka来发现并调用这些服务。而Ribbon则负责实现客户端的负载均衡,可以轮询、随机、加权等方式分发请求。 Feign是一种声明式的HTTP客户端,它简化了服务间的调用方式。我们只需编写接口,并通过注解来描述需要调用的服务和方法,Feign会自动实现远程调用。 Hystrix是一个容错机制的实现,可以通过断路器来实现服务的降级与熔断,当某个服务出现故障或超时时,Hystrix会快速响应并返回一个可控制的结果,从而保证系统的稳定性。 另外,Zuul作为微服务网关,可以实现请求的统一入口和路由转发,提高系统的安全性和性能。 通过这些Spring Cloud的组件,畅购商城项目可以实现高可用、容错、自动扩展等优质的微服务架构。 总之,2019年黑马项目-畅购商城springcloud微服务实战是一个基于Spring Cloud的微服务项目,通过使用Spring Cloud的各个子项目,可以实现微服务之间的通信、负载均衡、服务降级与熔断等功能,为项目的开发、部署和管理提供了便利。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值