[Java] Jersey Client - Making requests with HttpURLConnection hack

JDKのHttpURLConnectionクラスには厳しい制限があります。それは、任意に選択したメソッドを使ってリクエストを発行できないというものです。実際はjavadocにて定義されたサブセットに限定されたメソッドを利用できますが、何らかの問題が発生する可能性があるので、どうやっても利用可能なメソッドを拡張できません。

HttpURLConnectionのjavadoc
http://download.oracle.com/javase/6/docs/api/java/net/HttpURLConnection.html

例えば、クラス作成時にはPATCHリクエストがHTTPの仕様になかったため、PATCHリクエストを発行できません。そのため、HttpURLClientConnectionクラスを使ってWebDAVクライアントを作成したくても無理だったのです。

ええ、今までは。;)

Jerseyのユーザーである Markus Karg が回避策を見つけました。
HttpURLConnectionクラスの一つのフィールドにinjectionを使ってメソッド名を”注入”できるので、そのメソッド名を使ってリクエストを生成する、というものです。この機能はデフォルトでは有効になっていないので、利用したい場合には以下のプロパティをtrueに設定する必要があります。

URLConnectionClientHandler.PROPERTY_HTTP_URL_CONNECTION_SET_METHOD_WORKAROUND

次のようなコード

        DefaultClientConfig config = new DefaultClientConfig();
        config.getProperties().put(URLConnectionClientHandler.PROPERTY_HTTP_URL_CONNECTION_SET_METHOD_WORKAROUND, true);
        Client c = Client.create(config);

        WebResource r = c.resource(getUri().path("test/entity").build());

        ClientResponse cr = r.method("GOTOSLEEP", ClientResponse.class);

から、以下の結果を得ることができます。


Feb 4, 2011 11:25:44 AM com.sun.jersey.api.client.filter.LoggingFilter log
INFO: 1 * Client out-bound request
1 > GOTOSLEEP http://localhost:9997/test/test

この結果から、"GOTOSLEEP" というメソッドが使われていて、HttpURLConnectionクラスは何も例外を発生していないことがわかります。ただ、この回避策にも次の制限があります。
  • エンティティをリクエストに配置することはできない
  • "おそらく"いくつかのJava EEコンテナやJDKの将来のバージョンでは動作しない(Java EEコンテナはHttpURLConnectionを独自実装をしていることがあるため)
原文はこちら。
http://blogs.sun.com/PavelBucek/entry/jersey_client_making_requests_with

0 件のコメント:

コメントを投稿