一、@RestController

可以将控制器指定为 @RestController, 作为接口返回数据, 默认以json格式返回

  • @RequestMapping 配置请求路由, 所有请求方式均通过
  • @GetMapping 配置请求路由, 只有GET请求方式通过
  • @PostMapping 配置请求路由, 只有POST请求方式通过

同理,还有 @PutMapping@DeleteMapping@PatchMapping

一个简单的示例:

  1. @RestController
  2. @RequestMapping("/test")
  3. public class TestController {
  4. @RequestMapping("/hello")
  5. public String index() {
  6. return "Hello Spring Boot !";
  7. }
  8. }

浏览器输入 http://localhost:8080/test/hello 即可看到输出 Hello Spring Boot !

二、路由

@RequestMapping 可以指定一个路由地址,也可以指定多个路由地址,通过value参数指定。

指定一个路由地址:

  1. @GetMapping("/all")
  2. public List<User> findAll() {
  3. return userRepository.findAll();
  4. }
  5. // or
  6. @GetMapping(value = "/all")
  7. public List<User> findAll() {
  8. return userRepository.findAll();
  9. }

指定多个路由地址:

  1. @GetMapping(value = { "/all", "/list", "/all/**/*" })
  2. public List<User> findAll() {
  3. return userRepository.findAll();
  4. }

其中 “/all/*/“ 是一个模式匹配,比如 “/all”, “/all/1”, “/all/1/2”, “/all/1/2/3”

如果请求方式(GET/POST/PUT/DELETE)不正确,将会报 405: "Method Not Allowed" 的作物

三、返回值

设置编码方法

@RequestMapping 可以通过produces参数可以指定接口返回值的编码方式:

  1. @RequestMapping(value="/hello", produces="application/json; charset=utf-8")
  2. public String index() {
  3. return "Hello Spring Boot !";
  4. }

返回字符串

  1. @RequestMapping("/hello")
  2. public String index() {
  3. return "Hello Spring Boot !";
  4. }

返回 Integer 等基本数据类型也是相同的

返回 json

前面说了,指定返回值的类型可以指定 produces 参数,设置 produces="application/json; charset=utf-8" 即可返回json。

首先需要添加依赖:

  1. <dependency>
  2. <groupId>cn.hutool</groupId>
  3. <artifactId>hutool-log</artifactId>
  4. <version>4.1.17</version>
  5. </dependency>

使用JSONObject创建json数据

@RequestMapping(value = "/say/{name}", method = RequestMethod.GET, produces="application/json; charset=utf-8")
public String sayHello(@PathVariable String name) throws JSONException {
    JSONObject result = new JSONObject();
    result.put("data", "Hello " + name + "先生");
    return result.toString();
}

或者:

@RequestMapping(value = "/say/{name}", method = RequestMethod.GET, produces="application/json; charset=utf-8")
public JSONObject sayHello(@PathVariable String name) throws JSONException {
    JSONObject result = new JSONObject();
    result.put("data", "Hello " + name + "先生");
    return result;
}

返回结果为:

{
    "data": "Hello yu先生"
}

也可以添加 @ResponseBody 注解,将java对象转为json格式的数据:

@GetMapping("/test")
@ResponseBody
public Object test() {
    Map<String, String> map = new HashMap<>();
    map.put("星期一", "Monday");
    map.put("星期日", "Sunday");
    return map;
}

返回的结果为:

{
    "星期日": "Sunday",
    "星期一": "Monday"
}

返回实体类

首先需要添加依赖:

<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <version>1.18.6</version>
</dependency>

实体类 User

import lombok.*;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class User {
    String name;
    String age;
}

控制器:

@GetMapping(value = "/json")
public User json(){
    User user = new User("xiaoyu", "23");
    return user;
}

四、接收参数

接收实体类

直接使用实体类接收即可,传递的请求参数可以使用实体类中的实例属性字段

@PostMapping("/create")
public User create(User user) {
    return user;
}

具体的请求示例参考:
语雀内容

接收路由参数(@PathVariable)

通过 @PathVariable 配置路由参数,需要将路由参数写到 @RequestMapping 中,比如 {id}

@GetMapping("/{id}")
public User findOne1(@PathVariable Long id) {
    return userRepository.findById(id).get();
}

请求示例:

http://localhost:8080/1

接收请求参数(@RequestParam)

通过 @RequestParam 指定接收的请求参数

@GetMapping("/findOne")
public User findOne(@RequestParam("id") Long id) {
    return userRepository.findById(id).orElse(null);
}

请求示例:

http://localhost:8080/findOne?id=1

设置参数的名字及是否必填:

  • 传递的参数名字可以指定为跟接收的参数不同的名字,使用 value 设置
  • 通过设置 required = false 指定某个参数是选填

    @GetMapping("/find")
    public Result find(@RequestParam(value = "name", required = false) String username) {
      Admin admin = adminService.getAdminByUsername(username);
      if (admin == null) {
          return Result.error("error");
      }
    
      return Result.ok(admin);
    }
    

接收请求体参数(@RequestBody)

通过 @RequestBody 注解可以获取到请求体参数

@PostMapping("/find")
public Result find(@RequestBody User user) {
    Admin admin = adminService.getAdminByUsername(user.getUsername());
    if (admin == null) {
        return Result.error("error");
    }

    return Result.ok(admin);
}

使用请求体参数时,需要在请求头中设置,以json的格式传递参数:

Content-Type: application/json

否则,将报 415: "Unsupported Media Type" 的错误。

五、封装响应类

通常我们会封装一个响应类, 方便之后的使用

config/Result.java

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Result {
  private Object data;
  private Integer status;
  private String msg;

  public static Result ok(Object data){
      return new Result(data, 1, "数据请求成功");
  }

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

控制器中使用:

@RequestMapping("test")
public Result test(){
    return Result.ok("ok");
}

返回的数据格式:

{
  "data": "ok",
  "status": 1,
  "msg": "数据请求成功"
}