HttpClient 4 - Kövesse az Átirányításokat a POST szolgáltatáshoz
1. Áttekintés
Ez a gyors bemutató bemutatja, hogyan kell beállítani az Apache HttpClient 4-et, hogy automatikusan kövesse a POST-kérések átirányításait.
Ha mélyebbre akarsz ásni, és további jó dolgokat akarsz megtudni, amit a HttpClient-nel tehetsz - menj tovább a fő HttpClient oktatóanyag.
Alapértelmezés szerint csak az átirányítást eredményező GET kéréseket követi automatikusan. Ha a POST kérésekre bármelyik válasz érkezik HTTP 301 véglegesen áthelyezve vagy azzal 302 Megtalált – az átirányítást nem követi automatikusan.
Ezt a HTTP RFC 2616 határozza meg:
Ha a 301 állapotkód nem GET vagy HEAD kérelemre érkezik, a felhasználói ügynökök NEM KELL automatikusan átirányítani a kérést, hacsak a felhasználó nem tudja megerősíteni, mivel ez megváltoztathatja azokat a feltételeket, amelyek mellett a kérelmet kiadták.
Természetesen vannak olyan esetek, amikor meg kell változtatnunk ezt a viselkedést, és enyhítenünk kell a szigorú HTTP specifikációt.
Először ellenőrizzük az alapértelmezett viselkedést:
@Test public void givenPostRequest_whenConsumingUrlWhichRedirects_thenNotRedirected () dobja a ClientProtocolException, IOException {HttpClient instance = HttpClientBuilder.create (). Build (); HttpResponse response = instance.execute (új HttpPost ("// t.co/I5YYd9tddw")); assertThat (response.getStatusLine (). getStatusCode (), equalTo (301)); }
Amint látod, az átirányítást alapértelmezés szerint nem követi, és visszakapjuk a 301 Állapotkód.
2. Átirányítás a HTTP POST-on
2.1. A HttpClient 4.3 és utána
A HttpClient 4.3-ban magasabb szintű API-t vezettek be mind az ügyfél létrehozása, mind konfigurálása érdekében:
@Test public void givenRedirectingPOST_whenConsumingUrlWhichRedirectsWithPOST_thenRedirected () dobja a ClientProtocolException, IOException {HttpClient instance = HttpClientBuilder.create (). SetRedirectStredegy (new Lax). HttpResponse response = instance.execute (új HttpPost ("// t.co/I5YYd9tddw")); assertThat (response.getStatusLine (). getStatusCode (), equalTo (200)); }
Értesítés a HttpClientBuilder most egy folyékony API kiindulópontja amely lehetővé teszi a kliens teljes konfigurálását az eddigieknél is olvashatóbb módon.
2.2. A HttpClient 4.2 számára
A HttpClient (4.2) előző verziójában közvetlenül az ügyfélen konfigurálhatjuk az átirányítási stratégiát:
@SuppressWarnings ("deprecation") @Test public void givenRedirectingPOST_whenConsumingUrlWhichRedirectsWithPOST_thenRedirected () dobja a ClientProtocolException, IOException {DefaultHttpClient client = new DefaultHttpClient (); client.setRedirectStrategy (új LaxRedirectStrategy ()); HttpResponse response = client.execute (új HttpPost ("// t.co/I5YYd9tddw")); assertThat (response.getStatusLine (). getStatusCode (), equalTo (200)); }
Vegyük észre, hogy most, az újonnan LaxRedirectStrategy, a HTTP-korlátozások enyhülnek és az átirányítást a POST-on keresztül is követik - ami a 200 OK állapotkód.
2.3. Pre HttpClient 4.2
A HttpClient 4.2 előtt a LaxRedirectStrategy osztály nem létezett, ezért meg kell gördítenünk a sajátunkat:
@Test public void givenRedirectingPOST_whenConsumingUrlWhichRedirectsWithPOST_thenRedirected () dobja a ClientProtocolException, IOException {DefaultHttpClient client = new DefaultHttpClient (); client.setRedirectStrategy (új DefaultRedirectStrategy () {/ ** Átirányítható módszerek. * / privát karakterlánc [] REDIRECT_METHODS = új karakterlánc [] {HttpGet.METHOD_NAME, HttpPost.METHOD_NAME, HttpHead.METHOverNAME}; {for (String m: REDIRECT_METHODS) {if (m.equalsIgnoreCase (metódus)) {return true;}} return false;}}); HttpResponse response = client.execute (új HttpPost ("// t.co/I5YYd9tddw")); assertThat (response.getStatusLine (). getStatusCode (), equalTo (200)); }
3. Következtetés
Ez a gyors útmutató bemutatta, hogyan konfigurálható az Apache HttpClient 4 bármely verziója a HTTP POST kérések átirányításainak követésére is - enyhítve a szigorú HTTP szabványt.
Mindezen példák és kódrészletek megvalósítása megtalálható a github projektemben - ez egy Eclipse alapú projekt, ezért könnyen importálhatónak és futtathatónak kell lennie.