RestTemplate 远程调用服务接口

RESTful API调用详解
本文详细介绍了如何使用Spring框架的RestTemplate进行POST和GET请求,包括设置请求头、发送JSON格式的数据、处理响应以及配置RestTemplate。同时,还展示了如何自定义RestTemplate配置和错误处理。

1.post请求,参数为json格式

   1.1

 HttpHeaders headers = new HttpHeaders();

 headers.setContentType(MediaType.APPLICATION_JSON);

 // 参数对象 person

 HttpEntity<Person> entity = new HttpEntity(person, headers);

// 如果没有返回值或者不获取返回值,泛型可以写Object
 ResponseEntity<Object> r = restTemplate.postForEntity("http://127.0.0.1:8080/t", entity, Object.class);

//如果需要获取返回值,必须指定具体泛型或者使用Map
ResponseEntity<Map> r = restTemplate.postForEntity("http://127.0.0.1:8080/t", entity, Map.class);
Map map = r.getBody();

// 比如返回值是Person
ResponseEntity<Person> r = restTemplate.postForEntity("http://127.0.0.1:8080/t", entity, Person.class);
Person person = r.getBody();

 1.2

 HttpHeaders headers = new HttpHeaders();

 headers.setContentType(MediaType.APPLICATION_JSON);

 // 参数对象 person

 HttpEntity<Person> entity = new HttpEntity(person, headers);

//直接返回  数据对象
Person r = restTemplate.postForObject(url, entity, Person.class);

2 get请求

//同上面postForEntity  返回值泛型Map也可以的
ResponseEntity<Person> r = restTemplate.getForEntity("http://127.0.0.1:8080/t?id=111&name=klkkkkk", Person.class);

 

 

附:restTemplateconfig



import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.client.DefaultResponseErrorHandler;
import org.springframework.web.client.RestTemplate;

import java.io.IOException;
import java.nio.charset.Charset;

@Configuration
public class RestTemplateConfig {

    @Autowired
    private RestTemplateBuilder builder;

    @Bean
    public RestTemplate restTemplate() {
        RestTemplate restTemplate = builder.build();
        restTemplate.getMessageConverters().set(1,
                new StringHttpMessageConverter(Charset.forName("UTF-8")));
        restTemplate.setErrorHandler(new DefaultResponseErrorHandler() {
            @Override
            public void handleError(ClientHttpResponse response) throws IOException {
                if (response.getRawStatusCode() != 401) {
                    super.handleError(response);
                }
            }
        });

        return restTemplate;
    }


    @Bean
    public CustomRestTemplateCustomizer customRestTemplateCustomizer() {
        return new CustomRestTemplateCustomizer();
    }

    @Bean
    @DependsOn(value = {"customRestTemplateCustomizer"})
    public RestTemplateBuilder restTemplateBuilder() {
        return new RestTemplateBuilder(customRestTemplateCustomizer());
    }

}



//============================================================================
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.web.client.RestTemplateCustomizer;
import org.springframework.web.client.RestTemplate;

@Slf4j
public class CustomRestTemplateCustomizer implements RestTemplateCustomizer {

    @Override
    public void customize(RestTemplate restTemplate) {
        restTemplate.getInterceptors().add(new CustomClientHttpRequestInterceptor());

    }
}



//============================================================================



import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.ClientHttpResponse;

import java.io.IOException;

@Slf4j
public class CustomClientHttpRequestInterceptor implements ClientHttpRequestInterceptor {

    @Override
    public ClientHttpResponse intercept(HttpRequest request, byte[] body,
                                        ClientHttpRequestExecution execution) throws IOException {
        logRequestDetails(request);
        return execution.execute(request, body);

    }

    private void logRequestDetails(HttpRequest request) {
        log.info("Headers: {}", request.getHeaders());
        log.info("Request Method: {}", request.getMethod());
        log.info("Request URI: {}", request.getURI());
    }


}

添加拦截器,打印调用信息

看效果:

在 Java 中使用 `RestTemplate` 调用远程 GET 接口是一种常见的 HTTP 客户端实现方式,尤其适用于 Spring 框架中的 Web 应用程序。以下是如何通过 `RestTemplate` 发起 GET 请求并处理响应的详细说明。 ### 1. 添加依赖 如果使用的是基于 Maven 的项目,需要确保 `pom.xml` 文件中包含 Spring Web 模块的依赖: ```xml <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.3.20</version> </dependency> ``` 该依赖提供了 `RestTemplate` 类的支持[^1]。 ### 2. 创建 RestTemplate Bean(可选) 在 Spring 应用中,推荐将 `RestTemplate` 配置为一个 Bean,以便在整个应用程序中复用: ```java @Bean public RestTemplate restTemplate() { return new RestTemplate(); } ``` ### 3. 发送 GET 请求 可以使用 `getForObject()` 或 `getForEntity()` 方法来发送 GET 请求。前者用于直接获取响应体内容,后者则返回完整的 `ResponseEntity` 对象,包括状态码、头部和响应体。 #### 使用 `getForObject()` 获取响应数据 ```java String url = "https://api.example.com/data"; RestTemplate restTemplate = new RestTemplate(); // 假设接口返回 JSON 格式的数据,并映射到 MyData.class MyData response = restTemplate.getForObject(url, MyData.class); System.out.println(response); ``` #### 使用 `getForEntity()` 获取完整响应信息 ```java ResponseEntity<MyData> responseEntity = restTemplate.getForEntity(url, MyData.class); if (responseEntity.getStatusCode().is2xxSuccessful()) { MyData data = responseEntity.getBody(); System.out.println("Status: " + responseEntity.getStatusCode()); System.out.println("Data: " + data); } ``` ### 4. 处理 URL 参数 若请求 URL 包含路径参数或查询参数,可以通过 `Map` 或可变参数传递: ```java String urlWithParams = "https://api.example.com/items/{id}"; Map<String, String> params = new HashMap<>(); params.put("id", "123"); MyData response = restTemplate.getForObject(urlWithParams, MyData.class, params); ``` ### 5. 异常处理 调用远程服务时可能会遇到网络问题、超时或无效响应等异常情况。建议使用 `try-catch` 捕获 `RestClientException` 来处理这些异常: ```java try { MyData response = restTemplate.getForObject(url, MyData.class); } catch (RestClientException e) { System.err.println("Error occurred while calling remote API: " + e.getMessage()); } ``` ### 6. 自定义配置(如超时设置) 可以通过自定义 `RestTemplate` 实例来设置连接和读取超时时间: ```java @Bean public RestTemplate restTemplate(RestTemplateBuilder builder) { return builder .setConnectTimeout(Duration.ofSeconds(10)) .setReadTimeout(Duration.ofSeconds(10)) .build(); } ``` ### 示例代码总结 ```java import org.springframework.web.client.RestTemplate; public class RestClientExample { public static void main(String[] args) { RestTemplate restTemplate = new RestTemplate(); String url = "https://api.example.com/data"; try { MyData response = restTemplate.getForObject(url, MyData.class); System.out.println("Received Data: " + response); } catch (Exception e) { System.err.println("Failed to call remote API: " + e.getMessage()); } } } class MyData { private String name; private int value; // Getters and setters @Override public String toString() { return "MyData{name='" + name + "', value=" + value + "}"; } } ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值