Rövid útmutató az időtúllépéshez az OkHttp-ben

1. Áttekintés

Ebben a gyors bemutatóban különféle típusú időtúllépésekre fogunk koncentrálni, amelyeket beállíthatunk az OkHttp kliens számára.

Az OkHttp könyvtár általánosabb áttekintése érdekében tekintse meg az OkHttp bevezető útmutatónkat.

2. Csatlakoztassa az időtúllépést

A kapcsolódás időkorlátja meghatározza a az az időszak, amelyben ügyfelünknek kapcsolatot kell létesítenie egy célgazdával.

Alapértelmezés szerint a OkHttpClient, ez az időtúllépés 10 másodpercre van állítva.

Azonban könnyen megváltoztathatjuk az értékét a OkHttpClient.Builder # connectTimeout módszer. A nulla értéke egyáltalán nem jelent időtúllépést.

Most nézzük meg, hogyan kell felépíteni és használni az OkHttpClient egyéni csatlakozási időtúllépés esetén:

@Test public void whenConnectTimeoutExceeded_thenSocketTimeoutException () {OkHttpClient client = new OkHttpClient.Builder () .connectTimeout (10, TimeUnit.MILLISECONDS) .build (); Request request = új Request.Builder () .url ("// 203.0.113.1") // nem átirányítható cím .build (); Dobható dobás = catchThrowable (() -> client.newCall (request) .execute ()); assertThat (dobott) .isInstanceOf (SocketTimeoutException.class); }

A fenti példa azt mutatja, hogy az ügyfél dob egy SocketTimeoutException amikor a csatlakozási kísérlet meghaladja a beállított időtúllépést.

3. Olvassa el az Időkorlátot

Az olvasási időkorlátot attól a pillanattól kezdve alkalmazzák, hogy az ügyfél és a célgép közötti kapcsolat sikeresen létrejött.

Meghatározza a két adatcsomag közötti inaktivitás maximális ideje a szerver válaszára várva.

A 10 másodperc alapértelmezett időtúllépés segítségével módosítható OkHttpClient.Builder # readTimeout. A csatlakozási időkorláthoz hasonlóan egy nulla érték sem jelzi az időtúllépést.

Nézzük meg, hogyan konfigurálhatjuk az egyéni olvasási időtúllépést a gyakorlatban:

@Test public void whenReadTimeoutExceeded_thenSocketTimeoutException () {OkHttpClient client = new OkHttpClient.Builder () .readTimeout (10, TimeUnit.MILLISECONDS) .build (); Request request = új Request.Builder () .url ("// httpbin.org/delay/2") // 2 másodperces válaszidő .build (); Dobható dobás = catchThrowable (() -> client.newCall (request) .execute ()); assertThat (dobott) .isInstanceOf (SocketTimeoutException.class); }

Mint láthatjuk, a szerver nem adja vissza a választ a megadott 500 ms-os időkorláton belül. Ennek eredményeként a OkHttpClient dob egy SocketTimeoutException.

4. Írja Timeout

Az írás időkorlátja meghatározza a két adatcsomag közötti inaktivitás maximális ideje, amikor a kérést a szerverre küldi.

Hasonlóképpen, ami a csatlakozási és olvasási időtúllépéseket illeti, a 10 másodperces alapértelmezett értéket felülírhatjuk a OkHttpClient.Builder # writeTimeout. Megállapodásként a nulla érték egyáltalán nem jelent időtúllépést.

A következő példában nagyon rövid, 10 ms-os írási időtúllépést állítottunk be, és 1 MB tartalmat küldünk a szerverre:

@Test public void whenWriteTimeoutExceeded_thenSocketTimeoutException () {OkHttpClient client = new OkHttpClient.Builder () .writeTimeout (10, TimeUnit.MILLISECONDS) .build (); Request request = új Request.Builder () .url ("// httpbin.org/delay/2") .post (RequestBody.create (MediaType.parse ("text / plain"), create1MBString ())) .build ( ); Dobható dobás = catchThrowable (() -> client.newCall (request) .execute ()); assertThat (dobott) .isInstanceOf (SocketTimeoutException.class); }

Mint látjuk, a nagy hasznos teher miatt az ügyfelünk nem tudja a megadott időkorláton belül küldeni a kérelem törzsét a szervernek. Következésképpen a OkHttpClient dob egy SocketTimeoutException.

5. Hívás időkorlátja

A hívás időkorlátja kissé eltér a már korábban tárgyalt összekapcsolási, olvasási és írási időkorlátoktól.

Meghatározza a teljes HTTP-hívás időkorlátját. Ez magában foglalja a DNS megoldását, a kapcsolódást, a kérelem törzsének írását, a szerver feldolgozását, valamint a válasz törzsének olvasását.

Más időkorlátokkal ellentétben az alapértelmezett értéke nulla, ami nem jár időtúllépéssel. De természetesen konfigurálhatunk egy egyéni értéket a használatával OkHttpClient.Builder # callTimeout módszer.

Lássunk egy gyakorlati használati példát:

@Test public void whenCallTimeoutExceeded_thenInterruptedIOException () {OkHttpClient client = new OkHttpClient.Builder () .callTimeout (1, TimeUnit.SECONDS) .build (); Request request = új Request.Builder () .url ("// httpbin.org/delay/2") .build (); Dobható dobás = catchThrowable (() -> client.newCall (request) .execute ()); assertThat (dobott) .isInstanceOf (InterruptedIOException.class); }

Mint láthatjuk, a hívás időkorlátja túllépve a OkHttpClient dob egy MegszakítottIOException.

6. Kérésenkénti időkorlát

Ajánlatos kislemezt készíteni OkHttpClient példányt, és használja újra az összes HTTP híváshoz alkalmazásunkon keresztül.

Néha azonban tudjuk, hogy egy bizonyos kérés több időt vesz igénybe, mint az összes többi. Ebben a helyzetben meg kell meghosszabbítson egy adott időkorlátot csak az adott híváshoz.

Ilyenkor használhatunk egy OkHttpClient # newBuilder módszer. Ez új klienst hoz létre, amely ugyanazokkal a beállításokkal rendelkezik. Ezután felhasználhatjuk a készítő módszereket az időtúllépés beállításainak szükség szerinti beállításához.

Most nézzük meg, hogyan lehet ezt a gyakorlatban megtenni:

@Test public void whenPerRequestTimeoutExtended_thenResponseSuccess () dobja az IOException {OkHttpClient defaultClient = új OkHttpClient.Builder () .readTimeout (1, TimeUnit.SECONDS) .build (); Request request = új Request.Builder () .url ("// httpbin.org/delay/2") .build (); Dobható dobás = catchThrowable (() -> defaultClient.newCall (kérés) .execute ()); assertThat (dobott) .isInstanceOf (InterruptedIOException.class); OkHttpClient ExtendedTimeoutClient = defaultClient.newBuilder () .readTimeout (5, TimeUnit.SECONDS) .build (); Válaszválasz = ExtendedTimeoutClient.newCall (kérés) .execute (); assertThat (válasz.kód ()). isEqualTo (200); }

Ahogy látjuk a defaultClient a túllépett olvasási időtúllépés miatt nem sikerült befejezni a HTTP-hívást.

Ezért hoztuk létre a ExtendedTimeoutClient, beállította az időkorlát értékét, és sikeresen végrehajtotta a kérést.

7. Összegzés

Ebben a cikkben mi különböző időtúllépéseket tártunk fel, amelyeket beállíthatunk a OkHttpClient.

Röviden leírtuk azt is, hogy a csatlakozás, az olvasás és az írás időtúllépését mikor alkalmazzák egy HTTP-hívás során.

Ezenkívül megmutattuk, hogy milyen egyszerű megváltoztatni egy bizonyos időtúllépési értéket csak egyetlen kérés esetén.

Szokás szerint az összes kódpélda elérhető a GitHubon.