第120章 Netty4-HTTP


Netty4 HTTP コンポーネント

Camel 2.14 から利用可能
netty4-http コンポーネントは Netty4 コンポーネントへの拡張であり、Netty4 で HTTP トランスポートを容易にします。
この Camel コンポーネントは、プロデューサーとコンシューマーエンドポイントの両方をサポートします。
ストリーム
Netty はストリームベースであり、受信する入力がストリームとして Camel に送信されることを意味します。つまり、ストリームのコンテンツを 1 度 だけ読み取ることができます。メッセージボディーが空である、またはデータに複数回アクセスする必要がある場合(例:マルチキャストの実行、再配信エラー処理)は、Stream キャッシュ を使用するか、メッセージボディーを複数回再読み取りできる String に変換する必要があります。
Maven ユーザーは、このコンポーネントの以下の依存関係を pom.xml に追加する必要があります。
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-netty4-http</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>
Copy to Clipboard Toggle word wrap

URI 形式

netty コンポーネントの URI スキームは以下のとおりです。
netty4-http:http://localhost:8080[?options]
Copy to Clipboard Toggle word wrap
以下の形式で 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 オプション

その他のオプション
重要: このコンポーネントは、Netty4 からすべてのオプションを継承します。そのため、Netty4 のドキュメントも確認してください。Netty4 の一部のオプションは、UDP トランスポートに関連するオプションなど、この Netty4 HTTP コンポーネントを使用する場合に適用されないことに注意してください。
Expand
名前
デフォルト値
説明
chunkedMaxContentLength
1mb
Netty HTTP サーバーで受信されるチャンクごとの最大コンテンツ長(バイト単位)。
compression
false
クライアントが HTTP ヘッダーからサポートしている場合、Netty HTTP サーバーの圧縮に gzip/deflate の使用を許可します。
headerFilterStrategy
カスタム org.apache.camel.spi.HeaderFilterStrategy を使用してヘッダーをフィルターリングします。
httpMethodRestrict
Netty HTTP コンシューマーで HTTP メソッドを無効にするには、以下を行います。コンマで区切って複数指定できます。
mapHeaders
true
このオプションが有効な場合、Netty から Camel Message へのバインド中にヘッダーもマッピングされます(ヘッダーが Camel Message に追加されます)。このオプションをオフにして無効にすることができます。ヘッダーには、org.apache.camel.component.netty4.http.NettyHttpMessage メッセージから引き続きアクセスできます。このメソッドは getHttpRequest() で Netty HTTP リクエスト io.netty.handler.codec.http.HttpRequest インスタンスを返します。
matchOnUriPrefix
false
完全一致が見つからない場合に Camel が URI 接頭辞と一致することでターゲットコンシューマーの検索を試みるかどうか。詳細につていは以下をご覧ください
nettyHttpBinding
Netty および Camel Message API との間でバインドするためにカスタム org.apache.camel.component.netty4.http.NettyHttpBinding を使用します。
bridgeEndpoint
false
オプションが true の場合、プロデューサーは Exchange.HTTP_URI ヘッダーを無視し、リクエストにエンドポイントの URI を使用します。また、throwExceptionOnFailurefalse に設定して、プロデューサーがすべての障害応答を返信するようにすることもできます。
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 には以下のオプションがあります。
Expand
名前
デフォルト値
説明
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 リクエストを制御できます。
Expand
名前
タイプ
説明
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")...
Expand
名前
タイプ
説明
CamelHttpMethod
String
GET、POST、TRACE などの HTTP メソッド。
CamelHttpUrl
String
プロトコル、ホストおよびポートなどの URL。
http://0.0.0.0:8080/myapp
Copy to Clipboard Toggle word wrap
CamelHttpUri
String
プロトコル、ホストおよびポートなどの URI のない URI。
/myapp
Copy to Clipboard Toggle word wrap
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();
Copy to Clipboard Toggle word wrap

以下のルートでは Netty4 HTTP を HTTP サーバーとして使用し、ハードコーディングされた Bye World メッセージを返します。
    from("netty4-http:http://0.0.0.0:8080/foo")
      .transform().constant("Bye World");
Copy to Clipboard Toggle word wrap
また、以下のように ProducerTemplate で Camel を使用してこの HTTP サーバーを呼び出すこともできます。
    String out = template.requestBody("netty4-http:http://localhost:8080/foo", "Hello World", String.class);
    System.out.println(out);
Copy to Clipboard Toggle word wrap
また、Bye World を出力として返します。

Netty がワイルドカードと一致させる方法

デフォルトでは Netty4 HTTP は正確な URI の場合にのみ一致します。ただし、接頭辞に一致するよう Netty に指示することができます。以下に例を示します。
from("netty4-http:http://0.0.0.0:8123/foo").to("mock:foo");
Copy to Clipboard Toggle word wrap
上記のルートでは、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");
Copy to Clipboard Toggle word wrap
そのため、Netty は foo で始まるすべてのエンドポイントに一致するようになりました。
任意のエンドポイントに一致させる には、以下を実行できます。
from("netty4-http:http://0.0.0.0:8123?matchOnUriPrefix=true").to("mock:foo");
Copy to Clipboard Toggle word wrap

同じポートでの複数ルートの使用

同じ CamelContext で、同じポート(例: io.netty.bootstrap.ServerBootstrap インスタンス)を共有する Netty4 HTTP からの複数のルートを持つことができます。これを実行するには、ルートが同じ io.netty.bootstrap.ServerBootstrap インスタンスを共有するため、複数のブートストラップオプションをルートで同一でなければなりません。インスタンスは、最初に作成したルートからのオプションで設定されます。
ルートが同じでなければならないオプションは、org.apache.camel.component.netty4.NettyServerBootstrapConfiguration 設定クラスで定義されているすべてのオプションです。別のオプションで別のルートを設定した場合、Camel は起動時に例外を出力し、オプションが同一ではないことを示します。これを軽減するには、すべてのオプションが同一であることを確認します。
以下は、同じポートを共有する 2 つのルートを持つ例です。

例120.1 同じポートを共有する 2 つのルート

from("netty4-http:http://0.0.0.0:{{port}}/foo")
  .to("mock:foo")
  .transform().constant("Bye World");

from("netty4-http:http://0.0.0.0:{{port}}/bar")
  .to("mock:bar")
  .transform().constant("Bye Camel");
Copy to Clipboard Toggle word wrap
以下は、1st ルートと同じ org.apache.camel.component.netty4.NettyServerBootstrapConfiguration オプションがない、誤って設定された 2 番目のルートの例です。これにより、起動時に Camel が失敗します。

例120.2 2 つのルートが同じポートを共有しますが、2 番目のルートは設定が間違っているため、開始時に失敗します。

from("netty4-http:http://0.0.0.0:{{port}}/foo")
  .to("mock:foo")
  .transform().constant("Bye World");

// we cannot have a 2nd route on same port with SSL enabled, when the 1st route is NOT
from("netty4-http:http://0.0.0.0:{{port}}/bar?ssl=true")
  .to("mock:bar")
  .transform().constant("Bye Camel");
Copy to Clipboard Toggle word wrap

複数のルートを持つ同じサーバーブートストラップ設定の再利用

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>
Copy to Clipboard Toggle word wrap
以下のように、このオプションを参照するルートで、
<route>
  <from uri="netty4-http:http://0.0.0.0:{{port}}/foo?bootstrapConfiguration=#nettyHttpBootstrapOptions"/>
  ...
</route>

<route>
  <from uri="netty4-http:http://0.0.0.0:{{port}}/bar?bootstrapConfiguration=#nettyHttpBootstrapOptions"/>
  ...
</route>

<route>
  <from uri="netty4-http:http://0.0.0.0:{{port}}/beer?bootstrapConfiguration=#nettyHttpBootstrapOptions"/>
  ...
</route>
Copy to Clipboard Toggle word wrap
詳細は、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>
Copy to Clipboard Toggle word wrap
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 を定義します。
  <bean id="constraint" class="org.apache.camel.component.netty4.http.SecurityConstraintMapping">
    <!-- inclusions defines url -> roles restrictions -->
    <!-- a * should be used for any role accepted (or even no roles) -->
    <property name="inclusions">
      <map>
        <entry key="/*" value="*"/>
        <entry key="/admin/*" value="admin"/>
        <entry key="/guest/*" value="admin,guest"/>
      </map>
    </property>
    <!-- exclusions is used to define public urls, which requires no authentication -->
    <property name="exclusions">
      <set>
        <value>/public/*</value>
      </set>
    </property>
  </bean>
Copy to Clipboard Toggle word wrap
上記の制約は、次のように を定義します。
  • /* へのアクセスは制限され、すべてのロールが受け入れられます(ユーザーにもロールがない場合も同様です)。
  • /admin/* へのアクセスには admin ロールが必要です。
  • /guest/* へのアクセスには、admin ロールまたは guest ロールが必要です。
  • /public/* へのアクセスは、認証が不要であることを意味します。そのため、ログインせずに誰でも公開されます。
この制約を使用するには、以下のように Bean ID を参照する必要があります。
<route>
   <from uri="netty4-http:http://0.0.0.0:{{port}}/foo?matchOnUriPrefix=true&amp;securityConfiguration.realm=karaf&amp;securityConfiguration.securityConstraint=#constraint"/>
   ...
</route>
Copy to Clipboard Toggle word wrap
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

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

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

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

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

会社概要

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

Theme

© 2025 Red Hat