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.