我有一个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);
}
}
这适用于所有具有任意路径数的get请求。
问题是
HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE
仅抓取给定网址的路径,而不是查询参数
因此,如果此控制器获取带有/ api / path / path / path的请求,它可以工作,但如果它获得/ api / path / path / path?query = 1?search = 2,例如它只会获取/ api /路径/路径/路径,然后后续请求将失败,因为它需要查询参数。
如何获取通配符匹配的完整路径以包含可能在此处的任何queryParams
由于
答案 0 :(得分:0)
非常简单,只需要使用req.getQueryString()将所有查询参数作为字符串。
另外需要注意的是,我需要将查询作为.query()传递给UriComponentsBuilder,以便正确编码。
URI uri = UriComponentsBuilder.fromUriString(targetHost)
.path(uriString)
.query(queryParams)
.build().normalize().encode().toUri();