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