Spring-使用查询参数处理引导过滤器
Spring-boot filter handling with query params
在 REST 端点中,我想接收过滤器作为查询参数。每个过滤器都定义在以逗号分隔的键值对中,如下所示:
www.example.com/things?filter=key:value,key2:value2,key3:value3
此示例意味着我要获取的事物列表必须具有 key
作为 value
、 和 key2
作为value2
和key3
作为value3
在此端点中,我可以接收多个过滤器,如下所示:
www.example.com/things?filter=key:value&filter=key2:value2,key3:value3
这意味着事物列表必须有key
作为value
或(key2
作为value2
和key3
作为 value3
)
在spring-boot中,接收多个同名查询参数的方法是在你的控制器中定义一个@RequestParam("filter") String[] filters
。但问题是:每当我只发送一个 filter
查询参数时,我都会得到一个由每个键对值组成的字符串数组。如果我发送多个 filter
,我将得到一个包含每个过滤器的数组(如预期的那样)。
这意味着对于第一个示例,我将为每个密钥对提供一个大小为 3 的数组,而在第二个示例中,我将收到一个大小为 2 的数组。
我需要这样,每当我只发送一个 filter
作为查询参数时,@RequestParam
标记会提供一个大小为 1 的数组,其中包含稍后要解析的整个字符串。有办法实现吗?
你想要实现的实际上是默认行为。如果您在@RequestParam 中声明一个数组,无论您发送多少个参数,您都将在数组中拥有查询参数。
编辑:
例如,给定此控制器:
@GetMapping("/things")
public ResponseEntity getThings(@RequestParam("filter") String[] filters) {
return ResponseEntity.ok(filters);
}
您可以通过两种不同的方式调用它:
- www.example.com/things?filter=key:value,key2:value2,key3:value3
- www.example.com/things?filter=key:value&filter=key2:value2&filter=key3:value3
它们都映射到同一个数组:
[
"key:value",
"key2:value2",
"key3:value3"
]
EDIT2: 我刚刚检查过您不能混合使用这两种方式。如果这样做,逗号分隔的项将位于同一数组项中。或许这正发生在你身上
可能有更好的方法来实现您的目标,但这是我的建议。
概念的快速证明,使用 Spring Boot 2.2.1.RELEASE
,在单独的行上打印每个过滤器
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/things")
public class ThingController {
@GetMapping
public void filters(@RequestParam MultiValueMap<String, String> filters) {
System.out.println("Filters:");
filters.get("filter").forEach(System.out::println);
}
}
仅使用一个 filter
查询参数的 curl 命令:
curl -v 'http://localhost:8080/things/?filter=key:value,key2:value2,key3:value3'
打印:
Filters:
key:value,key2:value2,key3:value3
仅使用多个 filter
查询参数的 curl 命令:
curl -v 'http://localhost:8080/things/?filter=key:value&filter=key2:value2,key3:value3'
打印:
Filters:
key:value
key2:value2,key3:value3
在 REST 端点中,我想接收过滤器作为查询参数。每个过滤器都定义在以逗号分隔的键值对中,如下所示:
www.example.com/things?filter=key:value,key2:value2,key3:value3
此示例意味着我要获取的事物列表必须具有 key
作为 value
、 和 key2
作为value2
和key3
作为value3
在此端点中,我可以接收多个过滤器,如下所示:
www.example.com/things?filter=key:value&filter=key2:value2,key3:value3
这意味着事物列表必须有key
作为value
或(key2
作为value2
和key3
作为 value3
)
在spring-boot中,接收多个同名查询参数的方法是在你的控制器中定义一个@RequestParam("filter") String[] filters
。但问题是:每当我只发送一个 filter
查询参数时,我都会得到一个由每个键对值组成的字符串数组。如果我发送多个 filter
,我将得到一个包含每个过滤器的数组(如预期的那样)。
这意味着对于第一个示例,我将为每个密钥对提供一个大小为 3 的数组,而在第二个示例中,我将收到一个大小为 2 的数组。
我需要这样,每当我只发送一个 filter
作为查询参数时,@RequestParam
标记会提供一个大小为 1 的数组,其中包含稍后要解析的整个字符串。有办法实现吗?
你想要实现的实际上是默认行为。如果您在@RequestParam 中声明一个数组,无论您发送多少个参数,您都将在数组中拥有查询参数。
编辑: 例如,给定此控制器:
@GetMapping("/things")
public ResponseEntity getThings(@RequestParam("filter") String[] filters) {
return ResponseEntity.ok(filters);
}
您可以通过两种不同的方式调用它:
- www.example.com/things?filter=key:value,key2:value2,key3:value3
- www.example.com/things?filter=key:value&filter=key2:value2&filter=key3:value3
它们都映射到同一个数组:
[
"key:value",
"key2:value2",
"key3:value3"
]
EDIT2: 我刚刚检查过您不能混合使用这两种方式。如果这样做,逗号分隔的项将位于同一数组项中。或许这正发生在你身上
可能有更好的方法来实现您的目标,但这是我的建议。
概念的快速证明,使用 Spring Boot 2.2.1.RELEASE
,在单独的行上打印每个过滤器
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/things")
public class ThingController {
@GetMapping
public void filters(@RequestParam MultiValueMap<String, String> filters) {
System.out.println("Filters:");
filters.get("filter").forEach(System.out::println);
}
}
仅使用一个 filter
查询参数的 curl 命令:
curl -v 'http://localhost:8080/things/?filter=key:value,key2:value2,key3:value3'
打印:
Filters:
key:value,key2:value2,key3:value3
仅使用多个 filter
查询参数的 curl 命令:
curl -v 'http://localhost:8080/things/?filter=key:value&filter=key2:value2,key3:value3'
打印:
Filters:
key:value
key2:value2,key3:value3