תצורת HttpClient מתקדמת

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

במאמר זה נבחן את השימוש המתקדם באפאצ'י HttpClient סִפְרִיָה.

נבחן את הדוגמאות של הוספת כותרות מותאמות אישית לבקשות HTTP ונראה כיצד להגדיר את הלקוח לאישור ולשלוח בקשות דרך שרת proxy.

אנו נשתמש ב- Wiremock לניקוי שרת ה- HTTP. אם אתה רוצה לקרוא עוד על Wiremock, עיין במאמר זה.

2. בקשת HTTP עם התאמה אישית סוכן משתמש כּוֹתֶרֶת

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

לפני שנתחיל לכתוב את לקוח ה- HTTP שלנו, עלינו להפעיל את שרת המדומה המוטמע שלנו:

@Rule ציבורי WireMockRule serviceMock = WireMockRule חדש (8089);

כשאנחנו יוצרים HttpGet למשל אנו יכולים פשוט להשתמש ב- setHeader () שיטה להעביר שם של הכותרת שלנו יחד עם הערך. כותרת זו תתווסף לבקשת HTTP:

מחרוזת userAgent = "BaeldungAgent / 1.0"; HttpClient httpClient = HttpClients.createDefault (); HttpGet httpGet = new HttpGet ("// localhost: 8089 / detail"); httpGet.setHeader (HttpHeaders.USER_AGENT, userAgent); תגובה HttpResponse = httpClient.execute (httpGet); assertEquals (response.getStatusLine (). getStatusCode (), 200);

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

כאשר בקשת GET נשלחת לכתובת URL /פרט עם כותרת עליונה סוכן משתמש שיש לו ערך השווה ל- "BaeldungAgent / 1.0" אז serviceMock יחזיר 200 תגובת HTTP:

serviceMock.stubFor (get (urlEqualTo ("/ detail")) .withHeader ("User-Agent", equalTo (userAgent)) .willReturn (aResponse (). withStatus (200)));

3. שליחת נתונים בגוף הבקשה של POST

בדרך כלל, כאשר אנו מבצעים את שיטת HTTP POST, אנו רוצים להעביר ישות כגוף בקשה. בעת יצירת מופע של א HttpPost אובייקט, אנו יכולים להוסיף את הגוף לבקשה זו באמצעות a setEntity () שיטה:

מחרוזת xmlBody = "1"; HttpClient httpClient = HttpClients.createDefault (); HttpPost httpPost = HttpPost חדש ("// localhost: 8089 / person"); httpPost.setHeader ("סוג תוכן", "יישום / xml"); StringEntity xmlEntity = חדש StringEntity (xmlBody); httpPost.setEntity (xmlEntity); תגובה HttpResponse = httpClient.execute (httpPost); assertEquals (response.getStatusLine (). getStatusCode (), 200);

אנו יוצרים StringEntity למשל עם גוף שנמצא ב XML פוּרמָט. חשוב להגדיר את סוג תוכן כותרת אל “יישום / xml”להעביר מידע לשרת על סוג התוכן שאנו שולחים. כאשר serviceMock מקבל את בקשת ה- POST עם גוף ה- XML, הוא מגיב עם קוד המצב 200 אישור:

serviceMock.stubFor (post (urlEqualTo ("/ person")) .withHeader ("Content-Type", equalTo ("application / xml")) .withRequestBody (equalTo (xmlBody)) .willReturn (aResponse (). withStatus (200 )));

4. שליחת בקשות באמצעות שרת Proxy

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

כדי לבדוק תרחיש זה, נצטרך להפעיל שרת אינטרנט משובץ אחר:

@Rule ציבורי WireMockRule proxyMock = WireMockRule חדש (8090);

עם שני שרתים משובצים, השירות בפועל הראשון נמצא ביציאת 8089 ושרת proxy מאזין ביציאת 8090.

אנו מגדירים את התצורה שלנו HttpClient לשלוח את כל הבקשות באמצעות פרוקסי על ידי יצירת a DefaultProxyRoutePlanner שלוקח את HttpHost פרוקסי למשל כארגומנט:

Proxy HttpHost = HttpHost חדש ("localhost", 8090); DefaultProxyRoutePlanner routePlanner = DefaultProxyRoutePlanner חדש (proxy); HttpClient httpclient = HttpClients.custom () .setRoutePlanner (routePlanner) .build (); 

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

proxyMock.stubFor (get (urlMatching (". *")) .willReturn (aResponse (). proxiedFrom ("// localhost: 8089 /"))); serviceMock.stubFor (get (urlEqualTo ("/ private")) .willReturn (aResponse (). withStatus (200))); assertEquals (response.getStatusLine (). getStatusCode (), 200); proxyMock.verify (getRequestedFor (urlEqualTo ("/ private"))); serviceMock.verify (getRequestedFor (urlEqualTo ("/ private")));

5. קביעת תצורה של לקוח HTTP לאישור באמצעות Proxy

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

אנו יכולים להגדיר את HttpClient כך שישלח כל בקשה באמצעות proxy, יחד עם ה- הרשאה כותרת שתשמש לביצוע תהליך הרשאה.

נניח שיש לנו שרת proxy שמסמיך רק משתמש אחד - “שם משתמש_מנהל, עם סיסמה “סוד_סיסמה.

עלינו ליצור את BasicCredentialsProvider מופע עם אישורי משתמש שיאושר באמצעות proxy. לעשות HttpClient להוסיף באופן אוטומטי את הרשאה כותרת עם הערך המתאים, עלינו ליצור a HttpClientContext עם אישורים שסופקו ו BasicAuthCache המאחסן אישורים:

Proxy HttpHost = HttpHost חדש ("localhost", 8090); DefaultProxyRoutePlanner routePlanner = DefaultProxyRoutePlanner חדש (proxy); // אישורי לקוח CredentialsProvider credentialsProvider = חדש BasicCredentialsProvider (); credentialsProvider.setCredentials (AuthScope חדש (פרוקסי), UsernamePasswordCredentials חדש ("username_admin", "secret_password")); // צור מופע AuthCache AuthCache authCache = חדש BasicAuthCache (); BasicScheme basicAuth = חדש BasicScheme (); authCache.put (proxy, basicAuth); HttpClientContext context = HttpClientContext.create (); context.setCredentialsProvider (credentialsProvider); context.setAuthCache (authCache); HttpClient httpclient = HttpClients.custom () .setRoutePlanner (routePlanner) .setDefaultCredentialsProvider (credentialsProvider) .build ();

כשאנחנו מקימים את שלנו HttpClient, הגשת בקשות לשירות שלנו תביא לשליחת בקשה באמצעות proxy עם הרשאה כותרת לביצוע תהליך הרשאה. זה ייקבע בכל בקשה באופן אוטומטי.

בוא נבצע בקשה בפועל לשירות:

HttpGet httpGet = new HttpGet ("// localhost: 8089 / private"); תגובה HttpResponse = httpclient.execute (httpGet, הקשר);

מאמת לבצע() שיטה על httpClient עם התצורה שלנו מאשר כי בקשה עברה פרוקסי עם הרשאה כּוֹתֶרֶת:

proxyMock.stubFor (get (urlMatching ("/ private")) .willReturn (aResponse (). proxiedFrom ("// localhost: 8089 /"))); serviceMock.stubFor (get (urlEqualTo ("/ private")) .willReturn (aResponse (). withStatus (200))); assertEquals (response.getStatusLine (). getStatusCode (), 200); proxyMock.verify (getRequestedFor (urlEqualTo ("/ private")) .withHeader ("Authorization", המכיל ("Basic"))); serviceMock.verify (getRequestedFor (urlEqualTo ("/ private")));

6. מסקנה

מאמר זה מראה כיצד להגדיר את ה- Apache HttpClient לביצוע שיחות HTTP מתקדמות. ראינו כיצד לשלוח בקשות דרך שרת proxy וכיצד לאשר באמצעות proxy.

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


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