HTTP אסינכרוני עם לקוח async-http בג'אווה

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

AsyncHttpClient (AHC) היא ספריה שנבנית על גבי Netty, במטרה לבצע בקלות בקשות HTTP ולעבד תגובות באופן אסינכרוני.

במאמר זה נציג כיצד להגדיר ולהשתמש בלקוח HTTP, כיצד לבצע בקשה ולעבד את התגובה באמצעות AHC.

2. התקנה

הגרסה האחרונה של הספרייה נמצאת במאגר Maven. עלינו להקפיד להשתמש בתלות עם מזהה הקבוצה org.asynchttpclient ולא זה עם com.ning:

 org.asynchttpclient async-http-client 2.2.0 

3. תצורת לקוח HTTP

השיטה הכי פשוטה להשיג את לקוח ה- HTTP היא באמצעות ה- DSL מעמד. הסטטי asyncHttpClient () שיטה מחזירה AsyncHttpClient לְהִתְנַגֵד:

לקוח AsyncHttpClient = Dsl.asyncHttpClient ();

אם אנו זקוקים לתצורה מותאמת אישית של לקוח HTTP, אנו יכולים לבנות את ה- AsyncHttpClient חפץ באמצעות הבנאי DefaultAsyncHttpClientConfig.Builder:

DefaultAsyncHttpClientConfig.Builder clientBuilder = Dsl.config ()

זה מאפשר אפשרות להגדיר פסק זמן, שרת proxy, אישורי HTTP ועוד רבים:

DefaultAsyncHttpClientConfig.Builder clientBuilder = Dsl.config () .setConnectTimeout (500). SetProxyServer (ProxyServer חדש (...)); לקוח AsyncHttpClient = Dsl.asyncHttpClient (clientBuilder);

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

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

4. יצירת בקשת HTTP

ישנן שתי שיטות בהן אנו יכולים להגדיר בקשת HTTP באמצעות AHC:

  • כָּרוּך
  • לא מאוגד

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

לדוגמה, בעת יצירת בקשה מאוגדת השבת קידוד דגל נקרא מתצורת לקוח HTTP, ואילו עבור בקשה לא מאוגדת זה כברירת מחדל מוגדר כ- false. זה שימושי מכיוון שניתן לשנות את תצורת הלקוח מבלי להרכיב מחדש את כל היישום באמצעות מאפייני מערכת שהועברו כארגומנטים של VM:

java -jar -Dorg.asynchttpclient.disableUrlEncodingForBoundRequests = true

ניתן למצוא רשימה מלאה של נכסים ahc-default.properties קוֹבֶץ.

4.1. בקשה מאוגדת

כדי ליצור בקשה מאוגדת אנו משתמשים בשיטות העוזרות מהכיתה AsyncHttpClient שמתחילים בקידומת "הכן". כמו כן, אנו יכולים להשתמש ב- preparRequest () שיטה המקבלת כבר נוצר בַּקָשָׁה לְהִתְנַגֵד.

לדוגמא, ה preparGet () השיטה תיצור בקשת HTTP GET:

BoundRequestBuilder getRequest = client.prepareGet ("// www.baeldung.com");

4.2. בקשה לא מאוגדת

ניתן ליצור בקשה לא מאוגדת באמצעות RequestBuilder מעמד:

בקש getRequest = RequestBuilder חדש (HttpConstants.Methods.GET) .setUrl ("// www.baeldung.com") .build ();

או באמצעות DSL מעמד עוזר, שמשתמש בפועל ב- RequestBuilder להגדרת התצורה של שיטת ה- HTTP וכתובת האתר של הבקשה:

בקש getRequest = Dsl.get ("// www.baeldung.com"). Build ()

5. ביצוע בקשות HTTP

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

ביצוע הבקשה תלוי בסוג שלה. בעת שימוש ב- בקשה מאוגדת אנו משתמשים ב- לבצע() שיטה מה- BoundRequestBuilder כיתה וכשיש לנו בקשה לא מאוגדת נבצע אותה באמצעות אחת מהיישומים של שיטת executeRequest () מה- AsyncHttpClient מִמְשָׁק.

5.1. באופן סינכרוני

הספריה תוכננה להיות אסינכרונית, אך במידת הצורך נוכל לדמות שיחות סינכרוניות על ידי חסימה על עתיד לְהִתְנַגֵד. שניהם לבצע() ו executeRequest () שיטות להחזיר א האזנה לעתיד לְהִתְנַגֵד. מחלקה זו מרחיבה את Java עתיד ממשק, ובכך יורש את לקבל() שיטה, בה ניתן לחסום את השרשור הנוכחי עד להשלמת בקשת ה- HTTP ומחזירה תגובה:

תגובה עתידית FutureFuture = boundGetRequest.execute (); responseFuture.get ();
ResponseFuture עתידי = client.executeRequest (unboundRequest); responseFuture.get ();

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

5.2. באופן אסינכרוני

כאשר אנו מדברים על הוצאות להורג אסינכרוניות, אנו מדברים גם על מאזינים לעיבוד התוצאות. ספריית AHC מספקת 3 סוגים של מאזינים המשמשים לשיחות HTTP אסינכרוניות:

  • AsyncHandler
  • AsyncCompletionHandler
  • האזנה לעתיד מאזינים

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

request.execute (AsyncHandler חדש () {@ מדינת ציבור ציבורי onStatusReceived (HttpResponseStatus responseStatus) זורק חריג {return null;} @Override public State onHeadersReceived (HttpHeaders headers) זורק חריג {return null;} @Override State state onBodyPartBodyPart זורק Exception {return null;} @Override public void onThrowable (Throwable t) {} @Override public Object onCompleted () זורק Exception {return null;}});

ה מדינה enum מאפשר לנו לשלוט בעיבוד בקשת ה- HTTP. על ידי חזרה מדינה. ABORT אנחנו יכולים להפסיק את העיבוד ברגע מסוים ובאמצעות שימוש מדינה. המשך אנו נותנים לעיבוד להסתיים.

חשוב להזכיר כי AsyncHandler אינו בטוח בחוטים ואין לעשות בו שימוש חוזר בעת ביצוע בקשות במקביל.

AsyncCompletionHandler יורש את כל השיטות מה- AsyncHandler ממשק ומוסיף את onCompleted (תגובה) שיטת עוזר לטיפול בהשלמת השיחה. כל שיטות המאזין האחרות נדרשות להחזרה מדינה.המשך, ובכך הופך את הקוד לקריא יותר:

request.execute (AsyncCompletionHandler חדש () {@Override public Object onCompleted (תגובה של תגובה) זורק חריג {תגובה חזרה;}});

ה האזנה לעתיד ממשק מאפשר לנו להוסיף מאזינים שיפעלו לאחר סיום שיחת HTTP.

כמו כן, בואו נבצע את הקוד מהמאזינים - באמצעות מאגר שרשורים אחר:

ListenableFuture listenableFuture = לקוח .executeRequest (unboundRequest); listenableFuture.addListener (() -> {Response response = listenableFuture.get (); LOG.debug (response.getStatusCode ());}, Executors.newCachedThreadPool ());

חוץ מזה, האפשרות להוסיף מאזינים, ה- האזנה לעתיד ממשק מאפשר לנו להפוך את עתיד תגובה ל העתיד.

7. מסקנה

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

כמו תמיד, קוד המקור של המאמר זמין באתר GitHub.


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