HttpClient 4 - עקוב אחר הפניות מחדש עבור POST

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

הדרכה מהירה זו תראה כיצד להגדיר את Apache HttpClient 4 למעקב אוטומטי אחר הפניות לבקשות POST.

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

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

זה מוגדר על ידי HTTP RFC 2616:

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

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

ראשית, בואו לבדוק את התנהגות ברירת המחדל:

@Test ציבור בטל givenPostRequest_whenConsumingUrlWhRedirects_thenNotRedirected () זורק ClientProtocolException, IOException {מופע HttpClient = HttpClientBuilder.create (). Build (); HttpResponse response = instance.execute (HttpPost חדש ("// t.co/I5YYd9tddw")); assertThat (response.getStatusLine (). getStatusCode (), equalTo (301)); }

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

2. הפניה מחדש ב- HTTP POST

2.1. עבור HttpClient 4.3 ואחריו

ב- HttpClient 4.3, הוצג ממשק API ברמה גבוהה יותר הן ליצירה והן לתצורה של הלקוח:

@Test הציבור בטל givenRedirectingPOST_whenConsumingUrlWichRedirectsWithPOST_thenRedirected () זורק ClientProtocolException, IOException {מופע HttpClient = HttpClientBuilder.create (). SetRedirectStrategy (חדש LaxRedirectStrategy.) HttpResponse response = instance.execute (HttpPost חדש ("// t.co/I5YYd9tddw")); assertThat (response.getStatusLine (). getStatusCode (), equalTo (200)); }

הודעה ה HttpClientBuilder היא כעת נקודת ההתחלה של ממשק API שוטף המאפשר תצורה מלאה של הלקוח בצורה קריאה יותר מבעבר.

2.2. עבור HttpClient 4.2

בגרסה הקודמת של HttpClient (4.2) אנו יכולים להגדיר את אסטרטגיית ההפניה ישירות ללקוח:

@SuppressWarnings ("הוצאת דחיקה") @ מבט הריק הפומבי שניתנה הפניה מחדש POST_whenConsumingUrlWhichRedirectsWithPOST_thenRedirected () זורק ClientProtocolException, IOException {לקוח DefaultHttpClient = DefaultHttpClient חדש) client.setRedirectStrategy (LaxRedirectStrategy חדש ()); HttpResponse response = client.execute (HttpPost חדש ("// t.co/I5YYd9tddw")); assertThat (response.getStatusLine (). getStatusCode (), equalTo (200)); }

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

2.3. טרום HttpClient 4.2

לפני HttpClient 4.2, ה- LaxRedirectStrategy הכיתה לא הייתה קיימת, ולכן עלינו לגלגל בעצמנו:

@Test ציבורי בטל שניתנה הפניה מחדש POST_whenConsumingUrlWhichRedirectsWithPOST_thenRedirected () זורק ClientProtocolException, IOException {DefaultHttpClient client = new DefaultHttpClient (); client.setRedirectStrategy (חדש DefaultRedirectStrategy () {/ ** שיטות ניתנות להפניה מחדש. * / מחרוזת פרטית [] REDIRECT_METHODS = מחרוזת חדשה [] {HttpGet.METHOD_NAME, HttpPost.METHOD_NAME, HttpHead.METHOD_NAME}; {for (String m: REDIRECT_METHODS) {if (m.equalsIgnoreCase (method)) {return true;}} return false;}}); HttpResponse response = client.execute (HttpPost חדש ("// t.co/I5YYd9tddw")); assertThat (response.getStatusLine (). getStatusCode (), equalTo (200)); }

3. מסקנה

מדריך מהיר זה המחיש כיצד להגדיר תצורה של כל גרסה של Apache HttpClient 4 למעקב אחר הפניות לבקשות HTTP POST גם כן - הרפיה בתקן HTTP המחמיר.

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


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