首页 > 解决方案 > 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

谢谢

标签: spring

解决方案


真的很简单,只需要使用 req.getQueryString() 将所有查询参数作为字符串获取。

同样重要的是要注意,我需要在 UriComponentsBuilder 上将查询作为 .query() 传递,以便正确编码。

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

推荐阅读