请求响应-响应-@ResponseBody&统一响应结果
响应:
- 设置响应数据,那么其实呢,在我们前面所有的controller方法当中,都已经设置了响应数据,比如我们在入门程序中:浏览器地址发起了一个请求之后,会请求到controller中的一个方法,而在这个controller方法中我最终给浏览器响应了这么一个字符串hello world。再比如我们所有的方法最终都给客户端浏览器响应了一个ok。
@ResponseBody
- 那么其实我们在controller方法中编写代码的时候,是直接return了返回了一个字符串,这个返回值就会作为响应数据直接响应给客户端浏览器,这些能都比较依赖一个核心注解@ResponseBody
- 但是我们会发现@ResponseBody我们好像从来没有见过,其实呢我们在controller类上所加的一个注解叫@RestController,这个注解就包含了这个@ResponseBody。
- 我们准备了一个ResponseController程序:
定义了三个方法,它们的返回值分别是字符串,对象,集合。启动会这个程序
package com.csdn.controller;
import com.csdn.pojo.Address;
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 {
@RequestMapping("/hello")
public String hello() {
System.out.println("hello");
return "hello";
}
@RequestMapping("/getAddr")
public Address getAddr() {
Address addr = new Address();
addr.setCity("beijing");
addr.setProvince("beijing");
return addr;
}
@RequestMapping("/listAddr")
public List<Address> listAddr() {
List<Address> list = new ArrayList<>();
Address addr = new Address();
addr.setProvince("sahnghai");
addr.setCity("shanghia");
Address addr2 = new Address();
addr2.setCity("beijing");
addr2.setProvince("beijing");
list.add(addr);
list.add(addr2);
return list;
}
}
打开postman发起请求:
- 刚才所开发的三个功能接口,它们的返回值分别是字符串,对象,集合。经过@ResponseBody的处理之后呢,最终响应给前端的就是简单滴字符串,一个json格式的数据,以及一个json格式的数组。我们会发现每一个接口响应回去的数据很随意,没有规范可言。如果我们开发的是一个大型项目,所涉及到的功能接口可能是成百上千,甚至于成千上万,如果没有一套统一的项目规范,前端人员发起请求访问到我们所开发的接口,那最终我们响应的数据各式各样都有,那最后前端人员呢就需要拿到结果进行解析,一会这样解析一会那样解析,那这样前后端开发的成本就会增加。那最终我们会发现:不便管理,难以维护。
- 我们会给所有的功能接口设置统一的响应结果:
- 统一响应结果的封装类:
package com.csdn.pojo;
/**
* 统一响应结果封装类
*/
public class Result {
private Integer code ;//1 成功 , 0 失败
private String msg; //提示信息
private Object data; //数据 data
public Result() {
}
public Result(Integer code, String msg, Object data) {
this.code = code;
this.msg = msg;
this.data = data;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
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(String msg){
return new Result(0, msg, null);
}
@Override
public String toString() {
return "Result{" +
"code=" + code +
", msg='" + msg + '\'' +
", data=" + data +
'}';
}
}
- 对刚才的Controller程序程序进行改造:
package com.csdn.controller;
import com.csdn.pojo.Address;
import com.csdn.pojo.Result;
import org.springframework.util.concurrent.SuccessCallback;
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 {
/*
@RequestMapping("/hello")
public String hello() {
System.out.println("hello");
return "hello";
}
@RequestMapping("/getAddr")
public Address getAddr() {
Address addr = new Address();
addr.setCity("beijing");
addr.setProvince("beijing");
return addr;
}
@RequestMapping("/listAddr")
public List<Address> listAddr() {
List<Address> list = new ArrayList<>();
Address addr = new Address();
addr.setProvince("sahnghai");
addr.setCity("shanghia");
Address addr2 = new Address();
addr2.setCity("beijing");
addr2.setProvince("beijing");
list.add(addr);
list.add(addr2);
return list;
}
*/
@RequestMapping("/hello")
public Result hello() {
System.out.println("hello");
//return new Result(1, success,"hello world");
return Result.success("hello");
}
@RequestMapping("/getAddr")
public Result getAddr() {
Address addr = new Address();
addr.setCity("beijing");
addr.setProvince("beijing");
return Result.success("addr");
}
@RequestMapping("/listAddr")
public Result listAddr() {
List<Address> list = new ArrayList<>();
Address addr = new Address();
addr.setProvince("sahnghai");
addr.setCity("shanghia");
Address addr2 = new Address();
addr2.setCity("beijing");
addr2.setProvince("beijing");
list.add(addr);
list.add(addr2);
return Result.success(list);
}
}
打开postman发起请求: