spring - Spring将所有查询参数作为字符串获取
问题描述
我有一个 API 网关,可以处理所有 GET 请求并将它们转发到正确的 url,就像这样
@RequestMapping(value = "**", method = RequestMethod.GET)
public @ResponseBody ResponseEntity<String> doGet(HttpServletRequest req) {
String uriString = (String) req.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);
String targetHost = uriString.split("/")[0];
URI uri = UriComponentsBuilder.fromUriString(targetHost)
.path(uriString)
.build().normalize().encode().toUri();
try {
ClientHttpRequest request = requestFactory.createRequest(uri, HttpMethod.GET);
request.getHeaders().add(HttpHeaders.ACCEPT, "application/json");
ClientHttpResponse response = request.execute();
HttpStatus status = response.getStatusCode();
String json = readBodyAsString(response);
return new ResponseEntity<>(json, status);
} catch (IOException ioe) {
StringBuilder sb = new StringBuilder();
sb.append("{\"message\": \"").append(ioe.getMessage()).append("\"}");
return new ResponseEntity<>(sb.toString(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
这对于具有任意数量路径的所有获取请求都非常有效。
问题是
HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE
只抓取给定 URL 的路径而不是查询参数
因此,如果此控制器收到带有 /api/path/path/path 的请求,它可以工作,但如果它获得 /api/path/path/path?query=1?search=2 例如它只会抓取 /api/path/path /path 然后后续请求将失败,因为它需要查询参数。
如何获得通配符匹配的整个路径以包含可能在此处的任何 queryParams
谢谢
解决方案
真的很简单,只需要使用 req.getQueryString() 将所有查询参数作为字符串获取。
同样重要的是要注意,我需要在 UriComponentsBuilder 上将查询作为 .query() 传递,以便正确编码。
URI uri = UriComponentsBuilder.fromUriString(targetHost)
.path(uriString)
.query(queryParams)
.build().normalize().encode().toUri();
推荐阅读
- java - 有没有办法从 Method[] 中删除对象
- xamarin.forms - 升级到 8.x 后在 Prism.Forms 中使用 NavigationPage 时出现空白页
- python-3.x - 使用 BS4 下载图片
- python-3.x - PyQt5,按下 [start + D] 时防止隐藏事件
- laravel - Laravel Eloquent - updateExistingPivot 方法 - 何时使用以及如何使用
- formik - 是的:验证可以为空的字符串数组
- javascript - 返回时 CSS 丢失(浏览器按钮)
- java - 我们是否应该为@Autotowired 注入 Bean 使用“final”关键字
- scala - 错误:无法使用 Spark-submit 加载主类
- google-sheets - 列出列中重复行的最大日期 - Google Query