Pokročilá konfigurácia HttpClient

1. Prehľad

V tomto článku sa pozrieme na pokročilé použitie Apache HttpClient knižnica.

Pozrime sa na príklady pridania vlastných hlavičiek k požiadavkám HTTP a uvidíme, ako nakonfigurovať klienta na autorizáciu a odosielanie požiadaviek cez proxy server.

Na zablokovanie servera HTTP budeme používať Wiremock. Ak si chcete o Wiremock prečítať viac, prečítajte si tento článok.

2. Žiadosť HTTP s vlastným User-Agent Hlavička

Povedzme, že chceme pridať zvyk User-Agent hlavička na požiadavku HTTP GET. The User-Agent hlavička obsahuje charakteristický reťazec, ktorý umožňuje partnerom v sieťovom protokole identifikovať typ aplikácie, operačný systém a dodávateľa softvéru alebo verziu softvéru žiadajúceho agenta používateľa softvéru.

Predtým, ako začneme písať nášho klienta HTTP, musíme spustiť náš vložený falošný server:

@Rule public WireMockRule serviceMock = nové WireMockRule (8089);

Keď vytvárame HttpGet inštanciu môžeme jednoducho použiť a setHeader () metóda na odovzdanie názvu našej hlavičky spolu s hodnotou. Táto hlavička bude pridaná k požiadavke HTTP:

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

Pridávame a User-Agent hlavičku a odoslanie žiadosti prostredníctvom vykonať () metóda.

Keď sa odošle žiadosť GET o adresu URL / detail s hlavičkou User-Agent ktorá má potom hodnotu rovnajúcu sa „BaeldungAgent / 1.0“ serviceMock vráti 200 kód odpovede HTTP:

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

3. Odosielanie údajov do tela žiadosti POST

Zvyčajne, keď vykonávame metódu HTTP POST, chceme odovzdať entitu ako telo žiadosti. Pri vytváraní inštancie a HttpPost objektu, môžeme pridať telo k tejto žiadosti pomocou a setEntity () metóda:

Reťazec xmlBody = "1"; HttpClient httpClient = HttpClients.createDefault (); HttpPost httpPost = nový HttpPost ("// localhost: 8089 / osoba"); httpPost.setHeader ("Content-Type", "application / xml"); StringEntity xmlEntity = nový StringEntity (xmlBody); httpPost.setEntity (xmlEntity); HttpResponse response = httpClient.execute (httpPost); assertEquals (response.getStatusLine (). getStatusCode (), 200);

Vytvárame StringEntity napríklad s orgánom, ktorý je v XML formát. Je dôležité nastaviť Druh obsahu hlavička do “prihláška / xml”Na odovzdanie informácií serveru o type obsahu, ktorý odosielame. Keď serviceMock prijme požiadavku POST s telom XML, odpovie stavovým kódom 200 OK:

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

4. Posielanie požiadaviek cez Proxy Server

Naša webová služba často môže byť za proxy serverom ktorý vykonáva ďalšiu logiku, ukladá do pamäti statické prostriedky atď. Keď vytvárame klienta HTTP a odosielame požiadavku na skutočnú službu, nechceme to riešiť pri každej žiadosti HTTP.

Na otestovanie tohto scenára budeme musieť spustiť ďalší zabudovaný webový server:

@Rule public WireMockRule proxyMock = nové WireMockRule (8090);

S dvoma zabudovanými servermi je prvá skutočná služba na porte 8089 a server proxy počúva na porte 8090.

Konfigurujeme naše HttpClient na odoslanie všetkých požiadaviek cez proxy vytvorením a DefaultProxyRoutePlanner to trvá HttpHost inštancia proxy ako argument:

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

Náš server proxy presmerúva všetky požiadavky na skutočnú službu, ktorá počúva na porte 8090. Na konci testu overíme, či bola žiadosť odoslaná našej skutočnej službe prostredníctvom servera proxy:

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. Konfigurácia klienta HTTP na autorizáciu prostredníctvom servera proxy

V rozšírení predchádzajúceho príkladu existujú niektoré prípady, keď sa na vykonávanie autorizácie používa proxy server. V takejto konfigurácii môže server proxy autorizovať všetky požiadavky a odoslať ich na server, ktorý je skrytý za serverom proxy.

Môžeme nakonfigurovať HttpClient tak, aby posielal každú požiadavku cez proxy spolu s Povolenie hlavička, ktorá sa použije na vykonanie autorizačného procesu.

Predpokladajme, že máme proxy server, ktorý autorizuje iba jedného používateľa - “username_admin, s heslom “tajné_heslo.

Musíme vytvoriť BasicCredentialsProvider napríklad s povereniami používateľa, ktorý bude autorizovaný prostredníctvom servera proxy. Vyrobiť HttpClient automaticky pridať Povolenie hlavičku so správnou hodnotou, musíme vytvoriť a HttpClientContext s poskytnutými povereniami a BasicAuthCache ktorý ukladá poverenia:

HttpHost proxy = nový HttpHost ("localhost", 8090); DefaultProxyRoutePlanner routePlanner = nový DefaultProxyRoutePlanner (proxy); // Prihlasovacie údaje klienta CredentialsProvider credentialsProvider = new BasicCredentialsProvider (); credentialsProvider.setCredentials (nový AuthScope (proxy), nový UsernamePasswordCredentials ("username_admin", "secret_password")); // Vytvorenie inštancie AuthCache AuthCache authCache = nový BasicAuthCache (); BasicScheme basicAuth = nový BasicScheme (); authCache.put (proxy, basicAuth); HttpClientContext context = HttpClientContext.create (); context.setCredentialsProvider (credentialsProvider); context.setAuthCache (authCache); HttpClient httpclient = HttpClients.custom () .setRoutePlanner (routePlanner) .setDefaultCredentialsProvider (credentialsProvider) .build ();

Keď sme nastavili naše HttpClient, Výsledkom požiadaviek na našu službu bude odoslanie žiadosti prostredníctvom servera proxy s Povolenie hlavička na vykonanie autorizačného procesu. Nastaví sa v každej žiadosti automaticky.

Vykonajme skutočnú požiadavku na službu:

HttpGet httpGet = nový HttpGet ("// localhost: 8089 / private"); HttpResponse response = httpclient.execute (httpGet, kontext);

Overuje sa vykonať () metóda na httpClient s našou konfiguráciou potvrdzuje, že požiadavka prešla cez proxy s Povolenie hlavička:

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 ("Autorizácia", obsahujúca ("Základné"))); serviceMock.verify (getRequestedFor (urlEqualTo ("/ private")));

6. Záver

Tento článok ukazuje, ako nakonfigurovať Apache HttpClient vykonávať pokročilé volania HTTP. Videli sme, ako posielať žiadosti cez proxy server a ako autorizovať cez proxy.

Implementáciu všetkých týchto príkladov a útržkov kódu nájdete v projekte GitHub - jedná sa o projekt Maven, takže by malo byť ľahké ho importovať a spustiť tak, ako je.


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