调用第三方API超时如何区分是连接超时还是响应超时

在Java中调用第三方接口时,遇到超时问题通常涉及两种类型的超时:连接超时(Connect Timeout)和响应超时(Read TimeOut)
要查看是对方响应超时还是自己方连接超时,可以通过设置Java的HttpClient的超时时间和捕获异常来判断。以下是一个示例:

import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.CoreConnectionPNames;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;

public class TimeoutTest {
    public static void main(String[] args) {
        // 设置连接超时时间,单位毫秒
        int connectionTimeout = 5000;
        // 设置读取数据超时时间,单位毫秒
        int socketTimeout = 10000;

        // 创建HttpClientBuilder
        HttpParams httpParams = new BasicHttpParams();
        HttpConnectionParams.setConnectionTimeout(httpParams, connectionTimeout);
        HttpConnectionParams.setSoTimeout(httpParams, socketTimeout);
        RequestConfig requestConfig = RequestConfig.custom().setParams(httpParams).build();

        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            HttpGet httpGet = new HttpGet("http://example.com");
            httpGet.setConfig(requestConfig);

            try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
                // 处理响应
            }
        } catch (org.apache.http.conn.ConnectTimeoutException e) {
            System.out.println("连接超时");
        } catch (org.apache.http.socket.TimeoutException e) {
            System.out.println("响应超时");
        } catch (Exception e) {
            System.out.println("其他异常: " + e.getMessage());
        }
    }
}

在这个示例中,我们设置了连接超时时间为5秒,读取数据超时时间为10秒。通过捕获org.apache.http.conn.ConnectTimeoutExceptionorg.apache.http.socket.TimeoutException异常,可以判断是连接超时还是响应超时。针对于一些框架包装后的异常若无法区分具体超时异常类型就需要从日志中详细查看是否有read读取关键信息或connect连接关键信息。
在这里插入图片描述
不能简单的根据同一个线程调用API接口到抛出异常的时间差来进行判断,因为默认配置的响应超时时间是从连接成功开始计算的。因此日志里面的时间差其实等于 连接超时时间 +响应超时时间
在这里插入图片描述

Spring Boot调用第三方API接口通常会用到一些常用的Java库,比如Apache HttpClient、OkHttp或者Spring提供的RestTemplate。下面是使用RestTemplate进行API调用的基本步骤: 1. 引入依赖:在Spring Boot项目的pom.xml中添加`spring-boot-starter-web`依赖,这个依赖中包含了RestTemplate。 ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> ``` 2. 注入RestTemplate:在Spring Boot的主类或配置类上添加`@SpringBootApplication`注解,并在需要使用RestTemplate的类中使用`@Autowired`注解来注入RestTemplate实例。 ```java @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } @Bean public RestTemplate restTemplate() { return new RestTemplate(); } } public class SomeService { @Autowired private RestTemplate restTemplate; // 其他代码... } ``` 3. 调用第三方API:在业务逻辑中使用注入的RestTemplate调用第三方API接口。可以通过GET、POST、PUT、DELETE等方法发送HTTP请求,并处理返回的结果。 ```java public String callThirdPartyApi(String apiUrl, Map<String, String> params) { // 如果API需要参数,可以使用MultiValueMap构建请求参数 MultiValueMap<String, String> map = new LinkedMultiValueMap<>(); map.setAll(params); // 发送GET请求 ResponseEntity<String> response = restTemplate.getForEntity(apiUrl, String.class, map); // 处理响应 return response.getBody(); } ``` 4. 错误处理和配置:在调用第三方API时,需要处理可能出现的异常,如`HttpClientErrorException`或`HttpServerErrorException`。还可以配置RestTemplate,例如自定义连接超时、读取超时等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值