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 שלי.


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