目录
@Controller
至于@RestController
请求-相应模式:
1.设置请求映射规则@RequestMapping
POST 请求:
GET 请求
2.获取请求参数
2.1获取路径参数 (@PathVariable)
2.2 获取请求体中的Json格式参数 (@RequestBody)
2.3获取QueryString格式参数(@RequestParam)
3. 响应体响应数据 (@ResponseBody)
如果是Controller类,就使用这个注解。
@RestController的作用等同于@Controller + @ResponseBody
将类中所有方法的返回类型都改为json
两者的差别,看下面@ResponseBody的作用便可以知道。
前端作为客户端向后端发送请求(请求可以分为请求头和请求体两部分,请求头包含了一些元数据信息,如请求方式、请求路径、请求参数等;而请求体则包含了请求的具体内容,比如表单数据、JSON数据等)。后端接收到请求后可以使用相关的注解去提取数据,并根据业务逻辑进行处理。
处理完成后,后端会将处理结果封装在响应体(ResponseBody)中,并将其返回给前端作为响应(Response)。
这种模式下,前端和后端之间通过请求和响应进行数据交互,实现了前后端的解耦。前端负责展示数据和发送请求,后端负责处理请求并生成响应数据,通过网络进行通信。这种模式可以灵活地适应各种场景和需求,使前后端开发更加高效和可维护。
而 @RequestMapping注解与请求-响应模式的关系在于它定义了请求的URL路径和请求方法,从而将前端的请求与后端的处理方法建立起映射关系。通过使用@RequestMapping注解,后端可以接收前端的请求并处理,可以将处理结果封装在Java对象中,然后通过@ResponseBody注解将其转换为前端需要的格式,并返回给前端作为响应。实现了请求-响应模式的具体逻辑。
该注解可以加到方法上或者是类上。
在这个注解内填上请求路径,请求方式。当符合了要求,请求就会被加了这个注解的方法或类调用。
指定请求路径和指定请求方式:
path或者value属性都可以用来指定请求路径。
method属性可以用来指定可处理的请求方式。
例如:
请求的资源路径为/test/test1的请求能够被test1的post方法处理:
@RestController
@RequestMapping("/test")
public class TestController {
@RequestMapping(value = "/test1",method = RequestMethod.POST)
public String test1(){
return "test1";
}
}
不过一般写在接口类的上面,然后下面的每一个方法添加其他注解即可不用写请求方式和更加规范。如下:
@PostMapping 等价于 @RequestMapping(method = RequestMethod.POST)
@GetMapping 等价于 @RequestMapping(method = RequestMethod.GET)
@PutMapping 等价于 @RequestMapping(method = RequestMethod.PUT)
@DeleteMapping 等价于 @RequestMapping(method = RequestMethod.DELETE)
一般写都是这样:
@RestController
@RequestMapping("/test")
public class TestController {
@PostMapping("/test1")
public String test1(){
return "test1";
}
}
常见的 HTTP 请求方式有四种:
POST
(添加)
GET
(查询)
DELETE
(删除)
PUT
(修改)
POST
请求用于向指定资源提交数据,通常会导致服务器端的状态发生变化。
主要用于向服务器上传一些数据和文件。 常见就是添加用户信息,登录功能。
使用 POST
请求方式提交的数据会被包含在请求体中,而不像 GET
请求方式那样包含在 URL 中。
POST 请求可以提交比 GET
更大的数据量,并且相对更安全。
@PostMapping("/login")
public ResponseResult login(@RequestBody User user) {
System.out.println(user.getUsername());
return loginService.login(user);
}
@PostMapping 注解用于在后端接收前端发送的数据。
通过使用 @PostMapping 注解,可以将前端发送的数据绑定到相应的方法参数中,登录用户数据会被绑定到 User
对象的实例 user
中,从而可以在方法中进行相关的业务逻辑处理
GET
请求用于向指定资源发出请求,请求中包含了资源的 URL 和请求参数。服务器端通过解析请求参数来返回相应的资源,不会修改服务器端的状态。
使用 GET
请求方式提交的数据会被包含在 URL 中,因此易于被缓存和浏览器保存,但也因此不适合用于提交敏感数据。
通过 @GetMapping
注解标记的方法通常被用于响应传入的 URL 请求,并返回相应的资源或数据给前端。
@GetMapping("/user")
public User getUser(@RequestParam("id") int id) {
// 根据 id 查询并返回用户信息
return userService.getUser(id);
}
前端可以发送一个 GET 请求到 /user?id=123
来获取 id 为 123 的用户信息。注解中的 @RequestParam("id")
表示获取 URL 查询参数中名为 "id" 的值,并将其赋值给方法参数 id
。
想获得请求路径的参数,比如/user/123里面的123,可以使用@PathVariable注解。
比如通过一些路径变量,当它们在实际请求中替换成具体的值的时候,使用@PathVariable绑定到方法参数上,进行业务处理。
@GetMapping("/user/{id}/{name}")
public String getUser(@PathVariable("id") int id, @PathVariable("name") String name) {
// 处理用户信息,id 和 name 对应了请求路径中的 {id} 和 {name}
return "User ID: " + id + ", Name: " + name;
}
例如,如果请求的 URL 为 /user/123/john
,那么 {id}
将被替换为 123
,{name}
将被替换为 john
。最终的路径将形如 /user/123/john
。
@PathVariable("id") int id
表示将路径变量 {id}
的值绑定到方法参数 id
上,同理。
当前端将一些比较复杂的参数转换成Json字符串通过请求体传递过来给后端,这种时候就可以使用@RequestBody注解获取请求体中的数据。
而json字符串是包含在请求体中的,使用请求体传参通常都是使用POST请求。
SpringBoot的web启动器已经默认导入了jackson的依赖,不需要再额外导入依赖了。
实体类:
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private String name;
private Integer age;
private String gender;
}
请求体数据
{"name":"z","age":"3","gender":"男"}
1.获取前端传的参数封装成实体对象
如下把Json数据获取出来封装User对象
@RestController
public class TestController1 {
@PostMapping("/test")
public String testUser(@RequestBody User user){
System.out.println(user);
return user.toString();
}
}
打印了获取到的 User
对象,它会输出类似于 User(name=z, age=3, gender=男)
2.获取参数封装成Map集合
也可以把该数据获取出来封装成Map集合:
@PostMapping("/user")
public String TestController2(@RequestBody Map map){
System.out.println(map);
return "Test2";
}
如果请求体传递过来的数据是一个User集合转换成的json,Json数据可以这样定义:
[{"name":"z","age":4},{"name":"zz","age":5},{"name":"zzz","age":6}]
方法定义:
@PostMapping("/users")
public String TestController3(@RequestBody List users){
System.out.println(users);
return "test3";
}
假如是复杂对象,按照上面json定义方式结合在一起写即可:
{
"id":1,
"Users":
[{"name":"z","age":4},{"name":"zz","age":5},{"name":"zzz","age":6}],
"score":["100","0","99"]
}
如果需要使用@RequestBody来获取请求体中Json并且进行转换,要求请求头 Content-Type 的值要为: application/json 。也就是前端以Content-Type 为application/json,传递json字符串数据,后端以@RequestBody 模型接收数据。
QueryString(查询字符串)是指URL中?
符号后面的参数部分。它通常用于在HTTP请求中传递参数给服务器。
比如:http://localhost:8080/test?q=apple&category=fruit
其中,?
之后的部分就是查询字符串,包括q=apple
和category=fruits
两个参数。
我们可以使用@RequestParam来获取QueryString格式的参数。
1.参数单独的获取
@RequestParam把QueryString格式参数的参数绑定在方法的参数上,则想获取的参数单独的获取即把参数放在方法上即可。
在方法中定义方法参数,方法参数名要和请求参数名一致,这种情况下可以省略@RequestParam注解。
@GetMapping("/test")
public String testRquestParam(Integer id, String name, String[] likes){
System.out.println(id);
System.out.println(name);
System.out.println(Arrays.toString(likes));
return "success";
}
如果方法参数名和请求参数名不一致,我们可以加上@RequestParam注解例如:
@GetMapping("/test")
public String testRquestParam(@RequestParam("id") Integer uid,@RequestParam("name") String name, @RequestParam("likes")String[] likes){
System.out.println(uid);
System.out.println(name);
System.out.println(Arrays.toString(likes));
return "success";
}
2.获取参数封装成实体对象
如果我们想把这些参数封装到一个User对象中可以使用如下写法:
@GetMapping("/test")
public String testRquestParam(User user){
System.out.println(user);
return "success";
}
User类定义如下:
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private Integer id;
private String name;
private String[] likes;
}
测试时请求url如下:
http://localhost:8080/test?id=1&name=z&likes=编程&likes=听歌
注意:实体类中的成员变量要和请求参数名对应上。并且要提供对应的set/get方法。
2.3.1 相关注解其他属性
2.3.1.1 required
代表是否必须,默认值为true也就是必须要有对应的参数。如果没有就会报错。
如果对应的参数可传可不传则可以把其设置为fasle
例如:
@GetMapping("/test")
public String test(@RequestParam(value = "id",required = false) Integer uid,@RequestParam("name") String name, @RequestParam("likes")String[] likes){
System.out.println(uid);
System.out.println(name);
System.out.println(Arrays.toString(likes));
return "success";
}
4.3.4.2 defaultValue
假如没有传对应的参数,可以用defaultValue属性设置默认值。
例如:
@GetMapping("/test")
public String test(@RequestParam(value = "id",required = false,defaultValue = "666") Integer uid,@RequestParam("name") String name, @RequestParam("likes")String[] likes){
System.out.println(uid);
System.out.println(name);
System.out.println(Arrays.toString(likes));
return "success";
}
@RequestBody与@RequestParam()可以同时使用。
一个请求,只有一个@RequestBody,但是可以有多个@RequestParam。
可以使用@RequestBody获取请求体中的json数据,然后使用@RequestParam获取url中的参数
@PostMapping("/test")
public String example(@RequestParam("id") Long id, @RequestBody User user) {
// 处理逻辑
return id + user.toString();
}
用@RequestParam接收的参数:
url: localhost:8080/example?id=123
用@RequestBody接收前端传的的json参数
Content-Type: application/json
{
"name": "z",
"age": 3
}
注意:参数加了@RequestParam()的话,那么前端必须传对应参数值(不过可以设置required属性来调节是否必须传),否者会报错;如果参数前没有加@RequestParam()注解,那么前端可以传,也可以不传。
RestFul风格或者是web阶段接触过的异步请求,都需要把数据转换成Json放入响应体中。
@ResponseBody的作用其实是将java对象转为json格式的相应内容
使用 @RequestMapping注解时,Spring会将返回值解析为视图路径,然后跳转路径返回对应的视图页面(Web应用中用来展示数据给用户的界面,通常是一个HTML文件)。不过当添加 @ResponseBody 注解后,Spring会认为这个方法返回的是响应体数据,然后将数据输出到HTTP响应体中。
@ResponseBody可以加在类上和方法上,加在类上可以写成@RestController,其的作用等同于@Controller + @ResponseBody;使得该类中的所有方法的返回类型都转为json。
3.1具体使用:
只要把要转换的数据直接作为方法的返回值返回即可。SpringMVC会帮我们把返回值转换成json。
如下面的案例,通过请求路径去获取参数id,去查询对应id的用户信息,并且将其转换成json响应到响应体中。
@Controller
@RequestMapping("/test")
public class testController {
@GetMapping("/user/{id}")
@ResponseBody
public User findById(@PathVariable("id") Long id){
User user = userService.getUserById(id);
return user;
}
}
很多时候都会创建一个公共返回对象,包含状态码,消息,数据。在后端处理请求并返回相应时,将结果封装到公共返回对象中,然后通过@ResponseBody注解将其转换为JSON格式并返回给前端。