在开发时,你是否因为不懂需求文档中的请求参数,而烦恼?你是否因为不知道,在Contorller层中应该如何接受参数,而苦恼?下面,我总结了一些常见的,以供大家参考:
常见的请求参数有三:Header,Path,Query
Header参数:
Header参数位于请求的头部信息中,用于传递与请求相关的附加信息或元数据。例如,常见的Header参数包括认证信息(Authentication)、内容类型(Content-Type)等。Header参数的值通常由客户端根据实际情况进行设置。
使用场景: 当需要传递额外的请求信息或指示服务端进行特定的处理时,可以使用Header参数。例如,在请求中包含认证信息以进行身份验证或指示服务端返回特定格式的数据。
Path参数:
Path参数位于请求的URL路径中,用于指定请求的资源位置。例如,在URL中看到的
"/users/{userId}"中的"{userId}"就是Path参数。Path参数通常用于标识具体的资源或对象,例如用户ID、文章ID等。在请求中,Path参数的值通常由服务端根据实际情况进行替换。
使用场景: 当需要标识具体的资源或对象时,可以使用Path参数。例如,获取特定用户的详细信息或执行针对特定资源的操作。
Query参数:
Query参数位于请求的URL查询字符串中,用于传递与请求相关的查询条件或筛选条件。例如,在URL中看到的"?age=25"中的"age=25"就是Query参数。Query参数的值通常由客户端根据实际情况进行设置,并由服务端根据这些参数的值进行处理和返回结果。
使用场景: 当需要传递查询条件或筛选条件时,可以使用Query参数。例如,在搜索引擎中输入关键词进行搜索或在电商网站中按照特定条件筛选商品列表。
为什么会有三种类型的参数呢?不是已经有了RestFul风格了吗?不该最多就Path和Header两种类型吗?
REST(Representational State Transfer)风格是一种软件架构风格,它规定了如何使用不同类型的HTTP方法(如GET、POST、PUT、DELETE等)以及URI、HTTP状态码等元素来构建和使用Web服务。在REST风格中,Path和Query参数是常见的两种请求参数类型。
然而,除了REST风格之外,还有其他类型的Web服务架构,如SOAP(Simple Object Access Protocol)等。在这些架构中,通常会使用更多的请求参数类型,如Header、Body等。
此外,即使在REST风格中,根据具体的需求和场景,也可能需要使用多种类型的请求参数。例如,某些情况下可能需要使用Path参数来指定具体的资源位置,同时使用Query参数来传递查询条件或筛选条件。此外,在某些情况下,还可能需要使用Header参数来传递认证信息、内容类型等附加信息。
因此,虽然REST风格规定了使用Path和Query参数的常见做法,但在实际应用中,还可能根据需要使用其他类型的参数。这些不同类型的参数可以提供更灵活和丰富的功能,以满足不同场景下的需求。
这三种参数类型在后端Contorller层接受时,是分别使用@PathVariable,@RequestBody,和无需注解直接接受吗?
传统风格:
Header参数:
在Controller层的方法参数中使用@RequestHeader注解来接收Header参数。例如:
@RequestMapping(value = "/users", method = RequestMethod.GET)
public User getUser(@RequestHeader("Authorization") String authorization) {
// 处理逻辑
}
在上述示例中,@RequestHeader注解用于接收请求头中的Authorization参数,并将其转换为String类型。
Path参数:
在Controller层的方法参数中使用@PathVariable注解来接收Path参数。(多个路径上的参数也只需一个@PathVariable注解)例如:
@RequestMapping(value = "/users/{userId}", method = RequestMethod.GET)
public User getUser(@PathVariable("userId") Long userId) {
// 处理逻辑
}
在上述示例中,@PathVariable注解用于接收URL路径中的{userId}参数,并将其转换为Long类型。
Query参数:
在Controller层的方法参数中使用@RequestParam注解来接收Query参数。例如:
@RequestMapping(value = "/users", method = RequestMethod.GET)
public User getUser(@RequestParam("age") int age) {
// 处理逻辑
}
在上述示例中,@RequestParam注解用于接收URL查询字符串中的age参数,并将其转换为int类型。
Rest风格下:
@RestController
@RequestMapping("/users")
public class UserController {
// 获取单个用户信息
@GetMapping("/{userId}")
public User getUser(@PathVariable Long userId) {
// 根据userId获取用户信息并返回
return userService.getUserById(userId);
}
// 获取所有用户信息
@GetMapping
public List getAllUsers() {
// 获取所有用户信息并返回
return userService.getAllUsers();
}
// 创建新用户
@PostMapping
public User createUser(@RequestBody User user) {
// 创建新用户并返回
return userService.createUser(user);
}
// 更新用户信息
@PutMapping("/{userId}")
public User updateUser(@PathVariable Long userId, @RequestBody User user) {
// 根据userId更新用户信息并返回
return userService.updateUser(userId, user);
}
// 删除用户
@DeleteMapping("/{userId}")
public void deleteUser(@PathVariable Long userId) {
// 根据userId删除用户信息
userService.deleteUser(userId);
}
}
此外,在contorller层里接受参数一般大家都是使用Result接受或传递参数,那么什么情况下要设置泛型,即Result后需不需要加“<具体的DTO类型>"呢?
一般是在查询时加,不是就不加,但这只是项目的约定,若没约定,就可加可不加
这个加的"<具体的DTO类型>"其实就是规范,Result里的data是什么DTO类型的,例子如下: