第135章 Restlet


Restlet コンポーネント

Restlet コンポーネントは、RESTful リソースを消費および生成するための Restletベースの エンドポイント を提供します。
Transport Layer Security (TLS)を使用するように Restlet コンポーネントを設定するには、Security Guide の Configuring Transport Security for Camel Components の章を参照してください
重要
Restlet コンポーネントはデフォルトで非同期モードを有効にしますが、この設定はパフォーマンスに影響が出るように見えます。これが問題である場合は、エンドポイント URI にオプション synchronous=true を設定してパフォーマンスを向上できます。

URI 形式

restlet:restletUrl[?options]
Copy to Clipboard Toggle word wrap
restletUrl の形式:
protocol://hostname[:port][/resourcePattern]
Copy to Clipboard Toggle word wrap
Restlet はプロトコルとアプリケーションの懸念の切り離されます。Restlet Engine の参照実装は、多くのプロトコルをサポートしています。ただし、HTTP プロトコルのみをテストしました。デフォルトのポートはポート 80 です。まだプロトコルに基づいてデフォルトのポートを自動的に切り替えません。
URI にクエリーオプションは ?option=value&option=value&.. の形式で追加できます。
注記
Restlet はヘッダーを理解する際に大文字と小文字が区別されるようです。たとえば、content-type を使用するには、Content-Type を使用します。location には Location などを使用します。

オプション

Expand
名前 デフォルト値 説明
headerFilterStrategy=#refName RestletHeaderFilterStrategyのインスタンス Camel Registry のヘッダーフィルターストラテジーを参照するには、# 表記(headerFilterStrategy=#refName)を使用します。ストラテジーは、HeaderFilterStrategyAware の場合、restlet バインディングにプラグインされます。
restletBinding=# refName DefaultRestletBindingのインスタンス Camel Registry の RestletBinding オブジェクトの Bean ID。
restletMethod GET プロデューサーエンドポイントでは、使用するリクエストメソッドを指定します。コンシューマーエンドポイントで、エンドポイントが restletMethod 要求のみを消費することを指定します。文字列値は Method.valueOf (String) メソッドによって org.restlet.data.Method に変換されます。
restletMethods なし コンシューマーは、restlet コンシューマーエンドポイントによって提供されるコンマ( restletMethods=post,put)で区切られた 1 つ以上のメソッドのみ を指定します。restletMethod および restletMethods オプションの両方を指定すると、restletMethod 設定は無視されます。
restletRealm null # 表記(restletRealm=#refName)を使用して、Camel レジストリーでレルムマップの Bean ID を指定します。
restletUriPatterns=#refName なし コンシューマーは restlet コンシューマーエンドポイントによって処理される 1 つ以上の URI テンプレートのみ を指定し、# 表記を使用して Camel レジストリーの List<String > を参照します。URI パターンがエンドポイント URI に定義されている場合、エンドポイントに定義された URI パターンと restletUriPatterns オプションの両方が受け入れられます。
throwExceptionOnFailure (2.6 以降) true プロデューサーは、プロデューサーの失敗時に例外 のみ を出力します。
connectionTimeout
300000
Camel 2.12.3 Producer のみ 以降、接続がタイムアウトした場合、クライアントは接続をタイムアウトし、無制限の待機時間は 0 になります。
socketTimeout
300000
Camel 2.12.3 Producer はクライアントソケット受信タイムアウトのみ であるため、無制限の待機時間は 0 になります。
disableStreamCache
false
Camel 2.14: Jetty からの raw 入力ストリームがキャッシュされているかどうかを判断します(Camel はストリームをファイル、ストリームキャッシュ)キャッシュにストリームします。http://camel.apache.org/stream-caching.htmlデフォルトでは、Camel は Jetty 入力ストリームをキャッシュして複数回読み取りし、Camel がストリームからすべてのデータを取得できるようにします。ただし、このオプションを true に設定することができます。たとえば、ファイルや他の永続ストアに直接ストリーミングするなど、raw ストリームにアクセスする必要がある場合などです。DefaultRestletBinding は、リクエスト入力ストリームをストリームキャッシュにコピーし、このオプションが false の場合、ストリームを複数回読み取るようにメッセージボディーに配置します。

コンポーネントオプション

Restlet コンポーネントは以下のオプションで設定できます。これらは コンポーネント オプションであり、エンドポイントでは設定できないことに注意してください。詳細は、以下を参照してください。
Expand
名前 デフォルト値 説明
controllerDaemon true Camel 2.10: コントローラースレッドがデーモンであるべきかどうかを示します (JVM の終了をブロックしません)。
controllerSleepTimeMs 100 Camel 2.10: コントローラースレッドが各制御間でスリープ状態になる時間。
inboundBufferSize 8192 Camel 2.10: メッセージの読み取り時のバッファーのサイズ。
minThreads 1 Camel 2.10: サービス要求を待機する最小スレッド。
maxThreads 10 Camel 2.10: リクエストを処理するスレッドの最大数。
lowThreads
8
Camel 2.13: コネクターがオーバーロードされているとみなされるタイミングを決定するワーカースレッドの数。
maxQueued
0
Camel 2.13: サービスに利用可能なワーカースレッドがなかった場合にキューに入れることができる最大呼び出し数。値が 0 の場合、キューは使用されず、ワーカースレッドが即座に利用できない場合は呼び出しは拒否されます。値が -1 の場合、バインドされていないキューが使用され、呼び出しは拒否されます。
maxConnectionsPerHost -1 Camel 2.10: ホストごとの同時接続の最大数(IP アドレス)。
maxTotalConnections -1 Camel 2.10: 合計同時接続の最大数。
outboundBufferSize 8192 Camel 2.10: メッセージの書き込み時のバッファーのサイズ。
persistingConnections true Camel 2.10: 呼び出しの後に接続を維持する必要があるかどうかを示します。
pipeliningConnections false Camel 2.10: パイプライン接続をサポートされるかどうかを示します。
threadMaxIdleTimeMs 60000 Camel 2.10: 収集される前にアイドル状態のスレッドが操作を待機する時間。
useForwardedForHeader false Camel 2.10: 一般的なプロキシーおよびキャッシュでサポートされる X-Forwarded-For ヘッダーを検索し、それを使用して Request.getClientAddresses ()メソッドの結果を設定します。この情報は、ローカルネットワーク内の中間コンポーネントに対してのみ安全です。他のアドレスは偽のヘッダーを設定することで簡単に変更でき、深刻なセキュリティーチェックでは信頼できません。
reuseAddress true Camel 2.10.5/2.11.1: SO_REUSEADDR ソケットオプションを有効/無効にします。詳細は、java.io.ServerSocket#reuseAddress プロパティーを参照してください。
disableStreamCache
false
Camel 2. 14: Jetty からの raw 入力ストリームがキャッシュされているかどうかを判断します(Camel はストリームをファイル、ストリームキャッシュ)キャッシュにストリーム読み取ります。デフォルトでは、Camel は Jetty 入力ストリームをキャッシュして複数回読み取りし、Camel がストリームからすべてのデータを取得できるようにします。ただし、このオプションをファイルや他の永続ストアに直接ストリーミングするなど、raw ストリームにアクセスする必要がある場合などに設定することができます。trueDefaultRestletBinding は、要求入力ストリームをストリームキャッシュにコピーし、このオプションが 複数回ストリームの読み取りをサポートする場合はメッセージボディーに配置します。 false

メッセージヘッダー

Expand
名前 タイプ 説明
CamelContentType 文字列 アプリケーション/プロセッサーによって OUT メッセージに設定できるコンテンツタイプを指定します。値は、応答メッセージの content-type です。このヘッダーが設定されていない場合、content-type は OUT メッセージボディーのオブジェクトタイプに基づきます。Camel 2.3 以降では、Camel IN メッセージに Content-Type ヘッダーが指定されている場合、ヘッダーの値は Restlet リクエストメッセージのコンテンツタイプを決定します。nbsp;それ以外の場合は、デフォルトで application/x-www-form-urlencoded' になります。リリース 2.3 よりも前のバージョンでは、要求コンテンツタイプのデフォルトを変更することはできません。
CamelAcceptContentType 文字列 Camel 2.9.3 以降: 2.10.0: HTTP Accept リクエストヘッダー。
CamelHttpMethod 文字列 HTTP リクエストメソッド。これは IN メッセージヘッダーで設定されます。
CamelHttpQuery 文字列 リクエスト URI のクエリー文字列。restlet コンポーネントがリクエストを受信すると、DefaultRestletBinding によって IN メッセージに設定されます。
CamelHttpResponseCode 文字列 または 整数 応答コードは、アプリケーション/プロセッサーによって OUT メッセージに設定できます。値は、応答メッセージの応答コードです。このヘッダーが設定されていない場合、応答コードは restlet ランタイムエンジンによって設定されます。
CamelHttpUri 文字列 HTTP 要求 URI。これは IN メッセージヘッダーで設定されます。
CamelRestletLogin 文字列 Basic 認証のログイン名。これは、アプリケーションによって IN メッセージで設定され、Apache Camel による restlet リクエストヘッダーの前にフィルターリングされます。
CamelRestletPassword 文字列 Basic 認証のパスワード名。これは、アプリケーションによって IN メッセージで設定され、Apache Camel による restlet リクエストヘッダーの前にフィルターリングされます。
CamelRestletRequest Request Camel 2.8: すべてのリクエスト詳細を保持する org.restlet.Request オブジェクト。
CamelRestletResponse 応答 Camel 2.8: org.restlet.Response オブジェクト。これを使用して、Restlet から API を使用して応答を作成できます。以下の例を参照してください。
org.restlet.* Apache Camel IN ヘッダーに伝播される Restlet メッセージの属性。
cache-control 文字列 または リスト<CacheDirective> Camel 2.11: ユーザーは、camel メッセージヘッダーから、String 値または List of CacheDirective of Restlet で設定できます。
注記
基礎となる Restlet 実装は、ヘッダー名の解析時に大文字と小文字を区別します。たとえば、content-type ヘッダーを設定するには、Content-Type を指定し、location には Location を指定します。

メッセージボディー

Apache Camel は、OUT ボディーの外部サーバーからの restlet 応答を保存します。IN メッセージからのヘッダーはすべて OUT メッセージにコピーされ、ルーティング中にヘッダーが保持されます。

認証のある Restlet エンドポイント

以下のルートは、 http://localhost:8080 POST リクエストをリッスンする restlet コンシューマーエンドポイントを開始します。プロセッサーは、リクエストボディーと id ヘッダーの値をエコーする応答を作成します。
from("restlet:http://localhost:9080/securedOrders?restletMethod=post&restletRealm=#realm").process(new Processor() {
    public void process(Exchange exchange) throws Exception {
        exchange.getOut().setBody(
                "received [" + exchange.getIn().getBody()
                + "] as an order id = "
                + exchange.getIn().getHeader("id"));
    }
});
Copy to Clipboard Toggle word wrap
URI クエリーの restletRealm 設定は、レジストリーで Realm Map を検索するために使用されます。このオプションを指定すると、restlet コンシューマーは情報を使用してユーザーログインを認証します。認証された 要求のみがリソースにアクセスできます。この例では、レジストリーとして機能する Spring アプリケーションコンテキストを作成します。レルムマップの Bean ID は restletRealmRef と一致する必要があります。
<util:map id="realm">
	<entry key="admin" value="foo" />
	<entry key="bar" value="foo" />
</util:map>
Copy to Clipboard Toggle word wrap
以下の例は、 http://localhost:8080 のサーバーにリクエストを送信する direct エンドポイントを開始します(つまり、restlet コンシューマーエンドポイント)。
// Note: restletMethod and restletRealmRef are stripped 
// from the query before a request is sent as they are 
// only processed by Camel.
from("direct:start-auth").to("restlet:http://localhost:9080/securedOrders?restletMethod=post");
Copy to Clipboard Toggle word wrap
必要なのはこれだけです。リクエストを送信し、restlet コンポーネントを試す準備ができました。
final String id = "89531";

Map<String, Object> headers = new HashMap<String, Object>();
headers.put(RestletConstants.RESTLET_LOGIN, "admin");
headers.put(RestletConstants.RESTLET_PASSWORD, "foo");
headers.put("id", id);

String response = (String) template.requestBodyAndHeaders("direct:start-auth", 
        "<order foo='1'/>", headers);
Copy to Clipboard Toggle word wrap
サンプルクライアントは、以下のヘッダーを使用して direct:start-auth エンドポイントにリクエストを送信します。
  • CamelRestletLogin (Apache Camel によって内部で使用される)
  • CamelRestletPassword (Apache Camel によって内部で使用される)
  • id (アプリケーションヘッダー)
注記
org.apache.camel.restlet.auth.login および org.apache.camel.restlet.auth.password は Restlet ヘッダーとして伝播されません。
サンプルクライアントは以下のような応答を取得します。
received [<order foo='1'/>] as an order id = 89531
Copy to Clipboard Toggle word wrap

単一の restlet エンドポイントから複数のメソッドおよび URI テンプレート(2.0 以降)を提供

restletMethods オプションを使用して、複数の HTTP メソッドを提供する単一のルートを作成できます。このスニペットには、ヘッダーからリクエストメソッドを取得する方法も示されています。
from("restlet:http://localhost:9080/users/{username}?restletMethods=post,get,put")
    .process(new Processor() {
        public void process(Exchange exchange) throws Exception {
            // echo the method
            exchange.getOut().setBody(exchange.getIn().getHeader(Exchange.HTTP_METHOD,
                                                                 String.class));

        }
    });
Copy to Clipboard Toggle word wrap
次のスニペットは、複数のメソッドを提供する他に、restletUriPatterns オプションを使用して複数の URI テンプレートをサポートするエンドポイントを作成する方法を示しています。リクエスト URI は IN メッセージのヘッダーでも利用できます。URI パターンがエンドポイント URI で定義されている場合(このサンプルでは)、エンドポイントに定義された URI パターンと restletUriPatterns オプションの両方が尊重されます。
from("restlet:http://localhost:9080?restletMethods=post,get&restletUriPatterns=#uriTemplates")
    .process(new Processor() {
        public void process(Exchange exchange) throws Exception {
            // echo the method
            String uri = exchange.getIn().getHeader(Exchange.HTTP_URI, String.class);
            String out = exchange.getIn().getHeader(Exchange.HTTP_METHOD, String.class);
            if ("http://localhost:9080/users/homer".equals(uri)) {
                exchange.getOut().setBody(out + " " + exchange.getIn().getHeader("username", String.class));
            } else if ("http://localhost:9080/atom/collection/foo/component/bar".equals(uri)) {
                exchange.getOut().setBody(out + " " + exchange.getIn().getHeader("id", String.class)
                                          + " " + exchange.getIn().getHeader("cid", String.class));

            }

        }
    });
Copy to Clipboard Toggle word wrap
restletUriPatterns=#uriTemplates オプションは、Spring XML 設定で定義され た List<String > Bean を参照します。
<util:list id="uriTemplates">
    <value>/users/{username}</value>
    <value>/atom/collection/{id}/component/{cid}</value>
</util:list>
Copy to Clipboard Toggle word wrap

Restlet API を使用した応答の設定

Camel 2.8 から利用可能
org.restlet.Response API を使用して応答を設定することができます。これにより、Restlet API に完全にアクセスでき、応答を詳細に制御できます。インライン化された Camel プロセッサー からの応答を生成する以下のルートスニペットを参照してください。
from("restlet:http://localhost:" + portNum + "/users/{id}/like/{beer}")
     .process(new Processor() {
         public void process(Exchange exchange) throws Exception {
             // the Restlet request should be available if neeeded
             Request request = exchange.getIn().getHeader(RestletConstants.RESTLET_REQUEST, Request.class);
             assertNotNull("Restlet Request", request);
 
             // use Restlet API to create the response
             Response response = exchange.getIn().getHeader(RestletConstants.RESTLET_RESPONSE, Response.class);
             assertNotNull("Restlet Response", response);
             response.setStatus(Status.SUCCESS_OK);
             response.setEntity("<response>Beer is Good</response>", MediaType.TEXT_XML);
             exchange.getOut().setBody(response);
         }
     });
Copy to Clipboard Toggle word wrap

コンポーネントの最大スレッドの設定

最大スレッドオプションを設定するには、以下のようにコンポーネントでこれを実行する必要があります。
<bean id="restlet" class="org.apache.camel.component.restlet.RestletComponent">
  <property name="maxThreads" value="100"/>
</bean>
Copy to Clipboard Toggle word wrap

webapp 内の Restlet サーブレットの使用

Camel 2.8 では、サーブレットコンテナー内で Restlet アプリケーションを設定し、サブクラス化された SpringServerServlet を使用すると、Restlet コンポーネントを注入する ことで Camel 内の設定を有効にする 3 つの方法 があります。
サーブレットコンテナー内で Restlet サーブレットを使用すると、URI の相対パス(ハードコーディングされた絶対 URI の制限を変更する)や、(新しいポートで別のサーバープロセスを生成する必要のない)ホスティングサーブレットコンテナーが受信要求を処理するよう設定できます。
を設定するには、以下を camel-context.xml; に追加します。
 <camelContext>
   <route id="RS_RestletDemo">
     <from uri="restlet:/demo/{id}" />
     <transform>
       <simple>Request type : ${header.CamelHttpMethod} and ID : ${header.id}</simple>
     </transform>
   </route> 
 </camelContext>
 
 <bean id="RestletComponent" class="org.restlet.Component" />
 
 <bean id="RestletComponentService" class="org.apache.camel.component.restlet.RestletComponent">
   <constructor-arg index="0">
     <ref bean="RestletComponent" />
   </constructor-arg>
 </bean>
Copy to Clipboard Toggle word wrap
web.xml に追加します。
 <!-- Restlet Servlet -->
 <servlet>
   <servlet-name>RestletServlet</servlet-name>
   <servlet-class>org.restlet.ext.spring.SpringServerServlet</servlet-class>
   <init-param>
     <param-name>org.restlet.component</param-name>
     <param-value>RestletComponent</param-value>
   </init-param>
 </servlet>
 
 <servlet-mapping>
   <servlet-name>RestletServlet</servlet-name>
   <url-pattern>/rs/*</url-pattern>
 </servlet-mapping>
Copy to Clipboard Toggle word wrap
これにより、http://localhost:8080/mywebapp/rs/demo/1234 でデプロイされたルートにアクセスできます。
localhost:8080 はサーブレットコンテナー mywebapp のサーバーおよびポートで、デプロイされた webapp Your ブラウザーの名前で、以下の内容が表示されます。
"Request type : GET and ID : 1234"
Copy to Clipboard Toggle word wrap
Maven pom.xml ファイルで実行できる restlet に、Spring エクステンションの依存関係を追加する必要があります。
 <dependency>
   <groupId>org.restlet.jee</groupId>
   <artifactId>org.restlet.ext.spring</artifactId>
   <version>${restlet-version}</version>
 </dependency>
Copy to Clipboard Toggle word wrap
さらに、restlet maven リポジトリーに依存関係も追加する必要があります。
 <repository>  
    <id>maven-restlet</id>  
    <name>Public online Restlet repository</name>  
    <url>http://maven.restlet.org</url>  
 </repository>
Copy to Clipboard Toggle word wrap
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat