请求响应-07.响应-@ResponseBody&统一响应结果

一.@ResponseBody注解

我们通过@ResponseBody注解来将方法的返回值直接响应,如果返回值类型是实体对象/集合,将会转换为JSON格式响应。

那为何在方法/类上没有加@ResponseBody呢?那是因为当类/方法上加了@RestController注解时,就相当于加了@ResponseBody 

package com.gjw.controller;

import com.gjw.pojo.Address;
import com.gjw.pojo.Result;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

/**
 * 测试响应数据
 */
@RestController
public class ResponseController {
    // 我们在Controller当中定义的每一个对外暴露的方法,我们称之为一个功能接口
    @RequestMapping("/hello")
    public String hello() {
        System.out.println("hello world!");
        return "hello world";
    }

    @RequestMapping("/getAddr")
    public Address getAddr(){
        Address address = new Address();
        address.setProvince("江苏");
        address.setCity("南京");
        return address;
    }

    @RequestMapping("/listAddr")
    public List<Address> listAddr(){
        List<Address> list = new ArrayList<>();
        Address addr1 = new Address("河南", "郑州");
        Address addr2 = new Address("陕西", "西安");
        list.add(addr1);
        list.add(addr2);
        return list;
    }
}

@RestController注解会将方法中return的值作为响应数据直接相应给浏览器。

hello路径会直接返回一个"hello world"字符串浏览器。

 

getAddr路径会直接返回一个Address类型的对象,会转换为JSON格式响应。

 

listAddr路径会返回一个List对象,也会转换为JSON格式响应。

二. 统一响应结果

这样的响应显得太杂乱无章了,有时以字符串响应,有时以JSON格式的数据响应。因此如果我们能够规定一个数据的统一响应格式,将大大的提高数据的可读性,也便于前端人员的开发和维护。

因此我们定义一个Result类代表响应的结果类,该类中有三个属性,其中包括:
* code:状态码(0:失败,1:成功)
* msg:响应状态(success:成功,error:失败)
* data:响应数据

package com.gjw.pojo;

/**
 * 目标:定义一个返回结果类,用来定义所有类型的响应对象,其中包括:
 * code:响应码
 * msg:响应状态
 * data:响应数据
 */
public class Result {
    private Integer code;
    private String msg;
    private Object data;        // 响应数据无法确定数据类型,就使用Object类型

    public Result() {
    }

    public Result(Integer code, String msg, Object data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    // 定义静态方法用来更好的返回数据(两个success,但是参数的个数/类型不同,属于方法的重载)
    public static Result success(Object data){
        return new Result(1,"success",data);
    }

    //
    public static Result success(){
        return new Result(1,"success",null);
    }

    public static Result error(){
        return new Result(0,"error",null);
    }




    @Override
    public String toString() {
        return "Result{" +
                "code=" + code +
                ", msg='" + msg + '\'' +
                ", data=" + data +
                '}';
    }
}

定义好后,我们每次响应一个Result对象即可,该对象当中包含了此次相应的状态码,响应状态以及响应数据。为了能够方便响应,我们可以定义重载的静态方法来直接调用静态方法返回生成的Result对象,并且根据是否需要返回参数来选择不同的静态方法。

以下是通过改造的统一响应结果:

package com.gjw.controller;

import com.gjw.pojo.Address;
import com.gjw.pojo.Result;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

/**
 * 测试响应数据
 */
@RestController
public class ResponseController {
    // 我们在Controller当中定义的每一个对外暴露的方法,我们称之为一个功能接口
    @RequestMapping("/hello")
    public Result hello() {
        System.out.println("hello world!");
//        return new Result(1,"success","hello world!");
        return Result.success("hello world!");
    }

    @RequestMapping("/getAddr")
    public Result getAddr(){
        Address address = new Address();
        address.setProvince("江苏");
        address.setCity("南京");
        return Result.success(address);
    }

    @RequestMapping("/listAddr")
    public Result listAddr(){
        List<Address> list = new ArrayList<>();
        Address addr1 = new Address("河南", "郑州");
        Address addr2 = new Address("陕西", "西安");
        list.add(addr1);
        list.add(addr2);
        return Result.success(list);

    }
}

我们通过postman发起请求,可以看到现在响应的数据为JSON格式的Result对象。

 注:如果无响应数据,则关闭postman再启动。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值