מדריך מהיר לפסק זמן ב- OkHttp

1. סקירה כללית

במדריך מהיר זה נתמקד בסוגים שונים של פסק זמן שנוכל להגדיר עבור לקוח OkHttp.

לסקירה כללית יותר של ספריית OkHttp, עיין במדריך ההיכרות שלנו עם OkHttp.

2. חבר את פסק הזמן

פסק זמן להתחברות מגדיר א פרק זמן שבו הלקוח שלנו צריך ליצור קשר עם מארח יעד.

כברירת מחדל, עבור OkHttpClient, פסק זמן זה מוגדר ל- 10 שניות.

עם זאת, אנו יכולים לשנות את ערכו בקלות באמצעות ה- OkHttpClient.Builder # connectTimeout שיטה. ערך אפס פירושו אין פסק זמן כלל.

בואו נראה כעת כיצד לבנות ולהשתמש ב- OkHttpClient עם פסק זמן לחיבור מותאם אישית:

@ מבחן ציבורי בטל כאשר ConnectTimeoutExceeded_thenSocketTimeoutException () {OkHttpClient client = new OkHttpClient.Builder () .connectTimeout (10, TimeUnit.MILLISECONDS) .build (); בקשת בקשה = Request.Builder חדש () .url ("// 203.0.113.1") // כתובת לא ניתנת לניתוב .build (); נזרק לזרוק = catchThrowable (() -> client.newCall (בקשה). Execute ()); assertThat (נזרק) .isInstanceOf (SocketTimeoutException.class); }

הדוגמה לעיל מראה כי הלקוח זורק א SocketTimeoutException כאשר ניסיון החיבור עולה על פסק הזמן שהוגדר.

3. קראו פסק זמן

זמן קצוב לקריאה מוחל מהרגע שהחיבור בין לקוח למארח יעד נקבע בהצלחה.

זה מגדיר א זמן מקסימום של חוסר פעילות בין שתי מנות נתונים בעת ההמתנה לתגובת השרת.

ה פסק זמן ברירת מחדל של 10 שניות ניתן לשנות באמצעות OkHttpClient.Builder # readTimeout. באופן אנלוגי באשר לפסק הזמן לחיבור, ערך אפס מציין שום פסק זמן.

בואו נראה כעת כיצד להגדיר בפועל פסק זמן לקריאה מותאם אישית:

@ מבחן פומבי בטל כאשר ReadTimeoutExceeded_thenSocketTimeoutException () {OkHttpClient client = new OkHttpClient.Builder () .readTimeout (10, TimeUnit.MILLISECONDS) .build (); בקשת בקשה = Request.Builder חדש () .url ("// httpbin.org/delay/2") // זמן תגובה של שתי שניות .build (); נזרק לזרוק = catchThrowable (() -> client.newCall (בקשה). Execute ()); assertThat (נזרק) .isInstanceOf (SocketTimeoutException.class); }

כפי שאנו רואים, השרת אינו מחזיר את התגובה בזמן הקצוב המוגדר של 500 אלפיות השנייה. כתוצאה מכך, OkHttpClient זורק א SocketTimeoutException.

4. כתוב פסק זמן

פסק זמן לכתיבה מגדיר א זמן חוסר פעילות מרבי בין שתי מנות נתונים בעת שליחת הבקשה לשרת.

באופן דומה, לגבי זמן הקצאה לחיבור וקריאה, אנו יכולים לעקוף את ערך ברירת המחדל של 10 שניות באמצעות OkHttpClient.Builder # writeTimeout. כמקובל, ערך אפס פירושו אין פסק זמן בכלל.

בדוגמה הבאה קבענו פסק זמן קצר מאוד לכתיבה של 10 אלפיות השנייה ונפרסם תוכן של 1 מגה בייט לשרת:

@ מבחן ציבורי בטל כאשר WriteTimeoutExceeded_thenSocketTimeoutException () {OkHttpClient client = OkHttpClient.Builder new () .writeTimeout (10, TimeUnit.MILLISECONDS) .build (); בקשת בקשה = Request.Builder חדש () .url ("// httpbin.org/delay/2") .post (RequestBody.create (MediaType.parse ("text / plain"), create1MBString ())) .build ( ); נזרק לזרוק = catchThrowable (() -> client.newCall (בקשה). Execute ()); assertThat (נזרק) .isInstanceOf (SocketTimeoutException.class); }

כפי שאנו רואים, בשל עומס המטען הרב, הלקוח שלנו אינו מסוגל לשלוח גוף בקשה לשרת תוך זמן הקצוב שהוגדר. כתוצאה מכך, OkHttpClient זורק א SocketTimeoutException.

5. פסק זמן להתקשרות

פסק זמן לשיחה הוא קצת שונה מפסקי החיבור, הקריאה והכתיבה שכבר דנו בהם.

זה מגדיר מגבלת זמן לשיחת HTTP מלאה. זה כולל פתרון DNS, חיבור, כתיבת גוף הבקשה, עיבוד שרתים וכן קריאת גוף התגובה.

שלא כמו פסק זמן אחר, ערך ברירת המחדל מוגדר לאפס, מה שאומר שאין פסק זמן. אך כמובן, אנו יכולים להגדיר ערך מותאם אישית באמצעות OkHttpClient.Builder # callTimeout שיטה.

בואו נראה דוגמא לשימוש מעשי:

@ מבחן ציבורי בטל כאשר CallTimeoutExceeded_thenInterruptedIOException () {OkHttpClient client = new OkHttpClient.Builder () .callTimeout (1, TimeUnit.SECONDS) .build (); בקשת בקשה = Request.Builder חדש () .url ("// httpbin.org/delay/2") .build (); נזרק לזרוק = catchThrowable (() -> client.newCall (בקשה). Execute ()); assertThat (נזרק) .isInstanceOf (InterruptedIOException.class); }

כפי שאנו רואים, זמן הקצאת השיחות חורג וה- OkHttpClient זורק הופסק חריג.

6. פסק זמן לבקשה

מומלץ ליצור יחיד OkHttpClient למשל ולהשתמש בו בכל שיחות ה- HTTP על פני היישום שלנו.

אולם לעיתים אנו יודעים כי בקשה מסוימת אורכת זמן רב יותר מכל האחרות. במצב זה, אנחנו צריכים להאריך פסק זמן נתון רק עבור אותה שיחה מסוימת.

במקרים כאלה אנו יכולים להשתמש ב- OkHttpClient # newBuilder שיטה. זה בונה לקוח חדש שחולק את אותן הגדרות. לאחר מכן נוכל להשתמש בשיטות הבונה כדי להתאים את הגדרות הזמן הקצוב לפי הצורך.

בואו נראה כעת כיצד לעשות זאת בפועל:

@ מבחן ציבורי בטל כאשר PerRequestTimeoutExtended_thenResponseSuccess () זורק IOException {OkHttpClient defaultClient = חדש OkHttpClient.Builder () .readTimeout (1, TimeUnit.SECONDS). בניין (); בקשת בקשה = Request.Builder חדש () .url ("// httpbin.org/delay/2") .build (); נזרק לזרוק = catchThrowable (() -> defaultClient.newCall (בקשה). ביצוע ()); assertThat (נזרק) .isInstanceOf (InterruptedIOException.class); OkHttpClient extendedTimeoutClient = defaultClient.newBuilder () .readTimeout (5, TimeUnit.SECONDS) .build (); תגובת תגובה = extendedTimeoutClient.newCall (בקשה). ביצוע (); assertThat (response.code ()). isEqualTo (200); }

כפי שאנו רואים את defaultClient נכשל בהשלמת שיחת ה- HTTP בגלל זמן הקצאת החורג.

לכן יצרנו את extendedTimeoutClient, התאים את ערך פסק הזמן, וביצע בהצלחה את הבקשה.

7. סיכום

במאמר זה אנו בחנו פסק זמן שונה שנוכל להגדיר עבור OkHttpClient.

תארנו זמן קצר גם מתי מוחלים קצבי הזמן לחיבור, קריאה וכתיבה במהלך שיחת HTTP.

בנוסף, הראינו כמה קל לשנות ערך פסק זמן מסוים רק לבקשה אחת.

כרגיל, כל דוגמאות הקוד זמינות ב- GitHub.


$config[zx-auto] not found$config[zx-overlay] not found