【问题标题】:Ignoring "/" inside a URL path variable value忽略 URL 路径变量值中的“/”
【发布时间】:2020-02-02 20:06:05
【问题描述】:

我的情况很奇怪。我有一个 API 端点,它必须接受列出给定端点可用的所有资源并列出特定资源的请求。端点如下所示:

/v1/patients

我可以在不传递任何路径变量的情况下调用它,它会列出所有患者记录。特殊情况出现了 - 如果我只想获取一名患者,我必须将患者编号作为路径变量传递 - 我的患者编号看起来像这样 - 2019/patientname/October/27 - 这就是问题所在。

当我将上述数字作为路径变量传递时,我不会得到我想要的资源,而是 Spring 将斜杠“/”视为分隔符

例子:

/v1/patients/2019/patientname/October/27

我得到的响应是找不到给定路径 - 当然没有这样的路径。

是否有可能忽略这个患者编号之间的所有斜线?

编辑:不可能更改患者编号,因为它是运行整个系统的非常古老的遗留代码库的一部分。

编辑 2 - 在这种情况下不能使用 URL 编码 - 这个患者编号必须按原样传递 - 情况非常糟糕。

【问题讨论】:

标签: spring rest spring-boot


【解决方案1】:

你可以试试这样的:

@GetMapping("/v1/patients/{year}/{name}/{month}/{day}")
public ResponseEntity<Patient> getPatient(@PathVariable Integer year,
                                          @PathVariable String name,
                                          @PathVariable String month,
                                          @PathVariable Integer day) {

    String patientNumber = year + "/" + name + "/" + month + "/" + day;
    ...
}

还有一些可能也有效的方法:

@GetMapping("/v1/patients/**")
public ResponseEntity<Patient> getPatient(HttpServletRequest request) {
    String patientNumner = (String) 
            request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);
    ...
}

【讨论】:

  • 谢谢!这完全符合我老板的要求——你至少节省了我 100 天的时间! :)
猜你喜欢
  • 2016-11-04
  • 1970-01-01
  • 2021-11-20
  • 2017-07-16
  • 1970-01-01
  • 1970-01-01
  • 2021-04-22
  • 1970-01-01
  • 2015-12-29
相关资源
最近更新 更多