HttpClient 4 - שלח קובץ Cookie מותאם אישית
1. סקירה כללית
הדרכה זו תתמקד ב כיצד לשלוח קובץ Cookie מותאם אישית באמצעות Apache HttpClient 4.
אם אתה רוצה להעמיק וללמוד דברים מגניבים אחרים אתה יכול לעשות עם HttpClient - עבור אל הדרכה הראשית של HttpClient.
2. הגדירו את ניהול ה- Cookie ב- HttpClient
2.1. HttpClient לאחר 4.3
ב- HttpClient 4.3 החדש יותר, ננצל את ממשק ה- API הבונה השוטף האחראי על בניית הלקוח והגדרת התצורה שלו.
ראשית, נצטרך ליצור חנות עוגיות ולהגדיר את העוגיה לדוגמה שלנו בחנות:
BasicCookieStore cookieStore = BasicCookieStore חדש (); עוגיית BasicClientCookie = חדשה BasicClientCookie ("JSESSIONID", "1234"); cookie.setDomain (". github.com"); cookie.setPath ("/"); cookieStore.addCookie (עוגיה);
לאחר מכן, אנו יכולים להקים חנות עוגיות זו ב- HttpClient באמצעות ה- setDefaultCookieStore () שיטה ושלח את הבקשה:
@ מבחן ציבורי בטל כאשר הגדרת CookiesOnTheHttpClient_thenCookieSentCorrect () זורק ClientProtocolException, IOException {BasicCookieStore cookieStore = חדש BasicCookieStore (); עוגיית BasicClientCookie = חדשה BasicClientCookie ("JSESSIONID", "1234"); cookie.setDomain (". github.com"); cookie.setPath ("/"); cookieStore.addCookie (עוגיה); לקוח HttpClient = HttpClientBuilder.create (). SetDefaultCookieStore (cookieStore) .build (); בקשת HttpGet סופית = HttpGet חדש ("// www.github.com"); תגובה = client.execute (בקשה); assertThat (response.getStatusLine (). getStatusCode (), equalTo (200)); }
אלמנט חשוב מאוד הוא תְחוּם מוגדר על העוגיה - מבלי לקבוע את הדומיין המתאים, הלקוח לא ישלח את העוגיה בכלל!
כמו כן, בהתאם לגרסה המדויקת בה אתה משתמש, ייתכן שתצטרך גם להגדיר:
cookie.setAttribute (ClientCookie.DOMAIN_ATTR, "נכון");
2.2. HttpClient לפני 4.3
עם גרסאות ישנות יותר של HttpClient (לפני 4.3) - חנות העוגיות הוגדרה ישירות על HttpClient:
@Test הציבור בטל givenUsingDeprecatedApi_whenSettingCookiesOnTheHttpClient_thenCorrect () זורק ClientProtocolException, IOException {BasicCookieStore cookieStore = חדש BasicCookieStore (); עוגיית BasicClientCookie = חדשה BasicClientCookie ("JSESSIONID", "1234"); cookie.setDomain (". github.com"); cookie.setPath ("/"); cookieStore.addCookie (עוגיה); לקוח DefaultHttpClient = חדש DefaultHttpClient (); client.setCookieStore (cookieStore); HttpGet בקשה = HttpGet חדש ("// www.github.com"); תגובה = client.execute (בקשה); assertThat (response.getStatusLine (). getStatusCode (), equalTo (200)); }
מלבד אופן בניית הלקוח, אין הבדל אחר מהדוגמה הקודמת.
3. הגדר את העוגיה על הבקשה
אם הגדרת קובץ ה- cookie על כל HttpClient אינה אפשרות, אנו יכולים להגדיר בקשות עם ה- Cookie בנפרד באמצעות HttpContext מעמד:
@ מבחן פומבי בטל כאשר SetCookiesOnTheRequest_thenCookieSentCorrect () זורק ClientProtocolException, IOException {BasicCookieStore cookieStore = חדש BasicCookieStore (); עוגיית BasicClientCookie = חדשה BasicClientCookie ("JSESSIONID", "1234"); cookie.setDomain (". github.com"); cookie.setPath ("/"); cookieStore.addCookie (עוגיה); מופע = HttpClientBuilder.create (). build (); HttpGet בקשה = HttpGet חדש ("// www.github.com"); HttpContext localContext = חדש BasicHttpContext (); localContext.setAttribute (HttpClientContext.COOKIE_STORE, cookieStore); // localContext.setAttribute (ClientContext.COOKIE_STORE, cookieStore); // לפני 4.3 תגובה = מופע.execute (בקשה, localContext); assertThat (response.getStatusLine (). getStatusCode (), equalTo (200)); }
4. הגדר את העוגיה לבקשה ברמה נמוכה
חלופה ברמה נמוכה של הגדרת קובץ ה- cookie לבקשת HTTP תהיה הגדרת אותו ככותרת גולמית:
@Test ציבורי בטל כאשר הגדרת CookiesOnARequest_thenCorrect () זורק ClientProtocolException, IOException {מופע = HttpClientBuilder.create (). Build (); HttpGet בקשה = HttpGet חדש ("// www.github.com"); request.setHeader ("עוגיה", "JSESSIONID = 1234"); תגובה = מופע. ביצוע (בקשה); assertThat (response.getStatusLine (). getStatusCode (), equalTo (200)); }
זה כמובן הרבה יותר נוטה לשגיאות מאשר לעבוד עם התמיכה המובנית בעוגיות. לדוגמה, שים לב שאנחנו כבר לא מגדירים את הדומיין במקרה זה - וזה לא נכון.
5. מסקנה
מאמר זה המחיש כיצד עבוד עם HttpClient כדי לשלוח קובץ Cookie מותאם אישית ומבוקר.
שים לב שזה לא זהה לתת ל- HttpClient להתמודד עם העוגיות שהוגדרו על ידי שרת. במקום זאת, הוא שולט בצד הלקוח באופן ידני ברמה נמוכה.
את היישום של כל הדוגמאות וקטעי הקוד ניתן למצוא בפרויקט github שלי.