Avanceret HttpClient-konfiguration

1. Oversigt

I denne artikel vil vi se på den avancerede brug af Apache HttpClient bibliotek.

Vi ser på eksemplerne på tilføjelse af brugerdefinerede overskrifter til HTTP-anmodninger, og vi ser, hvordan vi konfigurerer klienten til at godkende og sende anmodninger via en proxyserver.

Vi bruger Wiremock til at stubbe HTTP-serveren. Hvis du vil læse mere om Wiremock, skal du tjekke denne artikel.

2. HTTP-anmodning med en brugerdefineret Brugeragent Header

Lad os sige, at vi vil tilføje en brugerdefineret Brugeragent header til en HTTP GET-anmodning. Det Brugeragent header indeholder en karakteristisk streng, der giver netværksprotokol-peers mulighed for at identificere applikationstype, operativsystem og softwareleverandør eller softwareversion af den anmodende softwarebrugeragent.

Før vi begynder at skrive vores HTTP-klient, skal vi starte vores integrerede mock-server:

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

Når vi opretter en HttpGet eksempel kan vi simpelthen bruge en setHeader () metode til at videregive et navn på vores overskrift sammen med værdien. Denne overskrift føjes til en HTTP-anmodning:

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

Vi tilføjer en Brugeragent header og sende den anmodning via en udføre () metode.

Når GET-anmodning sendes til en URL /detalje med overskrift Brugeragent der har en værdi lig med "BaeldungAgent / 1.0" serviceMock returnerer 200 HTTP-svarskode:

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

3. Afsendelse af data til POST-anmodningsorganet

Normalt, når vi udfører HTTP POST-metoden, vil vi sende en enhed som et anmodningsorgan. Når du opretter en forekomst af en HttpPost objekt, kan vi føje kroppen til den anmodning ved hjælp af en setEntity () metode:

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

Vi skaber en StringEntity eksempel med en krop, der er i XML format. Det er vigtigt at indstille Indholdstype overskrift til “applikation / xml”For at videregive oplysninger til serveren om den type indhold, vi sender. Når serviceMock modtager POST-anmodningen med XML-krop, den svarer med statuskode 200 OK:

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

4. Afsendelse af anmodninger via en proxyserver

Ofte kan vores webservice være bag en proxyserver der udfører yderligere logik, cacher statiske ressourcer osv. Når vi opretter HTTP-klienten og sender en anmodning til en faktisk tjeneste, ønsker vi ikke at håndtere det på hver eneste HTTP-anmodning.

For at teste dette scenario skal vi starte en anden integreret webserver:

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

Med to integrerede servere er den første faktiske tjeneste i 8089-porten, og en proxyserver lytter på 8090-porten.

Vi konfigurerer vores HttpClient at sende alle anmodninger via proxy ved at oprette en StandardProxyRoutePlanner der tager HttpHost eksempel proxy som argument:

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

Vores proxyserver omdirigerer alle anmodninger til den faktiske tjeneste, der lytter til 8090-porten. I slutningen af ​​testen bekræfter vi, at anmodningen blev sendt til vores faktiske tjeneste via en proxy:

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

5. Konfiguration af HTTP-klienten til godkendelse via proxy

Ved at udvide det foregående eksempel er der nogle tilfælde, hvor proxyserveren bruges til at udføre autorisation. I en sådan konfiguration kan en proxy godkende alle anmodninger og sende dem til serveren, der er skjult bag en proxy.

Vi kan konfigurere HttpClient til at sende hver anmodning via proxy sammen med Bemyndigelse header, der vil blive brugt til at udføre en godkendelsesproces.

Antag, at vi har en proxyserver, der kun autoriserer en bruger - “brugernavn_admin, med en adgangskode “secret_password.

Vi er nødt til at skabe BasicCredentialsProvider instans med brugeroplysninger, der vil blive autoriseret via proxy. At lave HttpClient automatisk tilføje Bemyndigelse header med den rette værdi, skal vi oprette en HttpClientContext med legitimationsoplysninger og a BasicAuthCache der gemmer legitimationsoplysninger:

HttpHost proxy = ny HttpHost ("localhost", 8090); DefaultProxyRoutePlanner routePlanner = ny DefaultProxyRoutePlanner (proxy); // Client credentials CredentialsProvider credentialsProvider = new BasicCredentialsProvider (); credentialsProvider.setCredentials (nyt AuthScope (proxy), nyt UsernamePasswordCredentials ("brugernavn_admin", "hemmeligt_passord")); // Opret AuthCache-forekomst AuthCache authCache = ny BasicAuthCache (); BasicScheme basicAuth = ny BasicScheme (); authCache.put (proxy, basicAuth); HttpClientContext context = HttpClientContext.create (); context.setCredentialsProvider (credentialsProvider); context.setAuthCache (authCache); HttpClient httpclient = HttpClients.custom () .setRoutePlanner (routePlanner) .setDefaultCredentialsProvider (credentialsProvider) .build ();

Når vi opretter vores HttpClient, fremsættelse af anmodninger til vores service vil resultere i at sende en anmodning via proxy med en Bemyndigelse header for at udføre godkendelsesprocessen. Det indstilles automatisk i hver anmodning.

Lad os udføre en faktisk anmodning til tjenesten:

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

Bekræftelse af en udføre () metode til httpKlient med vores konfiguration bekræfter, at en anmodning gik gennem en proxy med en Bemyndigelse header:

proxyMock.stubFor (get (urlMatching ("/ private")) .willReturn (aResponse (). proxiedFrom ("// localhost: 8089 /"))); serviceMock.stubFor (get (urlEqualTo ("/ private")) .willReturn (aResponse (). withStatus (200))); assertEquals (respons.getStatusLine (). getStatusCode (), 200); proxyMock.verify (getRequestedFor (urlEqualTo ("/ private")) .withHeader ("Autorisation", der indeholder ("Basic"))); serviceMock.verify (getRequestedFor (urlEqualTo ("/ private")));

6. Konklusion

Denne artikel viser, hvordan du konfigurerer Apache HttpClient for at udføre avancerede HTTP-opkald. Vi så, hvordan man sender anmodninger via en proxyserver, og hvordan man autoriserer via proxy.

Implementeringen af ​​alle disse eksempler og kodestykker findes i GitHub-projektet - dette er et Maven-projekt, så det skal være let at importere og køre, som det er.


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