@RequestMapping注解

在Spring MVC 中使用 @RequestMapping 来映射请求,也就是通过它来指定控制器可以处理哪些URL请求,它可以用于将任意HTTP 请求映射到控制器方法上。

源码:

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
	String name() default "";//映射的名称。
	String[] value() default {};//该注释表达的主要映射
	String[] path() default {};
	RequestMethod[] method() default {};//要映射的 HTTP 请求方法(例如method ={RequestMethod.GET,RequestMethod.POST}).
	String[] params() default {};//该属性表示请求参数,也就是追加在URL上的键值对,多个请求参数以&隔开
	String[] headers() default {};//映射请求的标头。
	String[] consumes() default {};//该属性表示请求参数,也就是追加在URL上的键值对,多个请求参数以&隔开
	String[] produces() default {};//映射请求的可产生媒体类型。
}
  • 在@Target中有两个属性,分别为 ElementType.METHOD 和 ElementType.TYPE ,也就是说 @RequestMapping 可以在方法和类的声明中使用
  • 可以看到注解中的属性除了 name() 返回的字符串,其它的方法均返回数组,也就是可以定义多个属性值,例如 value() 和 path() 都可以同时定义多个字符串值来接收多个URL请求

可以在@RequestMapping注释的类的方法中,使用 @GetMapping、@PostMapping、@PutMapping、@DeleteMapping 等更具体的注解,它们是 与特定 HTTP 方法的快捷方式。

URI模式为获取@RequestMapping中指定的URL的眸一个特定部分提供很大的方便。

URI模式是一个类似于URI的字符串,只不过其中包含了一个或多个的变量名。当使用实际的值去填充这些变量名的时候,模式就成为一个URI。比如说,一个这个URI模式http://www.example.com/users/{userId}就包含了一个变量名userId。将值fred赋给这个变量名后,它就变成了一个URI:http://www.example.com/users/fred。

  1. @GetMapping 方法注解
    该注解用于处理 HTTP GET 请求。可以将其翻译为@RequestMapping(method = RequestMethod.GET). 它接受以下参数:
  • value:一个字符串,指定此方法应处理的 URL 路径。

  • produces:一个字符串或字符串数​​组,指定此方法生成的响应的媒体类型。

  • params:一个字符串数组,指定调用此方法必须存在的请求参数。

  • headers:一个字符串数组,指定调用此方法必须存在的标头。

代码:

@RestController
@RequestMapping("/example")
public class MyController {

	@GetMapping("/path")
	public String exampleMethod() {
		return "Hello, this is an example!";
	}
}

在上例中,@GetMapping(“/path”) 等同于@RequestMapping(value=“/path”,method=RequestMethod.GET)。

  1. @PostMapping 方法注解
    该注解用于处理 HTTP POST 请求。可以将其翻译为@RequestMapping(method = RequestMethod.POST). 它接受以下参数:
  • value:一个字符串,指定此方法应处理的 URL 路径。

  • consumes:一个字符串或字符串数​​组,指定此方法使用的请求正文的媒体类型。

  • produces:一个字符串或字符串数​​组,指定此方法生成的响应的媒体类型。

  • params:一个字符串数组,指定调用此方法必须存在的请求参数。

  • headers:一个字符串数组,指定调用此方法必须存在的标头。

@PostMapping 注解是 @RequestMapping 注解的一种特殊形式,专门用于处理 HTTP POST 请求。它通常与 @RestController 结合使用,用于定义处理传入 POST 请求的方法。

@RestController
public class MyController {

	@PostMapping("/create")
	public String createResource(@RequestBody String requestBody){
	// 处理传入的 POST 请求正文并执行某些操作 
		return "Resource created successfully";
	}
}

@RestController:表示该类是控制器,方法的返回值应直接写入响应体。
@PostMapping(“/create”):指定 createResource 方法应处理路径为"/create "的 HTTP POST 请求。
@RequestBody:表示方法参数应绑定到 HTTP 请求正文。在这种情况下,requestBody 参数将填充 POST 请求正文的内容。
您也可以使用 @RequestBody 将更复杂的对象作为方法参数,Spring 会尝试将请求正文反序列化为指定的对象类型。

@RestController
public class MyController {
	@PostMapping("/create")
	public ResponseEntity createResource(@RequestBody CreateRequest createRequest) { 
	// Process the incoming CreateRequest and perform some action 		
		return ResponseEntity.ok("Resource created successfully");
	}
}

在上例中,CreateRequest 是一个 Java 类,代表了预期请求正文的结构。Spring 会自动将传入的 JSON 或表单数据反序列化为 CreateRequest 的实例。

下面是Post输入一个对象,输出也是一个对象的代码:

	@PostMapping("/users")
	public ResponseEntity createUser(@RequestBody User user) {
		User savedUser = userService.createUser(user);
		return ResponseEntity.created(URI.create("/users/" 
			+ savedUser.getId())).body(savedUser);
}

上例中,使用 @PostMapping 处理创建新用户的 HTTP POST 请求。value 参数指定了 URL 路径(默认),而 @RequestBody 注解则用于从请求正文中提取用户对象。ResponseEntity 用于在响应头中返回 201 Created 状态代码和新创建用户的位置。

  1. @PutMapping 方法注解
    该注解用于处理 HTTP PUT 请求。可以将其翻译为@RequestMapping(method = RequestMethod.PUT). 并且它接受与 相同的参数@PostMapping。
	@PutMapping("/users/{userId}")
	public User updateUser(@PathVariable Long userId, 
			@RequestBody User updatedUser) {
		return userService.updateUser(userId, updatedUser);
}

此示例演示如何使用@PutMapping处理更新用户的 HTTP PUT 请求。参数value指定URL路径,@PathVariable注释用于从URL路径中提取用户ID。该@RequestBody注释用于从请求正文中提取更新的用户对象。

  1. @DeleteMapping 方法注解
    该注释用于处理 HTTP DELETE 请求。可以将其翻译为@RequestMapping(method = RequestMethod.DELETE). 并且它接受与 相同的参数@GetMapping。
	@DeleteMapping("/users/{userId}")
	public void deleteUser(@PathVariable Long userId) {
		userService.deleteUser(userId);
}

上面示例显示如何使用@DeleteMapping处理删除用户的 HTTP DELETE 请求。参数value指定URL路径,@PathVariable注释用于从URL路径中提取用户ID。

produces和consumes

produces和consumes参数来指定请求和响应正文的格式,如果您想要返回XML格式的数据(具体取决于请求的内容类型),这非常有用。

  • produces参数指定该方法可以产生的媒体类型,即响应主体的格式。

  • consumes参数指定该方法可以消费的媒体类型,即请求体的格式。

@PostMapping("/users", consumes = "application/json", produces = "application/json")
public ResponseEntity createUser(@RequestBody User user) {
	User savedUser = userService.createUser(user);
	return ResponseEntity.created(URI.create("/users/" + savedUser.getId())).body(savedUser);
}

@PostMapping 注解指定该方法应处理对 /users 端点的 HTTP POST 请求。consumes 参数指定该方法只能接收 JSON 格式的请求,produces 参数指定响应也应为 JSON 格式。

您还可以使用字符串数组指定多种媒体类型,如下所示:

@GetMapping("/users/{id}", produces = { "application/json", "application/xml" })
public ResponseEntity getUser(@PathVariable Long id) {
	User user = userService.getUser(id);
	return ResponseEntity.ok().body(user);
}

在上例中,@GetMapping 注解指定该方法应处理对 /users/{id} 端点的 HTTP GET 请求。produces 参数指定该方法可以生成 JSON 和 XML 格式的响应,Spring Boot 将根据请求的内容类型自动选择合适的格式。

方法内参数注解

1、@RequestBody注解读取请求体
Spring Boot 提供@RequestBody注释将 HTTP POST、PUT 或 PATCH 请求的请求正文绑定到控制器中的方法参数。当您需要从请求正文中提取数据时(例如创建或更新资源时),此注释非常有用。

@RequestBody:将请求正文内容(例如,JSON)映射到对象。

@PostMapping("/users")
public User createUser(@RequestBody User user) { // ...
}

默认情况下,Spring Boot 使用 Jackson 将请求正文反序列化为 Java 对象。您可以使用Jackson注释(例如@JsonFormat和 )自定义反序列化过程@JsonProperty。

如果请求正文无效或不存在,Spring Boot400 Bad Request默认返回响应。您可以使用异常处理来自定义响应。

除了 JSON 之外,Spring Boot 还支持其他媒体类型,例如 XML 和表单数据。您可以使用请求映射注释的consumes属性指定媒体类型:

@PostMapping(value = "/users", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
public ResponseEntity createUser(@RequestBody MultiValueMap<String, String> formData) {
 // ...
}

2、@PathVariable 注释从请求 URI 中提取值
要使用@PathVariable注释,只需将其添加在方法定义中的参数之前即可。参数名称应与 URI 模板变量名称匹配。这是一个例子:

@GetMapping("/users/{id}")
public ResponseEntity getUserById(@PathVariable Long id) {
	User user = userService.getUserById(id);
	return ResponseEntity.ok(user);
}

在上例中,@PathVariable Long id 将 id 参数绑定到 URI 模板 /users/{id} 中的 id 变量。因此,如果向 /users/1 发送 GET 请求,将提取值 1 并传递给 getUserById() 方法。

也可以在 @PathVariable 注解中指定 URI 模板变量名,以防与参数名不匹配。下面是一个例子:

@GetMapping("/users/{userId}/posts/{postId}")
public ResponseEntity getPostByUserIdAndPostId(@PathVariable("userId") Long userId, @PathVariable("postId") Long postId) {
	Post post = postService.getPostByUserIdAndPostId(userId, postId);
	return ResponseEntity.ok(post);
}

在上例中,@PathVariable(“userId”) Long userId 将 userId 参数绑定到 URI 模板 /users/{userId}/posts/{postId} 中的 userId 变量,而 @PathVariable(“postId”) Long postId 则将 postId 参数绑定到同一 URI 模板中的 postId 变量。

3、@RequestParam:从HTTP请求中提取查询参数或表单数据。

@GetMapping("/search")
public String search(@RequestParam String query, @RequestParam int page) { 
// ...
}

4、@RequestHeader:访问 HTTP 请求标头。

@GetMapping("/users")
public List getUsers(@RequestHeader("Accept-Language") String language) { 
// ...
}

你可能感兴趣的:(Spring学习,java,spring)