Spring将所有查询参数作为字符串

时间:2018-04-25 19:13:08

标签: 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);
       }
   }

这适用于所有具有任意路径数的get请求。

问题是

HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE

仅抓取给定网址的路径,而不是查询参数

因此,如果此控制器获取带有/ api / path / path / path的请求,它可以工作,但如果它获得/ api / path / path / path?query = 1?search = 2,例如它只会获取/ api /路径/路径/路径,然后后续请求将失败,因为它需要查询参数。

如何获取通配符匹配的完整路径以包含可能在此处的任何queryParams

由于

1 个答案:

答案 0 :(得分:0)

非常简单,只需要使用req.getQueryString()将所有查询参数作为字符串。

另外需要注意的是,我需要将查询作为.query()传递给UriComponentsBuilder,以便正确编码。

   URI uri = UriComponentsBuilder.fromUriString(targetHost)
           .path(uriString)
           .query(queryParams)
           .build().normalize().encode().toUri();