JAX-RS (Jersey) Client をプロキシ経由で使う方法 (ja)

この記事は GlassFish Advent Calendar 2014 の 16 日目です。前日は「GlassFish 4.1 開発ウラ話」でした。本日は小ネタの部類に入りますが、世間ではあまり採用されていないアプローチのため、参考になるかと思います。

JAX-RS 2.0 で導入された Client API は有益ですが、HTTP プロキシサーバへの対応が仕様化されていません。ここでは Jersey を例にプロキシに対応させる方法を考察します(他の実装では適応できないことをあらかじめお断りしておきます)。

方法1 システムプロパティを設定する

Jersey Client のデフォルトでは内部で HTTP 通信に HttpURLConnection を利用します。したがって、同クラスに対してプロキシ情報を伝えるシステムプロパティ [http.proxyHost ; http.proxyPort ; httpNonProxyHosts] はそのまま有効です。

方法2 ConnectorProvider を指定する

Jersey Client は、HTTP 接続を提供する部分を ConnectorProvider と呼び、必要であれば差し替えることができるようになっています。デフォルトでは HttpURLConnection を利用する HttpUrlConnectorProvider となっています。今回は HttpUrlConnectorProvider を利用し、Proxy を設定した HttpURLConnection を使う例を示します。

Apache HttpClient を接続に用いる ApacheConnectorProvider を利用する方法(Jersey 2.5 以降)もあります。こちらの事例は多いようなので、興味があれば調べてみてください。

では、コード例を以下に示します。

Proxy proxy = new Proxy(Type.HTTP, new InetSocketAddress(PROXY_HOST, PROXY_PORT);

ClientConfig config = new ClientConfig();
HttpUrlConnectorProvider connectorProvider = new HttpUrlConnectorProvider();
connectorProvider.connectionFactory(url -> (HttpURLConnection) url.openConnection(proxy));
config.connectorProvider(connectorProvider);

Client client = ClientBuilder.newClient(config);
// ...

今回示した Proxy 設定済みの HttpURLConnection を使用する方法は、追加のライブラリを導入しなくても使用できる方法のため、個人的にはお勧めの方法です。


明日は使われているのかどうかいまいち分からない、パスワートエイリアスについてご紹介する予定です。