Newer
Older
notes / REST / resteasy3.md
Seiji Sogabe on 14 Aug 2015 7 KB FIxed typo

RESTEasy 3.X

RESTEasy 3.Xは、JAX-RS 2.0準拠のJBossが提供するライブラリ。JavaEE7対応のWildFlyにバンドルされています。

クライアントの実装

RESTEasy 3.Xは、クライアントの実装として、RESTEasy 2.Xで提供したJAX-RS 2.0に準拠していないRESTEasy独自仕様のAPIと、準拠したAPIを提供しています。

  • JAX-RS 2.0に準拠していない独自仕様のAPI RESTEasy 2.xを参照。
  • JAX-RS 2.0準拠のAPI 基本的な使い方は、Jersey 2.xを参照。 ただし、JAX-RS 2.0で規定していないプロキシーなどは、RESTEasy独自の実装が必要となります。

ライブラリ

JAX-RSである以下のライブラリが必要です。

    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-jaxrs</artifactId>
        <version>3.0.9.Final</version>
    </dependency>
    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-client</artifactId>
        <version>3.0.9.Final</version>
    </dependency>

また、RESTサーバとのインタフェースの形式(XML,JSON)にあわせて、以下のライブラリが必要となります。

    <!-- XMLを使用する場合 -->
    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-jaxb-provider</artifactId>
        <version>3.0.9.Final</version>
    </dependency>        
    <!-- JSONを使用する場合(Jackson) -->
    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-jackson-provider</artifactId>
        <version>3.0.9.Final</version>
    </dependency>        
    <!-- JSONを使用する場合(Jettison) -->
    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-jettison-provider</artifactId>
        <version>3.0.9.Final</version>
    </dependency>

ファイルのアップロードを行う場合は、以下のライブラリも必要です。

    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-multipart-provider</artifactId>
        <version>3.0.9.Final</version>
    </dependency>

JBoss EAP 6.X での利用

JBoss EAP6.Xには、JAX-RS 1.1準拠のRESTEasy 2.3.7がバンドルされています。 JBossのサポート対象外になりますが、RESTEasyが提供するZipファイルに含まれている resteasy-jboss-modules-3.0.9.Final.zip を、 modules/system/layers/base に展開することで利用可能です。

基本

Jersey 2.x 基本参照。

POST/PUT/DELETE

Jersey 2.x POST/PUT/DELETE参照。

非同期

Jersey 2.x 非同期参照。

コールバック

Jersey 2.x コールバック参照。

フィルタ、インタセプタ

Jersey 2.x フィルタ、インタセプタ参照。

ClientHttpEngine

RESTEasy 3.Xでは、RESTサーバとのHTTP接続を ClientHttpEngineにより、実行します。

マルチスレッドでのアクセス

ClientEngine の実装である ApacheHttpClient4Engineは、マルチスレッドに対応していない org.apache.http.impl.conn.SingleClientConnManager を使用するため、マルチスレッドから同時にアクセスした場合、シリアルに処理されるため性能が劣化します。

回避するには、次のようにデフォルトの ClientEngine の差し替えを行う必要があります。

    // マルチスレッドに対応したClientEngineの生成
    ClientConnectionManager cm = new ThreadSafeClientConnManager();
    HttpClient httpClient = new DefaultHttpClient(cm);
    ApacheHttpClient4Engine engine = new ApacheHttpClient4Engine(httpClient);

    // クライアント生成
    ResteasyClient client = new ResteasyClientBuilder()
            // ClientEngineの差し替え
            .httpEngine(engine)
            .build();
    // アクセスするエンドポイントURLを設定
    WebTarget target = client.target("http://localhost:9999/api/p");

プロキシー

RESTサーバとの通信で、HTTPプロキシーを使用する場合の例を以下に示します。

    // マルチスレッドに対応したClientEngineの生成
    ClientConnectionManager cm = new ThreadSafeClientConnManager();
    HttpClient httpClient = new DefaultHttpClient(cm);
    ApacheHttpClient4Engine engine = new ApacheHttpClient4Engine(httpClient);
    // プロキシーを設定
    engine.setDefaultProxy(new HttpHost("localhost", 8888));

    // クライアント生成
    ResteasyClient client = new ResteasyClientBuilder()
            .httpEngine(engine)
            .build();

BASIC認証

BASIC認証が必要な場合の例を以下に示します。

    // クライアント生成
    ResteasyClient client = new ResteasyClientBuilder()
            .httpEngine(engine)
            // BASIC認証
            .register(new BasicAuthentication("user", "passwd"))
            .build();

ファイルアプロード

    // クライアントの生成
    Client client = ClientBuilder.newClient();
    WebTarget target = client.target("http://localhost:8080/b/upload");

    // アップロード対象
    MultipartFormDataOutput form = new MultipartFormDataOutput();
    form.addFormData("file", getClass().getResourceAsStream("sample.png"),
            MediaType.APPLICATION_OCTET_STREAM_TYPE);
    GenericEntity<MultipartFormDataOutput> entity 
            = new GenericEntity<MultipartFormDataOutput>(form) {};

    // リクエスト送信
    Response response = target.request(MediaType.TEXT_PLAIN)
            // アップロード対象の設定
            .post(Entity.entity(entity, MediaType.MULTIPART_FORM_DATA_TYPE));

その他

  • コネクションタイムアウトの設定
    HttpParams params = httpClient.getParams();
    HttpConnectionParams.setConnectionTimeout(params, 30 * 1000);
  • ソケットタイムアウトの設定
    HttpParams params = httpClient.getParams();
    HttpConnectionParams.setSoTimeout(params, 30 * 1000);
  • ユーザエージェントの設定
    // ユーザエージェントを設定
    params.setParameter(CoreProtocolPNames.USER_AGENT, "HogeHoge");
    // ユーザエージェントを削除
    params.removeParameter(CoreProtocolPNames.USER_AGENT);
  • リダイレクト対応

// TODO