高度なHttpClient構成

1。概要

この記事では、ApacheHttpClientライブラリの高度な使用法について説明します。

HTTPリクエストにカスタムヘッダーを追加する例を見て、プロキシサーバーを介してリクエストを承認して送信するようにクライアントを構成する方法を見ていきます。

HTTPサーバーのスタブにはWiremockを使用します。Wiremockについて詳しく知りたい場合は、この記事をご覧ください。

2.カスタムユーザーエージェントヘッダーを使用したHTTPリクエスト

カスタムUser-AgentヘッダーをHTTPGETリクエストに追加するとします。ユーザエージェントヘッダは、ネットワーク・プロトコル・ピアは、アプリケーションタイプ、オペレーティングシステム、およびソフトウェアベンダまたは要求するソフトウェアのユーザエージェントのソフトウェアバージョンを識別することを可能にする特性文字列を含みます。

HTTPクライアントの作成を開始する前に、組み込みモックサーバーを起動する必要があります。

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

HttpGetインスタンスを作成するときは、setHeader()メソッドを使用して、ヘッダーの名前と値を渡すことができます。そのヘッダーはHTTPリクエストに追加されます。

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);

User-Agentヘッダーを追加し、execute()メソッドを介してそのリクエストを送信しています。

「BaeldungAgent / 1.0」に等しい値を持つヘッダーUser-Agentを持つURL / detailに対してGETリクエストが送信されると、serviceMockは200のHTTP応答コードを返します。

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

3.POSTリクエスト本文でデータを送信する

通常、HTTP POSTメソッドを実行するときは、エンティティをリクエストの本文として渡します。HttpPostオブジェクトのインスタンスを作成するときに、setEntity()メソッドを使用してそのリクエストに本文を追加できます。

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

XML形式の本文を使用してStringEntityインスタンスを作成しています。Content-Typeヘッダーを「application / xml」に設定して、送信するコンテンツのタイプに関する情報をサーバーに渡すことが重要です。ときserviceMockは、 XML本体でPOSTリクエストを受信すると、ステータスコード200 OKで応答します。

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

4.プロキシサーバーを介したリクエストの送信

多くの場合、Webサービスは、追加のロジックを実行したり、静的リソースをキャッシュしたりするプロキシサーバーの背後にある可能性があります。HTTPクライアントを作成して実際のサービスにリクエストを送信する場合、それを処理する必要はありません。すべてのHTTPリクエスト。

このシナリオをテストするには、別の組み込みWebサーバーを起動する必要があります。

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

2つの組み込みサーバーでは、最初の実際のサービスは8089ポート上にあり、プロキシサーバーは8090ポート上でリッスンしています。

HttpHostインスタンスプロキシを引数として取るDefaultProxyRoutePlannerを作成することにより、プロキシ経由ですべてのリクエストを送信するようにHttpClientを構成しています。

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

プロキシサーバーは、すべてのリクエストを8090ポートでリッスンする実際のサービスにリダイレクトしています。テストの最後に、リクエストがプロキシ経由で実際のサービスに送信されたことを確認します。

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.プロキシ経由で認証するようにHTTPクライアントを構成する

前の例を拡張すると、プロキシサーバーを使用して承認を実行する場合があります。このような構成では、プロキシはすべての要求を承認し、プロキシの背後に隠されているサーバーにそれらを渡すことができます。

承認プロセスの実行に使用されるAuthorizationヘッダーとともに、プロキシ経由で各リクエストを送信するようにHttpClientを構成できます。

「 -私たちが唯一のユーザー許可のプロキシサーバーがあるとしusername_adminパスワード「とsecret_passwordを

プロキシ経由で承認されるユーザーの資格情報を使用してBasicCredentialsProviderインスタンスを作成する必要があります。HttpClientに適切な値のAuthorizationヘッダーを自動的に追加させるには、提供された資格情報と資格情報を格納するBasicAuthCacheを使用してHttpClientContextを作成する必要があります。

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

HttpClientを設定するときに、サービスにリクエストを送信すると、承認プロセスを実行するためのAuthorizationヘッダー付きのプロキシ経由でリクエストが送信されます。各リクエストで自動的に設定されます。

サービスへの実際のリクエストを実行してみましょう。

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

構成を使用してhttpClientのexecute()メソッドを検証すると、要求がAuthorizationヘッダーを持つプロキシを経由したことが確認されます。

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("Authorization", containing("Basic"))); serviceMock.verify(getRequestedFor(urlEqualTo("/private")));

6.結論

この記事では、高度なHTTP呼び出しを実行するようにApacheHttpClientを構成する方法を示します。プロキシサーバーを介してリクエストを送信する方法と、プロキシを介して承認する方法を見ました。

これらすべての例とコードスニペットの実装は、GitHubプロジェクトにあります。これはMavenプロジェクトであるため、そのままインポートして実行するのは簡単です。