- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
在这个快速教程中,我们将探索 Spring 的 @RequestParam 注解。
简单地说,我们可以使用 @RequestParam 从请求中提取查询参数、表单参数甚至文件。
我们将讨论如何使用 @RequestParam 及其属性。我们还将讨论 @RequestParam 和 @PathVariable 之间的区别。
假设我们有一个端点 /api/foos,它接受一个名为 id 的查询参数:
@GetMapping("/api/foos")
@ResponseBody
public String getFoos(@RequestParam String id) {
return "ID: " + id;
}
在此示例中,我们使用 @RequestParam 来提取 id 查询参数。
一个简单的 GET 请求会调用 getFoos:
http://localhost:8080/api/foos?id=abc
----
ID: abc
接下来,让我们看看注解的属性:name、value、required 和defaultValue。
在前面的例子中,变量名和参数名都是一样的。
虽然有时我们希望这些有所不同。 或者,如果我们不使用 Spring Boot,我们可能需要进行特殊的编译时配置,否则参数名称实际上不会在字节码中。
但好的是我们可以使用 name 属性配置 @RequestParam 名称:
@PostMapping("/api/foos")
@ResponseBody
public String addFoo(@RequestParam(name = "id") String fooId, @RequestParam String name) {
return "ID: " + fooId + " Name: " + name;
}
默认情况下需要使用 @RequestParam 注释的方法参数。
这意味着如果请求中不存在参数,我们将收到错误消息:
GET /api/foos HTTP/1.1
-----
400 Bad Request
Required String parameter 'id' is not present
不过,我们可以将我们的 @RequestParam 配置为可选的,使用 *required *属性:
@GetMapping("/api/foos")
@ResponseBody
public String getFoos(@RequestParam(required = false) String id) {
return "ID: " + id;
}
在这种情况下,两者:
http://localhost:8080/api/foos?id=abc
----
ID: abc
和
http://localhost:8080/api/foos
----
ID: null
将正确调用该方法。
未指定参数时,方法参数绑定为null。
我们还可以使用 defaultValue 属性为 @RequestParam 设置默认值:
@GetMapping("/api/foos")
@ResponseBody
public String getFoos(@RequestParam(defaultValue = "test") String id) {
return "ID: " + id;
}
**这就像required=false,因为用户不再需要提供参数:
http://localhost:8080/api/foos
----
ID: test
尽管如此,我们仍然可以提供它:
http://localhost:8080/api/foos?id=abc
----
ID: abc
请注意,当我们设置 *defaultValue * 属性时,required 确实设置为 false。
我们也可以有多个参数而不定义它们的名称或仅使用 Map: 来计数
@PostMapping("/api/foos")
@ResponseBody
public String updateFoos(@RequestParam Map<String,String> allParams) {
return "Parameters are " + allParams.entrySet();
}
然后将反映发送的任何参数:
curl -X POST -F 'name=abc' -F 'id=123' http://localhost:8080/api/foos
-----
Parameters are {[name=abc], [id=123]}
单个 @RequestParam 可以有多个值:
@GetMapping("/api/foos")
@ResponseBody
public String getFoos(@RequestParam List<String> id) {
return "IDs are " + id;
}
Spring MVC 将映射一个逗号分隔的id参数:
http://localhost:8080/api/foos?id=1,2,3
----
IDs are [1,2,3]
或单独的id参数列表:
http://localhost:8080/api/foos?id=1&id=2
----
IDs are [1,2]
@RequestParam 和 @PathVariable 都可用于从请求 URI 中提取值,但它们略有不同。
虽然 @RequestParams 从查询字符串中提取值,但 @PathVariables 从 URI 路径中提取值:
@GetMapping("/foos/{id}")
@ResponseBody
public String getFooById(@PathVariable String id) {
return "ID: " + id;
}
然后,我们可以根据路径进行映射:
http://localhost:8080/foos/abc
----
ID: abc
对于 @RequestParam, 它将是:
@GetMapping("/foos")
@ResponseBody
public String getFooByIdUsingQueryParam(@RequestParam String id) {
return "ID: " + id;
}
这会给我们相同的响应,只是一个不同的 URI:
http://localhost:8080/foos?id=abc
----
ID: abc
因为 @PathVariable 从 URI 路径中提取值,所以它没有被编码。另一方面,@RequestParam 是。
使用前面的示例,ab+c 将按原样返回:
http://localhost:8080/foos/ab+c
----
ID: ab+c
但是对于 a @RequestParam 请求,参数是 URL 解码的:
http://localhost:8080/foos?id=ab+c
----
ID: ab c
@RequestParam 和@PathVariable 都可以是可选的。**
从 Spring 4.3.3 开始,我们可以使用 required 属性使 @PathVariable 可选:
@GetMapping({"/myfoos/optional", "/myfoos/optional/{id}"})
@ResponseBody
public String getFooByOptionalId(@PathVariable(required = false) String id){
return "ID: " + id;
}
那么,我们可以这样做:
http://localhost:8080/myfoos/optional/abc
----
ID: abc
或者:
http://localhost:8080/myfoos/optional
----
ID: null
对于@RequestParam,我们还可以使用我们在上一节中看到的 required 属性。
请注意,我们在将 @PathVariable 设为可选时应小心,以避免路径冲突。
在本文中,我们了解了如何使用 @RequestParam 以及 @RequestParam 和 @PathVariable 之间的区别。
所以我目前正在使用 Spring 构建一个 Multipart-Fileupload。我想创建尽可能通用的 Controller ,以便为我自己的模块化 Controller 应用程序提供良好的开端。
@RequestParam参数丢失 改动过一版代码之后, 发现@RequestParam注解的参数经常丢失. 首先确认前端确实把参数传过来了,用curl直接请求接口, 发现有时候会出现参数丢失,
概述 在这个快速教程中,我们将探索 Spring 的 @RequestParam 注解。 简单地说,我们可以使用 @RequestParam 从请求中提取查询参数、表单参数甚至文件。我们将讨论如何使用
我的@Restcontroller 中有以下方法: @GetMapping public List getByParameterOrAll( @RequestParam(value =
大家好!我有一个关于在 @RestController 中使用 @RequestParam 的问题。我想知道如何从客户端获取@RequestParam。服务器代码(@RestController):
我正在阅读 documentation Spring MVC 中的 @RequestParam 注释。 名称和值属性有什么区别? 文档说: value : Alias for name(). name
我正在尝试在我的 javascript 中获取一个 Java 对象。我正在使用 ajax 请求来获取该对象。这是我的代码: @RequestMapping(path = "/sendSMS", met
这是我在 stackoverflow 上提出的第一个问题,所以请温柔点:) 现有 GET 端点可转换为 POST。它需要扩展以接受包含 JSON 编码数据的查询参数 filterKeys。这种方法不是
假设我在 Spring Boot Controller 中有一个 GET 端点,它接受一个对象作为 @RequestParam @GetMapping(value = "/foos") public
我刚刚发现,即使我省略了 @RequestParam organization 上的注释参数,Spring仍然能够绑定(bind)它。 @RequestMapping(value="", 方法 = R
我有我的 RequestParam,我需要验证它,但是 mu 自定义验证不适用,我的 Controller @RestController @Validated class ExchangeContr
我正在 Spring 中构建一个 API,我有一个简单的问题: 我想在对下面的这些参数执行一些逻辑之前检查它们是否包含值。 我是 Spring 新手 - 有没有办法将这些值“获取”到某种数据结构中,以
我正在使用 Spring MVC 框架做一个 REST 服务。 我有一个方法: @RequestMapping("/rest/{tableName}", method = RequestMethod.
我有一个 Get 端点,它接受一个查询字符串作为请求参数。端点的问题是请求参数字符串可以包含像 ?,/等导致问题的字符。有什么方法可以将包含 ?,/等的字符串映射到 rest Controller 中
有没有办法在不检查每个函数的情况下使用 spring 验证请求参数?例如, Controller 中的每个方法都会生成元素列表,并且每个方法都接受“from”和“to”参数,因此验证是: from >
SpringMvc 中@RequestParam注解使用 建议使用包装类型来代替基本数据类型 ?
@RequestParam 绑定List参数 今天遇到了一个问题 比较尴尬。我写了一个接口,参数用@RequestParam接收,是一个List<String>。用postman可以
目录 基于name和value属性的区别 RequestParam内部有4个参数 @RequestParam,参数是否必须传的问题
1、源码展示 ? 1
配置全局乱码过滤器 参数绑定注解@RequestParam 注解@RequestParam的参数使用说明 获得Restful风格的参数 自定义类型转换器 自定义转换器的开发步骤: 获得Servlet相
我是一名优秀的程序员,十分优秀!