第135章 Restlet
Restlet コンポーネント リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Transport Layer Security (TLS)を使用するように Restlet コンポーネントを設定するには、Security Guide の Configuring Transport Security for Camel Components の章を参照してください。
重要
Restlet コンポーネントはデフォルトで非同期モードを有効にしますが、この設定はパフォーマンスに影響が出るように見えます。これが問題である場合は、エンドポイント URI にオプション
synchronous=true を設定してパフォーマンスを向上できます。
URI 形式 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
restlet:restletUrl[?options]
restletUrl の形式:
protocol://hostname[:port][/resourcePattern]
Restlet はプロトコルとアプリケーションの懸念の切り離されます。Restlet Engine の参照実装は、多くのプロトコルをサポートしています。ただし、HTTP プロトコルのみをテストしました。デフォルトのポートはポート 80 です。まだプロトコルに基づいてデフォルトのポートを自動的に切り替えません。
URI にクエリーオプションは
?option=value&option=value&.. の形式で追加できます。
注記
Restlet はヘッダーを理解する際に大文字と小文字が区別されるようです。たとえば、
content-type を使用するには、Content-Type を使用します。location には Location などを使用します。
オプション リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
| 名前 | デフォルト値 | 説明 |
|---|---|---|
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 コンポーネントは以下のオプションで設定できます。これらは コンポーネント オプションであり、エンドポイントでは設定できないことに注意してください。詳細は、以下を参照してください。
| 名前 | デフォルト値 | 説明 |
|---|---|---|
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
|
メッセージヘッダー リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
| 名前 | タイプ | 説明 |
|---|---|---|
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"));
}
});
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>
以下の例は、 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");
必要なのはこれだけです。リクエストを送信し、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);
サンプルクライアントは、以下のヘッダーを使用して
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
単一の 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));
}
});
次のスニペットは、複数のメソッドを提供する他に、
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));
}
}
});
restletUriPatterns=#uriTemplates オプションは、Spring XML 設定で定義され た List<String > Bean を参照します。
<util:list id="uriTemplates">
<value>/users/{username}</value>
<value>/atom/collection/{id}/component/{cid}</value>
</util:list>
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);
}
});
コンポーネントの最大スレッドの設定 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
最大スレッドオプションを設定するには、以下のようにコンポーネントでこれを実行する必要があります。
<bean id="restlet" class="org.apache.camel.component.restlet.RestletComponent">
<property name="maxThreads" value="100"/>
</bean>
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>
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>
これにより、http://localhost:8080/mywebapp/rs/demo/1234 でデプロイされたルートにアクセスできます。
localhost:8080 はサーブレットコンテナー mywebapp のサーバーおよびポートで、デプロイされた webapp Your ブラウザーの名前で、以下の内容が表示されます。
"Request type : GET and ID : 1234"
Maven pom.xml ファイルで実行できる restlet に、Spring エクステンションの依存関係を追加する必要があります。
<dependency>
<groupId>org.restlet.jee</groupId>
<artifactId>org.restlet.ext.spring</artifactId>
<version>${restlet-version}</version>
</dependency>
さらに、restlet maven リポジトリーに依存関係も追加する必要があります。
<repository>
<id>maven-restlet</id>
<name>Public online Restlet repository</name>
<url>http://maven.restlet.org</url>
</repository>