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áltaz á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.