Speciális HttpClient konfiguráció

1. Áttekintés

Ebben a cikkben megvizsgáljuk az Apache speciális használatát HttpClient könyvtár.

Megnézzük az egyedi fejlécek hozzáadását a HTTP-kérésekhez, és megtudjuk, hogyan lehet az ügyfelet beállítani a proxykiszolgálón keresztüli kérések engedélyezésére és küldésére.

A Wiremock-ot fogjuk használni a HTTP-kiszolgáló elrontásához. Ha többet szeretne tudni a Wiremockról, nézze meg ezt a cikket.

2. HTTP-kérés egy egyedi esetén User-Agent Fejléc

Tegyük fel, hogy hozzá akarunk adni egy egyéni beállítást User-Agent fejléc egy HTTP GET kéréshez. A User-Agent a fejléc tartalmaz egy karakterláncot, amely lehetővé teszi a hálózati protokolltársak számára, hogy azonosítsák az alkalmazás típusát, az operációs rendszert és a szoftvergyártót vagy a kérelmező szoftver felhasználói ügynök szoftver verzióját.

Mielőtt elkezdenénk írni a HTTP kliensünket, el kell indítanunk a beágyazott álkiszolgálónkat:

@Rule public WireMockRule serviceMock = új WireMockRule (8089);

Amikor létrehozunk egy HttpGet például egyszerűen használhatunk egy setHeader () metódus a fejléc nevének továbbításához az értékkel együtt. Ez a fejléc hozzáadódik egy HTTP-kérelemhez:

String userAgent = "BaeldungAgent / 1.0"; HttpClient httpClient = HttpClients.createDefault (); HttpGet httpGet = new HttpGet ("// localhost: 8089 / detail"); httpGet.setHeader (HttpHeaders.USER_AGENT, userAgent); HttpResponse response = httpClient.execute (httpGet); assertEquals (response.getStatusLine (). getStatusCode (), 200);

Hozzáadunk egy User-Agent fejléc és a kérés elküldése egy végrehajtani () módszer.

Amikor GET kérést küldünk egy URL-re /Részlet fejléccel User-Agent amelynek értéke akkor egyenlő a „BaeldungAgent / 1.0” értékkel serviceMock 200 HTTP válaszkódot ad vissza:

serviceMock.stubFor (get (urlEqualTo ("/ detail")) .withHeader ("User-Agent", equalTo (userAgent)) .willReturn (aResponse (). withStatus (200)));

3. Adatok küldése a POST kérelem törzsében

Általában a HTTP POST metódus végrehajtásakor egy entitást akarunk átadni kérelem törzsként. Az a HttpPost objektumhoz hozzáadhatjuk a törzset ehhez a kéréshez az a használatával setEntity () módszer:

Karakterlánc xmlBody = "1"; HttpClient httpClient = HttpClients.createDefault (); HttpPost httpPost = new HttpPost ("// localhost: 8089 / fő"); httpPost.setHeader ("Tartalom-típus", "alkalmazás / xml"); StringEntity xmlEntity = új StringEntity (xmlBody); httpPost.setEntity (xmlEntity); HttpResponse response = httpClient.execute (httpPost); assertEquals (response.getStatusLine (). getStatusCode (), 200);

Készítünk egy StringEntity például egy testtel, amely a XML formátum. Fontos beállítani a Tartalom típus fejlécapplication / xml”, Hogy információkat továbbítsunk a kiszolgálónak a küldött tartalom típusáról. Amikor az serviceMock XML törzszel fogadja a POST kérést, 200 állapotkóddal válaszol: OK:

serviceMock.stubFor (post (urlEqualTo ("/ személy")) .withHeader ("Content-Type", equalTo ("application / xml")) .withRequestBody (equalTo (xmlBody)) .willReturn (aResponse (). withStatus (200) )));

4. Kérelmek küldése proxy szerveren keresztül

Webszolgáltatásunk gyakran az lehet egy proxy szerver mögött amely további logikát hajt végre, statikus erőforrásokat tárol. stb. Amikor létrehozzuk a HTTP klienst és kérést küldünk egy tényleges szolgáltatásnak, nem akarunk ezzel foglalkozni minden egyes HTTP kérésnél.

A forgatókönyv teszteléséhez el kell indítanunk egy másik beágyazott webszervert:

@Rule public WireMockRule proxyMock = új WireMockRule (8090);

Két beágyazott szerverrel az első tényleges szolgáltatás a 8089-es, egy proxy-szerver pedig a 8090-es porton van.

Konfiguráljuk a HttpClient hogy minden kérést proxy útján küldjön a DefaultProxyRoutePlanner hogy veszi a HttpHost példány proxy mint argumentum:

HttpHost proxy = új HttpHost ("localhost", 8090); DefaultProxyRoutePlanner routePlanner = új DefaultProxyRoutePlanner (proxy); HttpClient httpclient = HttpClients.custom () .setRoutePlanner (routePlanner) .build (); 

Proxykiszolgálónk minden kérést átirányít a 8090-es portot figyelő tényleges szolgáltatásra. A teszt végén ellenőrizzük, hogy a kérést proxy-n keresztül küldtük el tényleges szolgáltatásunknak:

proxyMock.stubFor (get (urlMatching (". *")) .willReturn (aResponse (). proxiedFrom ("// localhost: 8089 /"))); serviceMock.stubFor (get (urlEqualTo ("/ private")) .willReturn (aResponse (). withStatus (200))); assertEquals (response.getStatusLine (). getStatusCode (), 200); proxyMock.verify (getRequestedFor (urlEqualTo ("/ private"))); serviceMock.verify (getRequestedFor (urlEqualTo ("/ private")));

5. A HTTP-ügyfél konfigurálása proxy útján történő engedélyezésre

Az előző példát kibővítve, vannak olyan esetek, amikor a proxy szervert használják az engedélyezésre. Ilyen konfigurációban a proxy engedélyezheti az összes kérést, és továbbíthatja azokat a kiszolgálónak, amely rejtve van a proxy mögött.

Beállíthatjuk a HttpClient úgy, hogy minden kérést proxy útján küldjön, a Engedélyezés fejléc, amelyet az engedélyezési folyamat végrehajtására használnak.

Tegyük fel, hogy van egy proxy szerverünk, amely csak egy felhasználót engedélyez -felhasználónév_admin, jelszóval “titkos jelszó.

Létre kell hoznunk a BasicCredentialsProvider példány a proxy segítségével engedélyezett felhasználó hitelesítő adataival. Csinálni HttpClient automatikusan hozzáadja a Engedélyezés fejlécet a megfelelő értékkel, létre kell hoznunk a HttpClientContext megadott hitelesítő adatokkal és a BasicAuthCache amely tárolja a hitelesítő adatokat:

HttpHost proxy = új HttpHost ("localhost", 8090); DefaultProxyRoutePlanner routePlanner = új DefaultProxyRoutePlanner (proxy); // Ügyfél hitelesítő adatok CredentialsProvider credentialsProvider = új BasicCredentialsProvider (); credentialsProvider.setCredentials (új AuthScope (proxy), új UsernamePasswordCredentials ("felhasználónév_admin", "titkos_jelszó")); // AuthCache példány létrehozása AuthCache authCache = új BasicAuthCache (); BasicScheme basicAuth = új BasicScheme (); authCache.put (proxy, basicAuth); HttpClientContext context = HttpClientContext.create (); context.setCredentialsProvider (credentialsProvider); context.setAuthCache (authCache); HttpClient httpclient = HttpClients.custom () .setRoutePlanner (routePlanner) .setDefaultCredentialsProvider (credentialsProvider) .build ();

Amikor felállítottuk HttpClient, A szolgáltatásunkhoz intézett kérelmek azt eredményezik, hogy egy kérést proxy útján küldünk egy Engedélyezés fejléc az engedélyezési folyamat végrehajtásához. Minden kérelem automatikusan beállítja.

Végezzünk egy tényleges kérést a szolgáltatáshoz:

HttpGet httpGet = new HttpGet ("// localhost: 8089 / private"); HttpResponse response = httpclient.execute (httpGet, context);

An. Ellenőrzése végrehajtani () módszer a httpClient konfigurációnkkal megerősíti, hogy egy kérés egy proxy-val ment keresztül egy Engedélyezés fejléc:

proxyMock.stubFor (get (urlMatching ("/ private")) .willReturn (aResponse (). proxiedFrom ("// localhost: 8089 /"))); serviceMock.stubFor (get (urlEqualTo ("/ private")) .willReturn (aResponse (). withStatus (200))); assertEquals (response.getStatusLine (). getStatusCode (), 200); proxyMock.verify (getRequestedFor (urlEqualTo ("/ private")) .withHeader ("Engedélyezés", amely tartalmazza ("Basic"))); serviceMock.verify (getRequestedFor (urlEqualTo ("/ private")));

6. Következtetés

Ez a cikk bemutatja az Apache konfigurálását HttpClient speciális HTTP hívások végrehajtására. Láttuk, hogyan küldhetünk kéréseket proxy szerveren keresztül, és hogyan engedélyezhetjük proxy-n keresztül.

Ezeknek a példáknak és kódrészleteknek a megvalósítása megtalálható a GitHub projektben - ez egy Maven projekt, ezért könnyen importálhatónak és futtathatónak kell lennie.