- @RequestParam:请求参数在URL中用于处理Content-Type为application/x-www-form-urlencoded编码的内容,只能接受简单类型的参数,例如:http://localhost:8080/user?id=1&name=Tom。
- @RequestBody:请求参数在请求体中,包含JSON、XML等类型的数据,例如:{“id”:1,“name”:“Tom”}。
- @PathVariable:请求参数在URL路径中,例如:http://localhost:8080/user/1。
- @RequestHeader:请求参数在请求头中,例如:Content-Type: application/json。
- @CookieValue:请求参数在Cookie中,例如:JSESSIONID=123456789。
这些请求类型在使用上都可以在一个请求函数里面同时使用
@PostMapping("/user/{id}")
public String updateUser(@PathVariable Long id,
@RequestParam String name,
@RequestBody User user,
@RequestHeader("Content-Type") String contentType,
@CookieValue("JSESSIONID") String sessionId) {
// ...
}
在这个例子中,我们使用@PostMapping注解来指定请求的HTTP方法为POST,并指定请求的URL路径为/user/{id}。我们还使用@PathVariable注解来获取URL路径中的参数id,使用@RequestParam注解来获取URL中的参数name,使用@RequestBody注解来获取请求体中的参数user,使用@RequestHeader注解来获取Content-Type请求头的值,使用@CookieValue注解来获取Cookie中的JSESSIONID参数的值。
关于@PathVariable和@RequestParam的区别
当你使用@RequestParam注解时,你可以从请求URL中获取参数。请求URL是HTTP请求中的一部分,包含了一些参数,例如http://localhost:8080/user?id=1&name=Tom。在Spring Boot中,你可以使用@RequestParam注解来获取这些参数。
例如,如果你想要获取URL中的参数name的值,你可以这样写:
@GetMapping("/user")
public String getUser(@RequestParam String name) {
// ...
}
在这个例子中,我们使用@GetMapping注解来指定请求的URL路径为/user。我们还使用@RequestParam注解来指定要获取的URL参数名为name,并将其值赋给name变量。
在这个例子中,如果你的请求地址是http://localhost:8080/user?id=1&name=Tom,那么各个参数获取的值如下:
- id:1
- name:Tom
- user:请求体中的JSON字符串转换成的User对象
- contentType:Content-Type请求头的值
- sessionId:JSESSIONID Cookie的值
在这个例子中,如果你的请求地址是http://localhost:8080/user/1,那么各个参数获取的值如下:
- id:1
- name:null
- user:请求体中的JSON字符串转换成的User对象
- contentType:Content-Type请求头的值
- sessionId:JSESSIONID Cookie的值
当URL中的参数名和方法参数名不一致时,你可以使用@RequestParam注解来指定URL参数名。例如:
@PostMapping("/user")
public String updateUser(@RequestParam("user_id") Long id) {
// ...
}
在这个例子中,我们使用@PostMapping注解来指定请求的URL路径为/user。我们还使用@RequestParam注解来指定要获取的URL参数名为user_id,并将其值赋给id变量。
如果你想要使用路径/user/{id},你可以这样写:
@PostMapping("/user/{user_id}")
public String updateUser(@PathVariable("user_id") Long id) {
// ...
}
在这个例子中,我们使用@PostMapping注解来指定请求的URL路径为/user/{user_id}。我们还使用@PathVariable注解来指定要获取的URL路径参数名为user_id,并将其值赋给id变量。
因此,当URL中的参数名和方法参数名不一致时,你只能使用@RequestParam注解来获取URL中的参数。
@RequestBody的注意事项
如果后端参数是一个对象,且该参数前是以@RequestBody修饰的,那么前端传递json参数时,必须满足以下要求:
后端@RequestBody注解对应的类在将HTTP的输入流(含请求体)装配到目标类(即:@RequestBody后面的类)时,会根据json字符串中的key来匹配对应实体类的属性,如果匹配一致且json中的该key对应的值符合(或可转换为),这一条我会在下面详细分析,其他的都可简单略过,但是本文末的核心逻辑代码以及几个结论一定要看! 实体类的对应属性的类型要求时,会调用实体类的setter方法将值赋给该属性。
json字符串中,如果value为""的话,后端对应属性如果是String类型的,那么接受到的就是"",如果是后端属性的类型是Integer、Double等类型,那么接收到的就是null。
json字符串中,如果value为null的话,后端对应收到的就是null。
如果某个参数没有value的话,在传json字符串给后端时,要么干脆就不把该字段写到json字符串中;要么写value时, 必须有值,null 或""都行。千万不能有类似"stature":,这样的写法,如:
常见的Http方法
1. PUT:用于更新或创建资源,请求的主体包含完整的要更新的资源。
2. DELETE:用于删除资源。
3. PATCH:用于部分更新资源,请求的主体包含要应用的更新。
4. HEAD:与GET方法类似,但只返回响应头,不返回响应体。
5. OPTIONS:用于获取目标资源支持的通信选项。
6. TRACE:用于追踪请求在服务器端的传输路径。
7. CONNECT:用于通过代理连接目标主机,通常用于建立加密隧道。
HTTP方法的选择取决于我们要对资源执行的操作。GET用于获取资源,POST用于创建资源,PUT和PATCH用于更新资源,DELETE用于删除资源,HEAD用于获取响应头等。在RESTful API设计中,正确选择和使用HTTP方法可以使API具有更好的可读性、可维护性和可扩展性。
这些HTTP方法的参数可以存放在不同的地方,具体取决于请求的类型和目标:
1. GET方法的参数通常是通过URL的查询字符串(Query String)传递的,即将参数附加在URL的末尾,以`?`开头,并使用`&`符号分隔不同的参数。例如:`http://example.com/api?param1=value1¶m2=value2`。
2. POST方法的参数通常是通过请求体(Request Body)传递的。请求体是请求的一部分,用于向服务器发送数据,可以是表单数据、JSON数据等。参数的格式可以是`application/x-www-form-urlencoded`(默认)或`multipart/form-data`(用于上传文件)。
3. PUT和DELETE方法的参数通常也是通过请求体传递的,格式与POST方法类似。
4. PATCH方法的参数可以通过URL的查询字符串或请求体传递,具体取决于API的设计。
需要注意的是,不同的框架和库可能对参数的处理方式有所不同。在某些情况下,参数也可以通过请求的头部(Headers)或路径(Path)传递。因此,具体的参数位置可以通过查看API文档或网络请求的具体实现来确定。