1.概述

在此快速教程中,我们将专注于我们可以为其设置的不同类型超时Okhttp.客户。

有关Okhttp库的概述,请检查我们的介绍性OkHttp指南

2.连接超时

连接超时定义了一个我们的客户端应该与目标主机建立连接的时间段

默认情况下,对于OkHttpClient,这个超时被设置为10秒

但是,我们可以使用okhttpclient.Builder #cippTimeout.方法。值为零意味着根本没有超时。

现在让我们看看如何构建和使用OkHttpClient使用自定义连接超时:

@Test public void whenConnectTimeoutExceeded_thenSocketTimeoutException() {OkHttpClient client = new OkHttpClient. builder () .connectTimeout(10, TimeUnit.MILLISECONDS) .build();Request Request = new Request. builder () .url("http://203.0.113.1") //不可路由的地址。build();throw = catchThrowable(() -> client.newCall(request).execute());为了说穿.isInstanceOf (SocketTimeoutException.class);}

上面的示例显示了客户端抛出了一个Sockettimeoutexception.当连接尝试超过配置的超时时。

3.读取超时

从客户端与目标主机之间的连接的那一刻起应用读取超时。

它定义了一个在等待服务器的响应时,两个数据包之间的最长时间的不活动时间

默认超时10秒可以使用改变OkHttpClient。构建器# readTimeout。类似地,对于连接超时,零值表示没有超时。

现在让我们看看如何在实践中配置自定义读超时:

@test public void whenreadTionOutexceeded_thensocketTimeoutException(){okhttpclient client.builder().readTimeout(10,TumeUnit.milliseconds).build();请求请求= new request.builder().url(“https://httpbin.org/delay/2”)// 2-secont响应时间.build();throw = catchThrowable(() -> client.newCall(request).execute());为了说穿.isInstanceOf (SocketTimeoutException.class);}

正如我们所看到的,服务器没有在定义的500毫秒超时内返回响应。因此,OkHttpClient抛出A.sockettimeoutexception。

4.写超时

写超时定义了一个向服务器发送请求时,两个数据包之间的最长时间是两个数据包之间的时期。

类似地,对于连接和读取超时,我们可以使用默认值10秒使用OkHttpClient。构建器# writeTimeout。作为一个惯例,零值意味着根本没有超时。

在以下示例中,我们设置了10 ms的非常短的写超时,并将1 MB内容发布到服务器:

@test公共空白WherWriteTimeoutExceeded_thensockettimeoutException(){okhttpclient client = new okhttpclient.builder().writeTimeout(10,tateneUnit.milliseconds).build();请求请求= new request.builder().url(“https://httpbin.org/delay/2”).post(captainebody.create(mediatype.parse(“text / plain”),create1mbstring()))。建造();throw = catchThrowable(() -> client.newCall(request).execute());为了说穿.isInstanceOf (SocketTimeoutException.class);}

正如我们所看到的,由于有效载荷较大,我们的客户端无法在定义的超时中向服务器发送请求正文。因此,OkHttpClient抛出A.Sockettimeoutexception.

5.呼叫超时

调用超时与我们已经讨论过的连接、读和写超时略有不同。

它定义了完整的HTTP调用的时间限制。这包括解析DNS,连接,编写请求正文,服务器处理以及读取响应主体。

与其他超时不同,它的默认值设置为零,表示没有超时。当然,我们可以使用okhttpclient.Builder #CallTimeout.方法。

让我们看看一个实际的用法例子:

@Test public void whenCallTimeoutExceeded_thenInterruptedIOException() {OkHttpClient client = new OkHttpClient. builder () .callTimeout(1, TimeUnit.SECONDS) .build();Request Request = new Request. builder () .url("https://httpbin.org/delay/2") .build();throw = catchThrowable(() -> client.newCall(request).execute());为了说穿.isInstanceOf (InterruptedIOException.class);}

正如我们所看到的,超出了呼叫超时OkHttpClient抛出一个InterruptioException。

6.每次请求超时

建议创建一个单一OkHttpClient实例并为所有HTTP调用重用它在我们的申请中。

然而,有时我们知道某个请求比其他所有请求花费更多的时间。在这种情况下,我们需要仅向该特定呼叫扩展给定的超时

在这种情况下,我们可以使用okhttpclient#newbuilder方法。这构建了一个共享相同设置的新客户端。然后,我们可以使用Builder方法根据需要调整超时设置。

让我们现在看看如何在实践中做到这一点:

@test public vod whenperrequesttimeoutexted_thenresponsesuccess()抛出IoException {okhttpclient defaultClient = new okhttpclient.builder().readtyout(1,tateUnit.seconds).build();Request Request = new Request. builder () .url("https://httpbin.org/delay/2") .build();Throwable抛出= Catchthrocable(() - > defaultClient.newcall(请求).execute());为了说穿.isInstanceOf (InterruptedIOException.class);okhttpclient redendionTimentOutClient = defaultClient.newbuilder().readTimeout(5,TumnUnit.Seconds).build();响应response = extendedTimeOutClient.newcall(请求).execute();assertthat(Response.Code())。isequalto(200);}

我们看到了defaultClient.由于超过读取超时,无法完成HTTP呼叫。

这就是我们创造的原因extendedTimeoutClient,调整超时值,并成功执行请求。

7.摘要

在本文中,我们探讨了可以配置的不同超时OkHttpClient

在HTTP调用期间应用连接,读取和写入超时时,我们也很快描述。

此外,我们展示了仅为单个请求更改某个超时值是多么容易

像往常一样,所有的代码示例都可获得在GitHub

通用底部

使用Spring 5和Spring Boot 2开始,通过学习春天课程:

>>看看这个课程
本文评论关闭!