第119章 Netty HTTP


Netty HTTP コンポーネント

Camel 2.12 以降で利用可能
netty-http コンポーネントは Netty コンポーネントへの拡張であり、Netty で HTTP トランスポートを容易にします。
この Camel コンポーネントは、プロデューサーとコンシューマーエンドポイントの両方をサポートします。
Netty 4.0 の計画アップグレード
このコンポーネントは、camel-netty4 コンポーネントのアップグレードが完了したときに Netty 4.0 を使用するようにアップグレードすることが意図されています。現時点では、このコンポーネントは Netty 3.x をベースとしています。アップグレードは、可能な限り後方互換性があることを目的としています。
ストリーム
Netty はストリームベースであり、受信する入力がストリームとして Camel に送信されることを意味します。つまり、ストリームのコンテンツを 1 度 だけ読み取ることができます。メッセージボディーが空であるように見える場合や、データに複数回アクセスする必要がある場合(例:マルチキャストの実行、再配信エラー処理)は、Stream Caching を使用するか、メッセージボディーを複数回再読み取りできる 文字列 に変換する必要があります。
Maven ユーザーは、このコンポーネントの pom.xml に以下の依存関係を追加する必要があります。
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-netty-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 スキームは以下のとおりです。
netty-http:http://localhost:8080[?options]
Copy to Clipboard Toggle word wrap
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 コンポーネントを使用する場合に適用されないことに注意してください。
Expand
名前 デフォルト値 説明
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 を使用します。また、throwExceptionOnFailurefalse に設定して、プロデューサーがすべての障害応答を返信するようにすることもできます。ブリッジモードで動作しているコンシューマーは、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 には以下のオプションがあります。
Expand
名前 デフォルト値 説明
認証 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 リクエストを制御できます。
Expand
名前 タイプ 説明
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")... を持つルートのオフセットを取ります。
Expand
名前 タイプ 説明
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.NettyHttpMessageExchange のメッセージ実装として使用します。これにより、エンドユーザーは以下のように元の Netty 要求/応答インスタンスにアクセスできます。元の応答は常にアクセスできない可能性があることに注意してください。
org.jboss.netty.handler.codec.http.HttpRequest request = exchange.getIn(NettyHttpMessage.class).getHttpRequest();
Copy to Clipboard Toggle word wrap

以下のルートでは Netty HTTP を HTTP サーバーとして使用し、ハードコーディングされた Bye World メッセージを返します。
    from("netty-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("netty-http:http://localhost:8080/foo", "Hello World", String.class);
    System.out.println(out);
Copy to Clipboard Toggle word wrap
また、Bye World を出力として返します。

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

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

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

同じ CamelContext で、同じポート( org.jboss.netty.bootstrap.ServerBootstrap インスタンスなど)を共有する Netty HTTP からの複数のルートを持つことができます。これを実行するには、ルートが同じ org.jboss.netty.bootstrap.ServerBootstrap インスタンスを共有するため、複数のブートストラップオプションをルートで同一にする必要があります。インスタンスは、最初に作成したルートからのオプションで設定されます。
ルートが同じでなければならないオプションは、org.apache.camel.component.netty.NettyServerBootstrapConfiguration 設定クラスで定義されたすべてのオプションです。別のオプションで別のルートを設定した場合、Camel は起動時に例外を出力し、オプションが同一ではないことを示します。これを軽減するには、すべてのオプションが同一であることを確認します。
以下は、同じポートを共有する 2 つのルートを持つ例です。
同じポートを共有する 2 つのルート
from("netty-http:http://0.0.0.0:{{port}}/foo")
  .to("mock:foo")
  .transform().constant("Bye World");

from("netty-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.netty.NettyServerBootstrapConfiguration オプションを持たない、誤って設定された 2 番目のルートの例です。これにより、起動時に Camel が失敗します。
2 つのルートが同じポートを共有しますが、2 番目のルートは設定が間違っているため、開始時に失敗します。
from("netty-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("netty-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.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>
Copy to Clipboard Toggle word wrap
以下のように、このオプションを参照するルートで、
<route>
  <from uri="netty-http:http://0.0.0.0:{{port}}/foo?bootstrapConfiguration=#nettyHttpBootstrapOptions"/>
  ...
</route>

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

<route>
  <from uri="netty-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="netty-http:http://0.0.0.0:{{port}}/foo?securityConfiguration.realm=karaf"/>
   ...
</route>
Copy to Clipboard Toggle word wrap
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 を定義します。
  <bean id="constraint" class="org.apache.camel.component.netty.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="netty-http:http://0.0.0.0:{{port}}/foo?matchOnUriPrefix=true&ecurityConfiguration.realm=karaf&ecurityConfiguration.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