第119章 Netty HTTP
Netty HTTP コンポーネント リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Camel 2.12 以降で利用可能
この Camel コンポーネントは、プロデューサーとコンシューマーエンドポイントの両方をサポートします。
Netty 4.0 の計画アップグレード
このコンポーネントは、
camel-netty4 コンポーネントのアップグレードが完了したときに Netty 4.0 を使用するようにアップグレードすることが意図されています。現時点では、このコンポーネントは Netty 3.x をベースとしています。アップグレードは、可能な限り後方互換性があることを目的としています。
ストリーム
Netty はストリームベースであり、受信する入力がストリームとして Camel に送信されることを意味します。つまり、ストリームのコンテンツを 1 度 だけ読み取ることができます。メッセージボディーが空であるように見える場合や、データに複数回アクセスする必要がある場合(例:マルチキャストの実行、再配信エラー処理)は、Stream Caching を使用するか、メッセージボディーを複数回再読み取りできる
文字列 に変換する必要があります。
Maven ユーザーは、このコンポーネントの
pom.xml に以下の依存関係を追加する必要があります。
URI 形式 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
netty コンポーネントの URI スキームは以下のとおりです。
netty-http:http://localhost:8080[?options]
netty-http:http://localhost:8080[?options]
URI にクエリーオプションは
?option=value&option=value&.. の形式で追加できます。
クエリーパラメーターとエンドポイントオプションの比較
Camel が URI クエリーパラメーターおよびエンドポイントオプションを認識する方法に気づくかもしれません。たとえば、
netty-http:http//example.com?myParam=myValue&compression=true のようにエンドポイント URI を作成できます。この例では、myParam は HTTP パラメーターですが、compression は Camel エンドポイントオプションです。このような状況で Camel によって使用されるストラテジーは、利用可能なエンドポイントオプションを解決し、URI から削除することです。これは、前述の例では、Netty HTTP プロデューサーによってエンドポイントに送信される HTTP リクエストは、http//example.com?myParam=myValue のようになります。compression エンドポイントオプションはターゲット URL から解決され、削除されます。
また、動的ヘッダー(
CamelHttpQueryなど)を使用してエンドポイントオプションを指定できないことに注意してください。エンドポイントオプションは、エンドポイント URI 定義レベルでのみ指定できます( to または from DSL 要素など)。
HTTP オプション リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
その他のオプション
重要: このコンポーネントは、Netty からすべてのオプションを継承します。そのため、Netty のドキュメントも確認してください。Netty の一部のオプションは、UDP トランスポートに関連するオプションなど、この Netty HTTP コンポーネントを使用する場合に適用されないことに注意してください。
| 名前 | デフォルト値 | 説明 |
|---|---|---|
chunkedMaxContentLength
|
1mb
|
Netty HTTP サーバーで受信されるチャンクごとの最大コンテンツ長(バイト単位)。 |
圧縮
|
false
|
クライアントが HTTP ヘッダーからサポートしている場合、Netty HTTP サーバーの圧縮に gzip/deflate の使用を許可します。 |
headerFilterStrategy
|
カスタムの org.apache.camel.spi.HeaderFilterStrategy を使用してヘッダーをフィルターリングします。
|
|
httpMethodRestrict
|
Netty HTTP コンシューマーで HTTP メソッドを無効にするには、以下を行います。コンマで区切って複数指定できます。 | |
mapHeaders
|
true
|
このオプションを有効にすると、Netty から Camel Message へのバインド中にヘッダーもマッピングされます(たとえば、ヘッダーとして Camel Message に追加されます)。このオプションをオフにして無効にすることができます。ヘッダーには、Netty HTTP リクエスト org.jboss.netty.handler.codec.http.HttpRequest インスタンスを返す getHttpRequest () メソッドが含まれる org.apache.camel.component.netty.http.NettyHttpMessage メッセージから引き続きアクセスできます。
|
matchOnUriPrefix
|
false
|
完全一致が見つからない場合に Camel が URI 接頭辞と一致することでターゲットコンシューマーの検索を試みるかどうか。詳細につていは以下をご覧ください |
nettyHttpBinding
|
Netty および Camel Message API との間でバインドするためにカスタム org.apache.camel.component.netty.http.NettyHttpBinding を使用するには、以下を行います。
|
|
bridgeEndpoint
|
false
|
オプションが true の場合、プロデューサーは Exchange.HTTP_URI ヘッダーを無視し、リクエストにエンドポイントの URI を使用します。また、throwExceptionOnFailure を false に設定して、プロデューサーがすべての障害応答を返信するようにすることもできます。ブリッジモードで動作しているコンシューマーは、gzip 圧縮および WWW URL フォームエンコーディングを省略します( Exchange.SKIP_GZIP_ENCODING ヘッダーおよび Exchange.SKIP_WWW_FORM_URLENCODED ヘッダーを消費されたエクスチェンジに追加します)。
|
throwExceptionOnFailure
|
true
|
リモートサーバーからの応答が失敗した場合に HttpOperationFailedException を出力することを無効にするオプション。これにより、HTTP ステータスコードに関するすべての応答を取得できます。
|
traceEnabled
|
false
|
この Netty HTTP コンシューマーに対して HTTP TRACE を有効にするかどうかを指定します。デフォルトでは、TRACE はオフになっています。 |
transferException
|
false
|
有効にすると、エクスチェンジ がコンシューマー側で処理に失敗し、発生した例外が application/x-java-serialized-object コンテンツタイプとして応答でシリアライズされた場合に、例外がシリアライズされました。プロデューサー側では、例外がデシリアライズされ、HttpOperationFailedException ではなくそのまま出力されます。原因となった例外はシリアライズする必要があります。
|
urlDecodeHeaders
|
false
|
このオプションを有効にすると、Netty から Camel Message へのバインディング時に、ヘッダーの値は URL デコードされます(例:%20 は空白文字になります)。このオプションは、デフォルトの org.apache.camel.component.netty.http.NettyHttpBinding によって使用されるため、カスタム org.apache.camel.component.netty.http.NettyHttpBinding を実装する場合は、このオプションに応じてヘッダーをデコードする必要があります。
|
nettySharedHttpServer
|
null
|
共有 Netty HTTP サーバーを使用するには、以下を行います。詳細は Netty HTTP Server Example を参照してください。 |
disableStreamCache
|
false
|
Netty HttpRequest#getContent ()からの raw 入力ストリームがキャッシュされるかどうかを決定します(Camel はストリームを軽量メモリーベースの Stream キャッシュに読み取ります)。デフォルトでは、Camel は Netty 入力ストリームをキャッシュして複数回読み取りし、Camel がストリームからすべてのデータを取得できるようにします。ただし、ファイルや他の永続ストアに直接ストリーミングするなど、raw ストリームにアクセスする必要がある場合などにこのオプションを true に設定できます。このオプションを有効にすると、Netty ストリームが追加設定なしで複数回読み取ることができないため、Netty raw ストリームで reader インデックスを手動でリセットする必要があります。
|
securityConfiguration
|
null
|
コンシューマーのみ。セキュアな Web リソースを設定するための org.apache.camel.component.netty.http.NettyHttpSecurityConfiguration を参照します。
|
send503whenSuspended
|
true
|
コンシューマーのみ。コンシューマーが一時停止されたときに HTTP ステータスコード 503 を送信するかどうか。オプションが false の場合、コンシューマーが一時停止されると Netty Acceptor がバインド解除されるため、クライアントは接続できなくなります。
|
maxHeaderSize
|
8192
|
Camel 2.15.3 : コンシューマーのみ。すべてのヘッダーの最大長。各ヘッダーの長さの合計がこの値を超えると、TooLongFrameException が発生します。
|
okStatusCodeRange
|
200-299
|
Camel 2.16: 正常な応答と見なされるステータスコード。値は含まれます。範囲は、構文 from-to を使用して定義する必要があります。
|
useRelativePath
|
false
|
Camel 2.16 : プロデューサーのみ。リクエスト行または絶対 URI (http://0.0.0.0:8080/myapp)でパス(/myapp)を使用するかどうか(デフォルト)。
|
NettyHttpSecurityConfiguration には以下のオプションがあります。
| 名前 | デフォルト値 | 説明 |
|---|---|---|
認証
|
true
|
認証が有効であるかどうか。を使用して、この機能を迅速にオフにできます。 |
constraint
|
Basic
|
サポートされる制約。現在、Basic のみが実装され、サポートされています。
|
realm
|
null
|
JAAS セキュリティーレルムの名前。このオプションは必須です。 |
securityConstraint
|
null
|
ACL を Web リソースに定義できるセキュリティー制約マッパーをプラグインできるようにします。 |
securityAuthenticator
|
null
|
認証を実行するオーセンティケーターをプラグインできるようにします。設定されていない場合、org.apache.camel.component.netty.http.JAASSecurityAuthenticator はデフォルトで使用されます。
|
loginDeniedLoggingLevel
|
DEBUG
|
ログイン試行の失敗時に使用されるロギングレベル。これにより、ログインに失敗した理由の詳細を確認できます。 |
roleClassName
|
null
|
ユーザーロールを含む Principal 実装の FQN クラス名を指定するには、以下を実行します。何も指定されていない場合、Netty HTTP コンポーネントはデフォルトで、FQN クラス名に FQN クラス名に小文字の単語ロールがある場合に Principal が ロール ベースであると想定します。複数のクラス名をコンマで区切って指定できます。
|
メッセージヘッダー リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
以下のヘッダーをプロデューサーで使用して、HTTP リクエストを制御できます。
| 名前 | タイプ | 説明 |
|---|---|---|
CamelHttpMethod
|
文字列
|
GET、POST、TRACE など、使用する HTTP メソッドを制御できます。タイプは org.jboss.netty.handler.codec.http.HttpMethod インスタンスでも指定できます。
|
CamelHttpQuery
|
文字列
|
エンドポイント設定を上書きする String 値として URI クエリーパラメーターを指定できるようにします。& 記号を使用して、複数のパラメーターを区切ります。例: foo=bar&beer=yes
|
CamelHttpPath
|
文字列
|
Camel 2.13.1/2.12.4: エンドポイント設定をオーバーライドする String の値として URI コンテキストパスおよびクエリーパラメーターを指定できます。これにより、同じリモート HTTP サーバーを呼び出すために同じプロデューサーを再利用できますが、動的コンテキストパスおよびクエリーパラメーターを使用できます。
|
Content-Type
|
文字列
|
HTTP ボディーのコンテンツタイプを設定するには、以下を行います。例: text/plain; charset="UTF-8"。
|
CamelHttpResponseCode
|
int
|
使用する HTTP ステータスコードを設定できます。デフォルトでは、成功には 200、失敗には 500 が使用されます。 |
Netty HTTP エンドポイントからルートが起動すると、以下のヘッダーが meta-data として提供されます。
テーブルの説明は、
from ("netty-http:http:0.0.0.0:8080/myapp")... を持つルートのオフセットを取ります。
| 名前 | タイプ | 説明 |
|---|---|---|
CamelHttpMethod
|
文字列
|
GET、POST、TRACE などの HTTP メソッド。 |
CamelHttpUrl
|
文字列
|
プロトコル、ホストおよびポートなどの URL。 |
CamelHttpUri
|
文字列
|
プロトコル、ホストおよびポートのない URI ( /myapp など) |
CamelHttpQuery
|
文字列
|
foo=bar&beer=yesなどのクエリーパラメーター
|
CamelHttpRawQuery
|
文字列
|
Camel 2.13.0:
foo=bar&beer=yes などのクエリーパラメーター。コンシューマー(URL デコード前)に到達する際に、raw 形式で保存されます。
|
CamelHttpPath
|
文字列
|
追加のコンテキストパス。クライアントが context-path /myapp と呼ばれる場合、この値は空になります。クライアントが /myapp/mystuff を呼び出す場合、このヘッダー値は /mystuff になります。つまり、ルートエンドポイントに設定された context-path の後に値になります。
|
CamelHttpCharacterEncoding
|
文字列
|
content-type ヘッダーからの charset。 |
CamelHttpAuthentication
|
文字列
|
ユーザーが HTTP Basic を使用して認証された場合、このヘッダーは Basic の値で追加されます。
|
Content-Type
|
文字列
|
提供された場合はコンテンツタイプ。例: text/plain; charset="UTF-8"。
|
Netty タイプへのアクセス リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
このコンポーネントは、
org.apache.camel.component.netty.http.NettyHttpMessage を Exchange のメッセージ実装として使用します。これにより、エンドユーザーは以下のように元の Netty 要求/応答インスタンスにアクセスできます。元の応答は常にアクセスできない可能性があることに注意してください。
org.jboss.netty.handler.codec.http.HttpRequest request = exchange.getIn(NettyHttpMessage.class).getHttpRequest();
org.jboss.netty.handler.codec.http.HttpRequest request = exchange.getIn(NettyHttpMessage.class).getHttpRequest();
例 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
以下のルートでは Netty HTTP を HTTP サーバーとして使用し、ハードコーディングされた Bye World メッセージを返します。
from("netty-http:http://0.0.0.0:8080/foo")
.transform().constant("Bye World");
from("netty-http:http://0.0.0.0:8080/foo")
.transform().constant("Bye World");
また、以下のように ProducerTemplate で Camel を使用してこの HTTP サーバーを呼び出すこともできます。
String out = template.requestBody("netty-http:http://localhost:8080/foo", "Hello World", String.class);
System.out.println(out);
String out = template.requestBody("netty-http:http://localhost:8080/foo", "Hello World", String.class);
System.out.println(out);
また、Bye World を出力として返します。
Netty がワイルドカードと一致させる方法 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、Netty HTTP は正確な URI の場合にのみ一致します。ただし、接頭辞に一致するよう Netty に指示することができます。以下に例を示します。
from("netty-http:http://0.0.0.0:8123/foo").to("mock:foo");
from("netty-http:http://0.0.0.0:8123/foo").to("mock:foo");
上記のルートでは、Netty HTTP は URI が完全に一致する場合にのみ一致するため、
http://0.0.0.0:8123/foo を入力し、http://0.0.0.0:8123/foo/bar を使用しない場合は一致しません。
そのため、ワイルドカードの一致を有効にするには、以下を実行します。
from("netty-http:http://0.0.0.0:8123/foo?matchOnUriPrefix=true").to("mock:foo");
from("netty-http:http://0.0.0.0:8123/foo?matchOnUriPrefix=true").to("mock:foo");
そのため、Netty は
foo で始まるすべてのエンドポイントに一致するようになりました。
任意のエンドポイントに一致させる には、以下を実行できます。
from("netty-http:http://0.0.0.0:8123?matchOnUriPrefix=true").to("mock:foo");
from("netty-http:http://0.0.0.0:8123?matchOnUriPrefix=true").to("mock:foo");
同じポートでの複数ルートの使用 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
同じ CamelContext で、同じポート(
org.jboss.netty.bootstrap.ServerBootstrap インスタンスなど)を共有する Netty HTTP からの複数のルートを持つことができます。これを実行するには、ルートが同じ org.jboss.netty.bootstrap.ServerBootstrap インスタンスを共有するため、複数のブートストラップオプションをルートで同一にする必要があります。インスタンスは、最初に作成したルートからのオプションで設定されます。
ルートが同じでなければならないオプションは、
org.apache.camel.component.netty.NettyServerBootstrapConfiguration 設定クラスで定義されたすべてのオプションです。別のオプションで別のルートを設定した場合、Camel は起動時に例外を出力し、オプションが同一ではないことを示します。これを軽減するには、すべてのオプションが同一であることを確認します。
以下は、同じポートを共有する 2 つのルートを持つ例です。
同じポートを共有する 2 つのルート
以下は、1st ルートと同じ
org.apache.camel.component.netty.NettyServerBootstrapConfiguration オプションを持たない、誤って設定された 2 番目のルートの例です。これにより、起動時に Camel が失敗します。
2 つのルートが同じポートを共有しますが、2 番目のルートは設定が間違っているため、開始時に失敗します。
複数のルートを持つ同じサーバーブートストラップ設定の再利用 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
org.apache.camel.component.netty.NettyServerBootstrapConfiguration タイプの単一のインスタンスに共通のサーバーブートストラップオプションを設定すると、Netty HTTP コンシューマーで bootstrapConfiguration オプションを使用して、すべてのコンシューマーで同じオプションを参照および再利用できます。
<bean id="nettyHttpBootstrapOptions" class="org.apache.camel.component.netty.NettyServerBootstrapConfiguration"> <property name="backlog" value="200"/> <property name="connectTimeout" value="20000"/> <property name="workerCount" value="16"/> </bean>
<bean id="nettyHttpBootstrapOptions" class="org.apache.camel.component.netty.NettyServerBootstrapConfiguration">
<property name="backlog" value="200"/>
<property name="connectTimeout" value="20000"/>
<property name="workerCount" value="16"/>
</bean>
以下のように、このオプションを参照するルートで、
OSGi コンテナー内の複数のバンドル間で複数のルートを持つ同じサーバーブートストラップ設定の再利用 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
詳細は、Netty HTTP Server Example を参照してください。
HTTP Basic 認証の使用 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Netty HTTP コンシューマーは、以下のように使用するセキュリティーレルム名を指定して HTTP Basic 認証をサポートします。
<route>
<from uri="netty-http:http://0.0.0.0:{{port}}/foo?securityConfiguration.realm=karaf"/>
...
</route>
<route>
<from uri="netty-http:http://0.0.0.0:{{port}}/foo?securityConfiguration.realm=karaf"/>
...
</route>
Basic 認証を有効にするには、レルム名が必須です。デフォルトでは、JAAS ベースのオーセンティケーターが使用されます。これは、指定されたレルム名(上記の例では karaf)を使用し、認証に JAAS レルムと JAAS
LoginModuleを使用します。
Apache Karaf / ServiceMix のエンドユーザーには、追加設定なしで karaf レルムがあるため、上記の例はこれらのコンテナーのすぐに機能しなくなります。
Web リソースでの ACL の指定 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
org.apache.camel.component.netty.http.SecurityConstraint を使用すると、Web リソースに制限を定義できます。また、org.apache.camel.component.netty.http.SecurityConstraintMapping は追加設定なしで提供され、ロールへの包含と除外を簡単に定義できます。
たとえば、XML DSL で以下のように制約 Bean を定義します。
上記の制約は、次のように を定義します。
- /* へのアクセスは制限され、すべてのロールが受け入れられます(ユーザーにもロールがない場合も同様です)。
- /admin/* へのアクセスには admin ロールが必要です。
- /guest/* へのアクセスには、admin ロールまたは guest ロールが必要です。
- /public/* へのアクセスは、認証が不要であることを意味します。そのため、ログインせずに誰でも公開されます。
この制約を使用するには、以下のように Bean ID を参照する必要があります。
<route>
<from uri="netty-http:http://0.0.0.0:{{port}}/foo?matchOnUriPrefix=true&ecurityConfiguration.realm=karaf&ecurityConfiguration.securityConstraint=#constraint"/>
...
</route>
<route>
<from uri="netty-http:http://0.0.0.0:{{port}}/foo?matchOnUriPrefix=true&ecurityConfiguration.realm=karaf&ecurityConfiguration.securityConstraint=#constraint"/>
...
</route>