一、@RestController
可以将控制器指定为 @RestController
, 作为接口返回数据, 默认以json格式返回
@RequestMapping
配置请求路由, 所有请求方式均通过@GetMapping
配置请求路由, 只有GET请求方式通过@PostMapping
配置请求路由, 只有POST请求方式通过
同理,还有 @PutMapping
、@DeleteMapping
、@PatchMapping
等
一个简单的示例:
@RestController
@RequestMapping("/test")
public class TestController {
@RequestMapping("/hello")
public String index() {
return "Hello Spring Boot !";
}
}
浏览器输入 http://localhost:8080/test/hello
即可看到输出 Hello Spring Boot !
二、路由
@RequestMapping
可以指定一个路由地址,也可以指定多个路由地址,通过value
参数指定。
指定一个路由地址:
@GetMapping("/all")
public List<User> findAll() {
return userRepository.findAll();
}
// or
@GetMapping(value = "/all")
public List<User> findAll() {
return userRepository.findAll();
}
指定多个路由地址:
@GetMapping(value = { "/all", "/list", "/all/**/*" })
public List<User> findAll() {
return userRepository.findAll();
}
其中 “/all/*/“ 是一个模式匹配,比如 “/all”, “/all/1”, “/all/1/2”, “/all/1/2/3”
如果请求方式(GET/POST/PUT/DELETE)不正确,将会报 405: "Method Not Allowed"
的作物
三、返回值
设置编码方法
@RequestMapping
可以通过produces
参数可以指定接口返回值的编码方式:
@RequestMapping(value="/hello", produces="application/json; charset=utf-8")
public String index() {
return "Hello Spring Boot !";
}
返回字符串
@RequestMapping("/hello")
public String index() {
return "Hello Spring Boot !";
}
返回 Integer 等基本数据类型也是相同的
返回 json
前面说了,指定返回值的类型可以指定 produces
参数,设置 produces="application/json; charset=utf-8"
即可返回json。
首先需要添加依赖:
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-log</artifactId>
<version>4.1.17</version>
</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": "数据请求成功"
}