1. 引入依赖
首先,需要确认项目中是否直接大概间接引入过spring-web依赖,如果没有引入过,需要在pom.xml中添加以下代码引入依赖:- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-web</artifactId>
- <version>4.3.24.RELEASE</version>
- </dependency>
复制代码 2. 发送GET请求
使用RestTemplate发送GET请求主要有getForObject()和getForEntity()2个方法,每个方法分别提供了3种不同的重载。
2.1 使用getForObject发送GET请求(无参数)
使用getForObject()实现:- RestTemplate restTemplate = new RestTemplate();
- String url = "https://www.example.com/getCurrentEnv";
- String response = restTemplate.getForObject(url, String.class);
- System.out.println(response);
复制代码 假设以上接口返回的报文为:- {
- "serverAddress": "www.example.dev.com",
- "env": "dev"
- }
复制代码 也可以直接解析为自定义的范例:- import lombok.Getter;
- import lombok.Setter;
- @Getter
- @Setter
- public class EnvInfo {
- private String serverAddress;
- private String env;
- }
复制代码- RestTemplate restTemplate = new RestTemplate();
- String url = "https://www.example.com/getCurrentEnv";
- EnvInfo response = restTemplate.getForObject(url, EnvInfo.class);
- System.out.println(JSON.toJSONString(response));
复制代码 2.2 使用getForEntity发送GET请求(无参数)
也可以使用getForEntity()实现和2.1同样的功能,代码如下所示:- RestTemplate restTemplate = new RestTemplate();
- String url = "https://www.example.com/getCurrentEnv";
- ResponseEntity<EnvInfo> responseEntity = restTemplate.getForEntity(url, EnvInfo.class);
- if (responseEntity.getStatusCode() == HttpStatus.OK) {
- EnvInfo response = responseEntity.getBody();
- System.out.println(JSON.toJSONString(response));
- }
复制代码 2.3 使用getForObject发送GET请求(带参数)
第一种方法是直接在url上拼接上参数,如下所示:- RestTemplate restTemplate = new RestTemplate();
- String url = "https://www.example.com/getDataList?pageIndex=1&pageSize=20";
- EnvInfo response = restTemplate.getForObject(url, EnvInfo.class);
- System.out.println(JSON.toJSONString(response));
复制代码 第二种方法是使用占位符添加参数,如下所示:- RestTemplate restTemplate = new RestTemplate();
- String url = "https://www.example.com/getDataList?pageIndex={1}&pageSize={2}";
- EnvInfo response = restTemplate.getForObject(url, EnvInfo.class, 1, 20);
- System.out.println(JSON.toJSONString(response));
复制代码 以上代码也可以替换为:- RestTemplate restTemplate = new RestTemplate();
- String url = "https://www.example.com/getDataList?pageIndex={pageIndex}&pageSize={pageSize}";
- Map<String, String> uriVariables = new HashMap<>();
- uriVariables.put("pageIndex", "1");
- uriVariables.put("pageSize", "20");
- EnvInfo response = restTemplate.getForObject(url, EnvInfo.class, uriVariables);
- System.out.println(JSON.toJSONString(response));
复制代码 留意事项:
uriVariables中的key必须和url中的占位符名称一致,否则会抛出非常:
java.lang.IllegalArgumentException: Map has no value for 'pageIndex'
第三种方法是使用UriComponentsBuilder添加参数,该种方法相比于前两种方法更加机动,可以实现动态添加参数,代码如下所示:- RestTemplate restTemplate = new RestTemplate();
- String httpUrl = "https://www.example.com/getDataList";
- UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromHttpUrl(httpUrl);
- uriComponentsBuilder.queryParam("pageIndex", 1);
- uriComponentsBuilder.queryParam("pageSize", 20);
- String url = uriComponentsBuilder.toUriString();
- EnvInfo response = restTemplate.getForObject(url, EnvInfo.class);
- System.out.println(JSON.toJSONString(response));
复制代码 2.4 使用getForEntity发送GET请求(带参数)
也可以使用getForEntity()实现和2.3同样的功能,代码如下所示:- RestTemplate restTemplate = new RestTemplate();
- String httpUrl = "https://www.example.com/getDataList";
- UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromHttpUrl(httpUrl);
- uriComponentsBuilder.queryParam("pageIndex", 1);
- uriComponentsBuilder.queryParam("pageSize", 20);
- String url = uriComponentsBuilder.toUriString();
- ResponseEntity<EnvInfo> responseEntity = restTemplate.getForEntity(url, EnvInfo.class);
- if (responseEntity.getStatusCode() == HttpStatus.OK) {
- EnvInfo response = responseEntity.getBody();
- System.out.println(JSON.toJSONString(response));
- }
复制代码 2.5 getForObject与getForEntity的区别
getForEntity()与getForObject()相比,返回值用了ResponseEntity进行封装,可以多获取到以下2种信息:
代码示例:- RestTemplate restTemplate = new RestTemplate();
- String httpUrl = "https://www.example.com/getDataList";
- UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromHttpUrl(httpUrl);
- uriComponentsBuilder.queryParam("pageIndex", 1);
- uriComponentsBuilder.queryParam("pageSize", 20);
- String url = uriComponentsBuilder.toUriString();
- ResponseEntity<EnvInfo> responseEntity = restTemplate.getForEntity(url, EnvInfo.class);
- System.out.println("statusCode: " + responseEntity.getStatusCode().toString());
- System.out.println("statusCodeValue: " + responseEntity.getStatusCodeValue());
- responseEntity.getHeaders().forEach((key, values) -> {
- System.out.println(key + ": " + values);
- });
复制代码 输出结果:
statusCode: 200
statusCodeValue: 200
Server: [openresty]
Date: [Thu, 10 Apr 2025 05:39:02 GMT]
Content-Type: [application/json]
Transfer-Encoding: [chunked]
Connection: [keep-alive]
其中Response Headers输出部分和Chrome浏览器Network中的Response Headers是一致的:
2.6 发送GET请求(带参数及请求头)
一般情况下,请求第三方接口都需要签名、时间戳等请求头,但getForObject()和getForEntity()都不支持,
此时需要使用exchange()方法,代码如下所示:- RestTemplate restTemplate = new RestTemplate();
- String httpUrl = "https://www.example.com/getDataList";
- UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromHttpUrl(httpUrl);
- uriComponentsBuilder.queryParam("pageIndex", 1);
- uriComponentsBuilder.queryParam("pageSize", 20);
- HttpHeaders headers = new HttpHeaders();
- headers.set("signature", "3045022100875efcef9eb54626bb0168a6baa7c61265d0001d49243f");
- headers.set("timestamp", String.valueOf(System.currentTimeMillis()));
- String url = uriComponentsBuilder.toUriString();
- ResponseEntity<EnvInfo> responseEntity = restTemplate.exchange(url,
- HttpMethod.GET,
- new HttpEntity<>(headers),
- EnvInfo.class);
- if (responseEntity.getStatusCode() == HttpStatus.OK) {
- EnvInfo response = responseEntity.getBody();
- System.out.println(JSON.toJSONString(response));
- }
复制代码 3. 发送POST请求
使用RestTemplate发送POST请求主要有postForObject()和postForEntity()2个方法,每个方法分别提供了3种不同的重载。
3.1 发送POST请求(带参数、json方式)
使用postForObject()实现:- RestTemplate restTemplate = new RestTemplate();
- HttpHeaders headers = new HttpHeaders();
- headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
- LoginParams loginParams = new LoginParams();
- loginParams.setUsername("zhangsan");
- loginParams.setPassword("123456");
- HttpEntity<LoginParams> request = new HttpEntity<>(loginParams, headers);
- String url = "https://www.example.com/login";
- String response = restTemplate.postForObject(url, request, String.class);
- System.out.println(response);
复制代码 LoginParams的定义如下所示:- import lombok.Getter;
- import lombok.Setter;
- @Getter
- @Setter
- public class LoginParams {
- private String username;
- private String password;
- }
复制代码 假设以上接口返回的报文为:- {
- "code": 200,
- "expire": "2025-04-11 14:42:22",
- "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NDQzNTM3NDIsImlkZW50aXR5"
- }
复制代码 也可以直接解析为自定义的范例:- import lombok.Getter;
- import lombok.Setter;
- @Getter
- @Setter
- public class LoginResponse {
- private Integer code;
- private String expire;
- private String token;
- }
复制代码- RestTemplate restTemplate = new RestTemplate();
- HttpHeaders headers = new HttpHeaders();
- headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
- LoginParams loginParams = new LoginParams();
- loginParams.setUsername("zhangsan");
- loginParams.setPassword("123456");
- HttpEntity<LoginParams> request = new HttpEntity<>(loginParams, headers);
- String url = "https://www.example.com/login";
- LoginResponse response = restTemplate.postForObject(url, request, LoginResponse.class);
- System.out.println(JSON.toJSONString(response));
复制代码 也可以使用postForEntity()实现同样的功能,代码如下所示:- ResponseEntity<LoginResponse> responseEntity = restTemplate.postForEntity(url, request, LoginResponse.class);
- if (responseEntity.getStatusCode() == HttpStatus.OK) {
- LoginResponse response = responseEntity.getBody();
- System.out.println(JSON.toJSONString(response));
- }
复制代码 3.2 发送POST请求(带参数、form表单方式)
使用postForObject()实现:- RestTemplate restTemplate = new RestTemplate();
- HttpHeaders headers = new HttpHeaders();
- headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
- MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
- map.add("username", "zhangsan");
- map.add("password", "123456");
- HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(map, headers);
- String url = "https://www.example.com/login";
- LoginResponse response = restTemplate.postForObject(url, request, LoginResponse.class);
- System.out.println(JSON.toJSONString(response));
复制代码 也可以使用postForEntity()实现同样的功能,代码如下所示:- ResponseEntity<LoginResponse> responseEntity = restTemplate.postForEntity(url, request, LoginResponse.class);
- if (responseEntity.getStatusCode() == HttpStatus.OK) {
- LoginResponse response = responseEntity.getBody();
- System.out.println(JSON.toJSONString(response));
- }
复制代码 3.3 postForObject与postForEntity的区别
postForObject()与postForEntity()的区别,与getForEntity()与getForObject()的区别一样,
返回值用了ResponseEntity进行封装。
4. 超时时间设置
如果需要自定义HTTP请求的毗连超时时间和数据传输超时时间,代码如下所示:- import org.springframework.beans.factory.annotation.Value;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.http.client.SimpleClientHttpRequestFactory;
- import org.springframework.web.client.RestTemplate;
- @Configuration
- public class RestTemplateConfig {
- @Value("${restTemplate.connectTimeout:5000}")
- private int connectTimeout;
- @Value("${restTemplate.readTimeout:10000}")
- private int readTimeout;
- @Bean
- public RestTemplate restTemplate() {
- SimpleClientHttpRequestFactory simpleClientHttpRequestFactory = new SimpleClientHttpRequestFactory();
- simpleClientHttpRequestFactory.setConnectTimeout(connectTimeout);
- simpleClientHttpRequestFactory.setReadTimeout(readTimeout);
- return new RestTemplate(simpleClientHttpRequestFactory);
- }
- }
复制代码文章持续更新,欢迎关注微信公众号「申城异乡人」第一时间阅读!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |