Spring RestTemplate GET请求带参数的实现方法

Spring RestTemplate GET请求带参数的实现方法

技术背景

在使用Spring框架进行开发时,经常需要与外部RESTful服务进行交互。RestTemplate是Spring提供的一个用于简化HTTP请求的工具类,它支持各种HTTP方法,如GET、POST等。当我们进行GET请求时,有时需要传递自定义的头部信息和查询参数。然而,在实际使用中,可能会遇到请求参数无法正确传递的问题。

实现步骤

1. 使用UriComponentsBuilder构建URL模板

UriComponentsBuilder可以帮助我们轻松地操作URL、路径和参数,同时处理URL编码。示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;
import java.util.HashMap;
import java.util.Map;

public class RestTemplateExample {
public static void main(String[] args) {
RestTemplate restTemplate = new RestTemplate();
String url = "http://example.com/api";

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

String urlTemplate = UriComponentsBuilder.fromHttpUrl(url)
.queryParam("param1", "{param1}")
.queryParam("param2", "{param2}")
.encode()
.toUriString();

Map<String, ?> params = new HashMap<>();
params.put("param1", "value1");
params.put("param2", "value2");

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

2. 直接在URL中使用占位符

RestTemplate的许多方法都支持在路径中使用占位符来传递参数。示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.web.client.RestTemplate;
import java.util.HashMap;
import java.util.Map;

public class RestTemplateExample2 {
public static void main(String[] args) {
RestTemplate restTemplate = new RestTemplate();
String url = "http://example.com/api/{param1}?param2={param2}";

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

Map<String, String> params = new HashMap<>();
params.put("param1", "value1");
params.put("param2", "value2");

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

3. 手动拼接URL

如果不想使用上述方法,也可以手动拼接URL,但要注意URL编码。示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.web.client.RestTemplate;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;

public class RestTemplateExample3 {
public static void main(String[] args) {
RestTemplate restTemplate = new RestTemplate();
String baseUrl = "http://example.com/api";
String param1 = "value1";
String param2 = "value2";

String url = baseUrl + "?param1=" + URLEncoder.encode(param1, StandardCharsets.UTF_8)
+ "&param2=" + URLEncoder.encode(param2, StandardCharsets.UTF_8);

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

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

最佳实践

  • 使用UriComponentsBuilder:推荐使用UriComponentsBuilder来构建URL,它可以自动处理URL编码,避免手动拼接URL时可能出现的编码问题。
  • 参数传递方式选择:如果参数较少,可以直接在URL中使用占位符;如果参数较多,可以使用Map来传递参数。
  • 异常处理:在实际开发中,应该对RestTemplate的请求进行异常处理,以确保程序的健壮性。

常见问题

1. 请求参数未正确传递

可能是由于使用的方法不正确或者URL构建有误。建议使用UriComponentsBuilder来构建URL,并确保参数的占位符和实际传递的参数名称一致。

2. 编码问题

手动拼接URL时,要注意对参数进行URL编码,避免出现特殊字符导致请求失败。使用UriComponentsBuilder可以自动处理编码问题。

3. 双重编码问题

在使用UriComponentsBuilder时,如果不小心进行了双重编码,会导致参数值出现错误。可以使用.build().toUriString()来避免双重编码。


Spring RestTemplate GET请求带参数的实现方法
https://119291.xyz/posts/2025-04-22.spring-resttemplate-get-with-parameters/
作者
ww
发布于
2025年4月22日
许可协议