我必须进行一个包含自定义头和查询参数的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
进行交换时,它工作得很好。
有谁有什么想法吗?
发布于 2011-11-29 23:07:52
好吧,我是个笨蛋,我把查询参数和url参数搞混了。我有点希望有一种更好的方法来填充我的查询参数,而不是一个丑陋的连接字符串,但我们就是这样。这只是一个用正确的参数构建URL的例子。如果您将其作为字符串传递,Spring还将为您处理编码。
发布于 2014-08-22 03:29:13
要轻松操作URL /路径/参数等,您可以使用Spring类创建一个带有参数占位符的UriComponentsBuilder模板,然后在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
);
发布于 2013-05-22 02:18:40
uriVariables也会在查询字符串中展开。例如,下面的调用将扩展account和name的值:
restTemplate.exchange("http://my-rest-url.org/rest/account/{account}?name={name}",
HttpMethod.GET,
httpEntity,
clazz,
"my-account",
"my-name"
);
因此,实际的请求url将是
http://my-rest-url.org/rest/account/my-account?name=my-name
有关更多详细信息,请查看HierarchicalUriComponents.expandInternal(UriTemplateVariables)。Spring的版本是3.1.3。
https://stackoverflow.com/questions/8297215
复制相似问题