首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >带参数的Spring RestTemplate GET

带参数的Spring RestTemplate GET
EN

Stack Overflow用户
提问于 2011-11-28 22:21:39
回答 11查看 569.3K关注 0票数 341

我必须进行一个包含自定义头和查询参数的REST调用。我只使用头(没有正文)设置HttpEntity,并使用RestTemplate.exchange()方法,如下所示:

代码语言:javascript
复制
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进行交换时,它工作得很好。

有谁有什么想法吗?

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2011-11-29 23:07:52

好吧,我是个笨蛋,我把查询参数和url参数搞混了。我有点希望有一种更好的方法来填充我的查询参数,而不是一个丑陋的连接字符串,但我们就是这样。这只是一个用正确的参数构建URL的例子。如果您将其作为字符串传递,Spring还将为您处理编码。

票数 31
EN

Stack Overflow用户

发布于 2014-08-22 03:29:13

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

代码语言:javascript
复制
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
);
票数 608
EN

Stack Overflow用户

发布于 2013-05-22 02:18:40

uriVariables也会在查询字符串中展开。例如,下面的调用将扩展account和name的值:

代码语言:javascript
复制
restTemplate.exchange("http://my-rest-url.org/rest/account/{account}?name={name}",
    HttpMethod.GET,
    httpEntity,
    clazz,
    "my-account",
    "my-name"
);

因此,实际的请求url将是

代码语言:javascript
复制
http://my-rest-url.org/rest/account/my-account?name=my-name

有关更多详细信息,请查看HierarchicalUriComponents.expandInternal(UriTemplateVariables)。Spring的版本是3.1.3。

票数 229
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8297215

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档