Spring RestTemplate GET 带参数

新手上路,请多包涵

我必须进行 REST 调用,其中包括自定义标头和查询参数。我设置了我的 HttpEntity 只有标题(没有正文),我使用 RestTemplate.exchange() 方法如下:

 HttpHeaders headers = new HttpHeaders();
headers.set("Accept", "application/json");

Map<String, String> params = new HashMap<String, String>();
params.put("msisdn", msisdn);
params.put("email", email);
params.put("clientVersion", clientVersion);
params.put("clientType", clientType);
params.put("issuerName", issuerName);
params.put("applicationName", applicationName);

HttpEntity entity = new HttpEntity(headers);

HttpEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, entity, String.class, params);

这在客户端失败, dispatcher servlet 无法解析对处理程序的请求。调试后,看起来请求参数没有被发送。

当我使用请求正文和没有查询参数的 POST 进行交换时,它工作得很好。

有没有人有任何想法?

原文由 Elwood 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.6k
2 个回答

好的,所以我是个白痴,我将查询参数与 url 参数混淆了。我有点希望有一种更好的方法来填充我的查询参数,而不是一个丑陋的串联字符串,但我们已经有了。这只是使用正确参数构建 URL 的一种情况。如果您将它作为字符串传递,Spring 也会为您处理编码。

原文由 Elwood 发布,翻译遵循 CC BY-SA 3.0 许可协议

要轻松操作 URL/路径/参数/等,您可以使用 Spring 的 UriComponentsBuilder 类创建一个带有参数占位符的 URL 模板,然后在 RestOperations.exchange(...) 调用中提供这些参数的值。它比手动连接字符串更干净,并且会为您处理 URL 编码:

 HttpHeaders headers = new HttpHeaders();
headers.set(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE);
HttpEntity<?> entity = new HttpEntity<>(headers);

String urlTemplate = UriComponentsBuilder.fromHttpUrl(url)
        .queryParam("msisdn", "{msisdn}")
        .queryParam("email", "{email}")
        .queryParam("clientVersion", "{clientVersion}")
        .queryParam("clientType", "{clientType}")
        .queryParam("issuerName", "{issuerName}")
        .queryParam("applicationName", "{applicationName}")
        .encode()
        .toUriString();

Map<String, ?> params = new HashMap<>();
params.put("msisdn", msisdn);
params.put("email", email);
params.put("clientVersion", clientVersion);
params.put("clientType", clientType);
params.put("issuerName", issuerName);
params.put("applicationName", applicationName);

HttpEntity<String> response = restOperations.exchange(
        urlTemplate,
        HttpMethod.GET,
        entity,
        String.class,
        params
);

原文由 Christophe L 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题