Napredna konfiguracija HttpClienta

1. Pregled

U ovom ćemo članku razmotriti naprednu uporabu Apachea HttpClient knjižnica.

Razmotrit ćemo primjere dodavanja prilagođenih zaglavlja HTTP zahtjevima i vidjet ćemo kako konfigurirati klijenta da autorizira i šalje zahtjeve putem proxy poslužitelja.

Koristit ćemo Wiremock za zaglušivanje HTTP poslužitelja. Ako želite pročitati više o Wiremocku, pogledajte ovaj članak.

2. HTTP zahtjev s prilagođenim Korisnički agent Zaglavlje

Recimo da želimo dodati običaj Korisnički agent zaglavlje HTTP GET zahtjeva. The Korisnički agent zaglavlje sadrži karakteristični niz koji omogućava mrežnim protokolima da identificiraju vrstu aplikacije, operativni sustav i dobavljača softvera ili verziju softvera korisnika softvera koji zahtjeva zahtjev.

Prije nego što počnemo pisati svoj HTTP klijent, moramo pokrenuti naš ugrađeni lažni poslužitelj:

@Rule public WireMockRule serviceMock = novo WireMockRule (8089);

Kada stvaramo HttpGet primjerice možemo jednostavno koristiti a setHeader () metoda za prosljeđivanje imena našeg zaglavlja zajedno s vrijednošću. To će se zaglavlje dodati HTTP zahtjevu:

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

Dodajemo a Korisnički agent zaglavlje i slanje tog zahtjeva putem izvršiti() metoda.

Kada se GET zahtjev pošalje za URL /detalj sa zaglavljem Korisnički agent koja tada ima vrijednost jednaku "BaeldungAgent / 1.0" serviceMock vratit će 200 HTTP koda odgovora:

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

3. Slanje podataka u tijelu zahtjeva za POST

Obično, kada izvršavamo HTTP POST metodu, želimo entitet proslijediti kao tijelo zahtjeva. Prilikom izrade instance a HttpPost objekt, možemo dodati tijelo tom zahtjevu pomoću a setEntity () metoda:

Niz xmlBody = "1"; HttpClient httpClient = HttpClients.createDefault (); HttpPost httpPost = novi HttpPost ("// localhost: 8089 / person"); httpPost.setHeader ("Content-Type", "application / xml"); StringEntity xmlEntity = novi StringEntity (xmlBody); httpPost.setEntity (xmlEntity); HttpResponse odgovor = httpClient.execute (httpPost); assertEquals (response.getStatusLine (). getStatusCode (), 200);

Mi stvaramo StringEntity primjer s tijelom koje se nalazi u XML format. Važno je postaviti Vrsta sadržaja zaglavlje na “aplikacija / xml”Za prosljeđivanje podataka poslužitelju o vrsti sadržaja koji šaljemo. Kada serviceMock primi POST zahtjev s XML tijelom, on odgovara statusnim kodom 200 OK:

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

4. Slanje zahtjeva putem proxy poslužitelja

Naša web usluga često može biti iza proxy poslužitelja koji izvodi neku dodatnu logiku, predmemorira statičke resurse itd. Kada stvaramo HTTP klijenta i šaljemo zahtjev stvarnoj službi, ne želimo se time baviti na svakom HTTP zahtjevu.

Da bismo testirali ovaj scenarij, morat ćemo pokrenuti drugi ugrađeni web poslužitelj:

@Rule public WireMockRule proxyMock = novo WireMockRule (8090);

S dva ugrađena poslužitelja, prva stvarna usluga je na luci 8089, a proxy poslužitelj sluša na luci 8090.

Konfiguriramo svoj HttpClient za slanje svih zahtjeva putem proxyja stvaranjem a DefaultProxyRoutePlanner to traje HttpHost instance proxy kao argument:

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

Naš proxy poslužitelj preusmjerava sve zahtjeve na stvarnu uslugu koja sluša na priključku 8090. Na kraju testa provjeravamo je li zahtjev poslan našoj stvarnoj službi putem proxyja:

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 (getRequestFor (urlEqualTo ("/ private"))); serviceMock.verify (getRequestFor (urlEqualTo ("/ private")));

5. Konfiguriranje HTTP klijenta za autorizaciju putem proxyja

Proširujući prethodni primjer, postoje neki slučajevi kada se proxy poslužitelj koristi za izvršavanje autorizacije. U takvoj konfiguraciji proxy može autorizirati sve zahtjeve i proslijediti ih poslužitelju koji je skriven iza proxyja.

Možemo konfigurirati HttpClient za slanje svakog zahtjeva putem proxyja, zajedno s Ovlaštenje zaglavlje koje će se koristiti za izvršavanje postupka autorizacije.

Pretpostavimo da imamo proxy poslužitelj koji autorizira samo jednog korisnika - “korisničko ime_admin, s lozinkom “tajna_ lozinka.

Moramo stvoriti BasicCredentialsProvider primjer s vjerodajnicama korisnika koje će biti ovlaštene putem proxyja. Napraviti HttpClient automatski dodaj Ovlaštenje zaglavlje s odgovarajućom vrijednošću, moramo stvoriti HttpClientContext s priloženim vjerodajnicama i a BasicAuthCache koja pohranjuje vjerodajnice:

HttpHost proxy = novi HttpHost ("localhost", 8090); DefaultProxyRoutePlanner routePlanner = novi DefaultProxyRoutePlanner (proxy); // Klijentske vjerodajnice CredentialsProvider credentialsProvider = novi BasicCredentialsProvider (); credentialsProvider.setCredentials (novi AuthScope (proxy), novi UsernamePasswordCredentials ("username_admin", "secret_password")); // Stvaranje AuthCache instance AuthCache authCache = new BasicAuthCache (); BasicScheme basicAuth = novi BasicScheme (); authCache.put (proxy, basicAuth); HttpClientContext context = HttpClientContext.create (); context.setCredentialsProvider (credentialsProvider); context.setAuthCache (authCache); HttpClient httpclient = HttpClients.custom () .setRoutePlanner (routePlanner) .setDefaultCredentialsProvider (credentialsProvider) .build ();

Kad smo postavili svoj HttpClient, podnošenje zahtjeva našoj službi rezultirat će slanjem zahtjeva putem proxyja s Ovlaštenje zaglavlje za izvođenje postupka autorizacije. Bit će postavljen u svakom zahtjevu automatski.

Izvršimo stvarni zahtjev za uslugom:

HttpGet httpGet = novi HttpGet ("// localhost: 8089 / private"); HttpResponse odgovor = httpclient.execute (httpGet, kontekst);

Potvrđivanje izvršiti() metoda na httpClient s našom konfiguracijom potvrđuje da je zahtjev prošao putem proxyja s Ovlaštenje Zaglavlje:

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 (getRequestFor (urlEqualTo ("/ private")) .withHeader ("Autorizacija", sadrži ("Basic"))); serviceMock.verify (getRequestFor (urlEqualTo ("/ private")));

6. Zaključak

Ovaj članak pokazuje kako konfigurirati Apache HttpClient za obavljanje naprednih HTTP poziva. Vidjeli smo kako slati zahtjeve putem proxy poslužitelja i kako autorizirati putem proxyja.

Provedbu svih ovih primjera i isječaka koda možete pronaći u projektu GitHub - ovo je Maven projekt, pa bi ga trebalo lako uvesti i pokrenuti kakav jest.


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