באמצעות מיירט האביב RestTemplate

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

במדריך זה נלמד כיצד ליישם אביב RestTemplateמיירט.

נעבור דוגמה בה ניצור מיירט שמוסיף כותרת מותאמת אישית לתגובה.

2. תרחישים לשימוש מיירט

מלבד שינוי הכותרת הראשית, חלק ממקרי השימוש האחרים שבהם א RestTemplate מיירט יעיל הם:

  • רישום בקשות ותגובות
  • מנסה שוב את הבקשות עם אסטרטגיית ניתוק להגדרה
  • בקש דחייה על סמך פרמטרים מסוימים של בקשה
  • שינוי כתובת ה- URL של הבקשה

3. יצירת המיירט

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

אביב RestTemplate מאפשר לנו להוסיף מיירטים המיישמים ClientHttpRequestInterceptor מִמְשָׁק. ה יירוט (HttpRequest, בייט [], ClientHttpRequestExecution) שיטה של ​​ממשק זה תיירט את הבקשה שניתנה ותחזיר את התגובה בכך שתיתן לנו גישה ל- בַּקָשָׁה, גוּף ו ביצוע חפצים.

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

כצעד ראשון, בואו ליצור כיתת יירוט שמיישמת את ה- ClientHttpRequestInterceptor מִמְשָׁק:

מחלקה ציבורית RestTemplateHeaderModifierInterceptor מיישם את ClientHttpRequestInterceptor {@Override Public ClientHttpResponse יירוט (HttpRequest בקשה, בתים [] גוף, ClientHttpRequestExecution ביצוע) זורק IOException {ClientHttpResponse תגובה = ביצוע.execute (בקשה, גוף); response.getHeaders (). הוסף ("Foo", "bar"); תגובה חזרה; }}

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

מאז לעכב() השיטה כללה את בַּקָשָׁה ו גוּף כטיעונים, ניתן גם לבצע כל שינוי בבקשה או אפילו לדחות את ביצוע הבקשה על סמך תנאים מסוימים.

4. הגדרת ה- RestTemplate

עכשיו כשיצרנו את המיירט שלנו, בואו ניצור את RestTemplate שעועית והוסף את המיירט שלנו אליו:

@Configuration public class RestClientConfig {@Bean public RestTemplate restTemplate () {RestTemplate restTemplate = RestTemplate חדש (); מיירטים רשימה = restTemplate.getInterceptors (); אם (CollectionUtils.isEmpty (מיירטים)) {מיירטים = ArrayList חדש (); } interceptors.add (RestTemplateHeaderModifierInterceptor חדש ()); restTemplate.setInterceptors (מיירטים); להחזיר restTemplate; }}

במקרים מסוימים, ייתכן שמיירטים כבר נוספו ל RestTemplate לְהִתְנַגֵד. אז כדי לוודא שהכל עובד כמצופה, הקוד שלנו יאותחל את רשימת המיירט רק אם הוא ריק.

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

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

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

הנה איך RestTemplate האובייקט מאותחל באמצעות BufferingClientHttpRequestFactory כדי לאפשר שמירת זרם בקשה / תגובה:

RestTemplate restTemplate = RestTemplate חדש (BufferingClientHttpRequestFactory חדש (חדש SimpleClientHttpRequestFactory ()));

5. בחינת הדוגמה שלנו

הנה מקרה הבדיקה של JUnit לבדיקת שלנו RestTemplate מיירט:

מחלקה ציבורית RestTemplateItegrationTest {@Autowired RestTemplate restTemplate; @Test הציבור בטל שניתןRestTemplate_whenRequested_thenLogAndModifyResponse () {LoginForm loginForm = חדש LoginForm ("שם משתמש", "סיסמה"); HttpEntity requestEntity = HttpEntity חדש (loginForm); כותרות HttpHeaders = HttpHeaders חדשות (); headers.setContentType (MediaType.APPLICATION_JSON); ResponseEntity responseEntity = restTemplate.postForEntity ("//httpbin.org/post", requestEntity, String.class); assertThat (responseEntity.getStatusCode (), הוא (שווה ל- (HttpStatus.OK))); assertThat (responseEntity.getHeaders (). get ("Foo"). get (0), is (equalTo ("bar"))); }}

כאן השתמשנו בבקשת HTTP ושירות התגובה המתארח באופן חופשי //httpbin.orgלפרסם את הנתונים שלנו. שירות בדיקות זה יחזיר את גוף הבקשה שלנו יחד עם כמה מטא נתונים.

6. מסקנה

מדריך זה מתייחס לכל אופן כיצד להגדיר מיירט ולהוסיף אותו ל- RestTemplate לְהִתְנַגֵד. מיירטים מסוג זה יכולים לשמש גם לסינון, ניטור ובקרה של הבקשות הנכנסות.

מקרה שימוש נפוץ עבור א RestTemplate מיירט הוא שינוי הכותרת - אותה הדגמנו בפירוט במאמר זה.

וכמו תמיד, תוכל למצוא את קוד הדוגמה בפרויקט Github. זהו פרויקט מבוסס Maven, כך שיהיה קל לייבא ולהפעיל אותו כפי שהוא.