HTTP请求映射注解
一、请求映射
@RequestMapping
是 Spring MVC 中的一个注解,用于映射HTTP请求到控制器方法。它可以映射多个HTTP方法,或者在没有更具体的注解(如 @GetMapping
, @PostMapping
, 等)时使用。下面是一个示例:
javaimport org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MyController {
/**
* 这个方法将处理所有匹配 "/example" 的 HTTP GET 和 POST 请求
*/
@RequestMapping(value = "/example", method = {RequestMethod.GET, RequestMethod.POST})
public String handleExampleRequest() {
// 处理逻辑
return "This is an example response";
}
/**
* 如果没有更具体的注解,此方法将处理所有匹配 "/other" 的请求
*/
@RequestMapping("/other")
public String handleOtherRequest() {
// 处理逻辑
return "Handling other requests";
}
}
在上面的例子中,handleExampleRequest
方法会处理 /example
路径上的 GET 和 POST 请求。
handleOtherRequest
方法将处理所有匹配 /other
的请求,无论请求方法是什么(GET、POST、PUT等),因为没有指定 method
参数,所以默认匹配所有HTTP方法。
请注意,这里使用了 @RestController
注解,它是 @Controller
和 @ResponseBody
的组合,用于创建RESTful服务,自动将返回值转化为HTTP响应体。
REST风格简介
REST(Representational State Transfer)是一种设计分布式系统的原则,尤其适用于Web服务。
外文名:Representational State Transfer,简称REST。
中文名:表现层状态转移。
属性:一种软件架构风格。(以Web为平台的。web服务的架构风格,前后端接口时候用到。)
REST之所以晦涩难懂,是因为前面主语(Resource )被去掉了。
全称是: Resource Representational State Transfer。
通俗来讲就是:资源在网络中以某种表现形式进行状态转移。
分解开来讲解:
Resource:资源,即数据(这是网络的核心);
Representational:某种表现形式,比如用JSON,XML,JPEG等;
State Transfer:状态变化。通过HTTP的动词(get查询、post新增、put修改、delete删除)实现。
1.@GetMapping
@GetMapping("/example")
public String handleGetRequest() {
// 处理逻辑
return "This is a GET request response";
}
- 用途:该注解用于处理HTTP GET请求,常用于查询操作,如获取资源信息。由于GET请求的参数通过URL传递,它适用于不需要修改服务器状态的情景。
- 优势:易于缓存,支持浏览器的书签功能,且请求参数直接可见于URL,便于分享和调试。
2.@PostMapping
@PostMapping("/example")
public ResponseEntity<String> handlePostRequest(@RequestBody MyObject requestObject) {
// 处理逻辑
HttpHeaders headers = new HttpHeaders();
headers.add("Custom-Header", "Value");
return ResponseEntity.ok("Data received and processed");
}
- 用途:用于处理HTTP POST请求,主要应用于创建新资源。请求的数据通常包含在请求体中。
- 优势:POST请求允许较大的数据量传输,且请求参数不在URL中显示,适合提交表单数据或上传文件,保持了较好的安全性。
3. @PutMapping
@PutMapping("/example/{id}")
public String handlePutRequest(@PathVariable Long id, @RequestBody UpdateObject updateObject) {
// 更新逻辑
return "Resource with ID " + id + " updated";
}
- 用途:映射HTTP PUT请求,主要用于更新现有资源的全部属性。要求客户端提供完整的资源表示。
- 优势:遵循REST原则,表明这是一个整体替换资源的操作,幂等性保证了重复请求不会产生副作用。
4.@DeleteMapping
@DeleteMapping("/example/{id}")
public String handleDeleteRequest(@PathVariable Long id) {
// 删除逻辑
return "Resource with ID " + id + " deleted";
}
- 用途:处理HTTP DELETE请求,用于删除指定资源。
- 优势:简单明了地表达了资源删除操作,确保安全删除,不会因重复请求导致额外问题。
5.@PatchMapping
@PatchMapping("/example/{id}")
public String handlePatchRequest(@PathVariable Long id, @RequestBody PartialUpdateObject partialUpdate) {
// 部分更新逻辑
return "Partial update applied to resource with ID " + id;
}
- 用途:映射HTTP PATCH请求,用于对资源进行部分更新,即只更新资源的部分属性。
- 优势:相比PUT请求,PATCH更加高效,因为它只需要发送需要修改的部分数据,而不是整个资源,减少了网络传输量。
这些注解极大地简化了Spring应用中RESTful服务的实现,提高了开发效率和代码的可读性,同时遵循了Web服务的最佳实践。
二、请求参数
1. @RequestParam
- 用途:此注解用于从HTTP请求的URL查询字符串中获取参数值。当请求的URL中包含额外的查询参数时,比如
/search?query=keyword
,可以用@RequestParam
来绑定这些参数到方法参数上。 - 场景:适用于过滤、搜索、排序等需要动态参数的场景。
- 示例:
java @GetMapping("/search")
public List<Item> searchItems(@RequestParam String query) {
// 使用query参数执行搜索逻辑
return itemService.findByKeyword(query);
}
2. @PathVariable
- 用途:当URI中包含动态的部分(比如
/users/{userId}
),@PathVariable
用于从URI模板中提取这些变量值。它使得每个资源实例都能通过其ID直接访问。 - 场景:用于获取资源的详细信息、更新或删除特定资源等操作。
- 示例:
java @GetMapping("/users/{userId}")
public User getUserById(@PathVariable Long userId) {
// 根据userId获取用户信息
return userService.findById(userId);
}
3. @RequestBody
- 用途:此注解用于将HTTP请求的主体内容(通常是JSON或XML格式)绑定到方法的参数上。它适用于POST、PUT、PATCH等需要提交实体数据的请求。
- 场景:创建或更新资源时,客户端发送整个资源对象到服务器。
- 示例:
java @PostMapping("/users")
public User createUser(@RequestBody User newUser) {
// 创建新用户并保存
return userService.save(newUser);
}
4. @ResponseBody
- 用途:用于将方法的返回值直接写入HTTP响应体中。通常与
@RestController
配合使用,使得控制器方法无需视图解析,直接返回数据给客户端。 - 场景:几乎所有的RESTful API响应都会用到,以JSON或XML等形式直接返回数据。
- 示例(隐含使用,体现在类级别):
java @RestController
public class UserController {
// ...
@GetMapping("/users/{userId}")
public User getUserById(@PathVariable Long userId) {
return userService.findById(userId);
}
// ...
}
5. @HeaderParam
- 用途:用于从HTTP请求头中获取指定的值。尽管这不是Spring MVC的标准注解(它是JAX-RS的一部分),但在某些情况下,Spring应用也可能通过自定义解析器等方式间接使用它。
- 场景:验证身份、跟踪请求来源、处理特定的客户端信息等。
- 示例(注意:Spring中通常使用
@RequestHeader
代替):
java @GetMapping("/secure-endpoint")
public String secureEndpoint(@RequestHeader("Authorization") String authToken) {
// 验证authToken
return "Secure content";
}
6. @CookieValue
- 用途:用于从HTTP请求的Cookie中获取指定的值。
- 场景:用户会话管理、个性化设置、保持登录状态等。
- 示例:
java @GetMapping("/welcome")
public String welcomePage(@CookieValue("sessionToken") String token) {
// 使用token进行用户会话验证
return "Welcome!";
}
这些注解是构建RESTful Web服务时处理请求和响应数据的关键工具,它们帮助开发者高效地实现客户端与服务器之间的数据交换。