【问题标题】:Spring boot request mappingSpring Boot 请求映射
【发布时间】:2019-11-25 22:21:35
【问题描述】:

我有以下请求参数。

a
b
c
d
e
f

Request 可以包含所有参数或其中一些参数。我目前正在使用正则表达式/** 来解决这个问题。

有没有办法明确提及请求映射而不是** 并说它是可选的。并且任何顺序也应该匹配。

/a/1/b/f2

/b/f2/a/1

两者都应匹配该映射。

【问题讨论】:

  • 您应该使用 RequestBody 而不是请求参数,因为如果您不固定每个参数的位置,RequestParam 可能会产生问题。或详细说明您为什么有此特定要求的问题
  • 您没有请求参数,而是路径变量。我强烈建议寻找另一种提供信息的方式。实际的请求参数就可以了,还有一个json序列化的body。

标签: spring spring-boot


【解决方案1】:

没有办法通过@PathVariable 实现这一点。如果您想要随机顺序和路径变量数量的灵活性。您可以执行以下操作;

@GetMapping("/myEndpoint/**")
public void theEndpoint(HttpServletRequest request) {
    String requestURI = request.getRequestURI();
    Stream.of(requestURI.split("myEndpoint/")[1].split("/")).forEach(System.out::println);
}

您可以输入.filter(StringUtils::isNotBlank) 以防/myEndpoint/a///b/c

会给你

a
1
b
f2
d
x

当您致电/myEndpoint/a/1/b/f2/d/x

b
f2
1

当您致电/myEndpoint/b/f2/1


另外,请注意,您的端点中需要一些锚基,例如/myEndpoint。否则您的所有其他端点都将与此端点冲突。

ps。最好对此类输入使用请求参数,在这里不确定您的要求,但仅供参考。拥有这样一个 hacky 的结构真的不是最好的......

【讨论】:

  • @GoMan 是的,我知道,但你已经在做这样的事情了吗?解析来自 HttpServletRequest 的请求 URI?这是主要部分,否则我建议使用带有请求正文的POST 方法或使用一些请求参数...
  • @GoMan 或者如果你有一组有限的参数,你可以定义多个端点,在路径中增加路径变量,/var/var/var2/var/var2/var3 等。然后调用相同的方法从所有控制器传递输入的变量集,并与它们一起玩,但它们当然是匿名的,就像我的回答一样。所以你不会知道第一个 vara 还是 b 等等。如果没有请求参数或正文,这是不可能的......
【解决方案2】:

您可以通过添加必需的标志 false 来使 RequestParam 成为可选。

@RequestParam(value = "a", required=false)

对于 PathVariables,我会尝试使用 Optional 类型,但我以前从未这样做过。

@PathVariable Optional<String> a/path/{a}

【讨论】:

  • 我想我用错了术语。我的请求类似于/a/1/b/wew/c/343sd 而不是?a=1&b=wew
  • 那么你说的是路径变量
  • 是的。这就是我一直在寻找的词。
  • @GoMan 然后不要。路径变量顺序很重要,它们不是可选的。对于可选参数,请使用请求参数或请求正文。
  • 重要的问题不是“它会起作用吗?”。重要的问题是“路径变量是工作的正确工具吗?”。他们不是。
猜你喜欢
  • 1970-01-01
  • 2019-05-12
  • 2019-02-03
  • 2019-11-13
  • 2020-04-19
  • 2022-01-12
  • 2021-07-01
  • 2018-03-18
  • 2016-06-27
相关资源
最近更新 更多