第70章 HTTP


HTTP コンポーネント

http: コンポーネントは HTTP ベースの エンドポイント を提供し、外部の HTTP リソース(HTTP を使用して外部サーバーを呼び出すクライアントとして)を消費します。
Maven ユーザーは、このコンポーネントの pom.xml に以下の依存関係を追加する必要があります。
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-http</artifactId>
    <version>2.17.0.redhat-630xxx</version>
    <!-- use the same version as your Camel core version -->
</dependency>
Copy to Clipboard Toggle word wrap

URI 形式

http:hostname[:port][/resourceUri][?param1=value1][&param2=value2]
Copy to Clipboard Toggle word wrap
デフォルトでは、HTTP にポート 80 を使用し、HTTPS には 443 を使用します。
camel-http vs camel-jetty
生成できるのは、HTTP コンポーネントによって生成されたエンドポイントのみです。そのため、Camel ルートへの入力としては使用しないでください。HTTP エンドポイントを Camel ルートへの入力として HTTP サーバー経由でバインド/公開するには、Jetty コンポーネントまたは Servlet コンポーネント を使用できます。

POST を使用してボディーで url を呼び出して、応答を out メッセージとして返します。if body が GET を使用して null 呼び出し URL で、応答を out メッセージとして返します。
Expand
Java DSL Spring DSL
from("direct:start")
  .to("http://myhost/mypath");
Copy to Clipboard Toggle word wrap
<from uri="direct:start"/>
<to uri="http://oldhost"/>
Copy to Clipboard Toggle word wrap
ヘッダーを追加することで、HTTP エンドポイント URI を上書きできます。Camel は http://newhost を呼び出します。これは、REST urls などに非常に便利です。
Expand
Java DSL
from("direct:start")
  .setHeader(Exchange.HTTP_URI, simple("http://myserver/orders/${header.orderId}"))
  .to("http://dummyhost");
Copy to Clipboard Toggle word wrap
URI パラメーターは、エンドポイント URI またはヘッダーとして直接設定できます。
Expand
Java DSL
from("direct:start")
  .to("http://oldhost?order=123&detail=short");
from("direct:start")
  .setHeader(Exchange.HTTP_QUERY, constant("order=123&detail=short"))
  .to("http://oldhost");
Copy to Clipboard Toggle word wrap
HTTP リクエストメソッドを POST に設定します。
Expand
Java DSL Spring DSL
from("direct:start")
  .setHeader(Exchange.HTTP_METHOD, constant("POST"))
  .to("http://www.google.com");
Copy to Clipboard Toggle word wrap
<from uri="direct:start"/>
<setHeader headerName="CamelHttpMethod">
  <constant>POST</constant>
</setHeader>
<to uri="http://www.google.com"/>
<to uri="mock:results"/>
Copy to Clipboard Toggle word wrap

HTTPEndpoint オプション

Expand
名前 デフォルト値 説明
throwExceptionOnFailure true リモートサーバーからの応答が失敗した場合に HttpOperationFailedException を出力することを無効にするオプション。これにより、HTTP ステータスコードに関係なくすべての応答を取得できます。
bridgeEndpoint false
オプションが true の場合、HttpProducer は Exchange.HTTP_URI ヘッダーを無視し、リクエストにエンドポイントの URI を使用します。また、throwExceptionOnFailure を false に設定して、HttpProducer がすべての障害応答を返信するようにすることもできます。Camel 2.3: オプションが true の場合、content-encoding が gzip の場合、HttpProducer および CamelServlet は gzip 処理をスキップします。
disableStreamCache false DefaultHttpBinding は、要求入力ストリームをストリームキャッシュにコピーし、このオプションが 2 回読み取りをサポートする場合はメッセージボディーに配置します。それ以外の場合は、DefaultHttpBinding は要求入力ストリームをメッセージボディーに設定します。Camel 2.17: このオプションは、デフォルトでストリームキャッシングではなく、応答ストリームを直接使用できるようにプロデューサーによってもサポートされるようになりました。
httpBinding null レジストリーの org.apache.camel.component.http.HttpBinding への参照。
httpClientConfigurer null レジストリーの org.apache.camel.component.http.HttpClientConfigurer への参照。
httpClient.XXX null HttpClientParams でオプションの設定たとえば、httpClient.soTimeout=5000SO_TIMEOUT を 5 秒に設定します。
clientConnectionManager null カスタムの org.apache.http.conn.ClientConnectionManager を使用するには、以下を行います。
transferException false Camel 2.6: 有効で、エクスチェンジ がコンシューマー側で処理に失敗した場合、発生した 例外application/x-java-serialized-object コンテンツタイプとして応答でシリアライズされた場合は( Jetty または Servlet Camel コンポーネントを使用)。プロデューサー側では、例外がデシリアライズされ、HttpOperationFailedException ではなくそのまま出力されます。原因となった例外はシリアライズする必要があります。
headerFilterStrategy null Camel 2.11: レジストリーの org.apache.camel.spi.HeaderFilterStrategy のインスタンスへの参照。これは、新しい create HttpEndpoint にカスタム headerFilterStrategy を適用するために使用されます。
eagerCheckContentAvailable false Camel 2.15.3/2.16: コンシューマーのみ。Content-Length ヘッダーが 0 の場合、HTTP リクエストにコンテンツがあるかどうかを即時にチェックするかどうか。HTTP クライアントがストリームデータを送信しない場合に、この機能を有効にできます。
copyHeaders true Camel 2.16: true の場合、コピーストラテジーに従って OUT エクスチェンジヘッダーにコピーされます。false の場合、HTTP 応答からのヘッダーのみが含まれます(IN ヘッダーはコピーされません)。
okStatusCodeRange 200-299 Camel 2.16: 正常な応答と見なされるステータスコード。値は含まれます。範囲は、構文 from-to を使用して定義する必要があります。
ignoreResponseBody false Camel 2.16: true の場合、http プロデューサーは応答ボディーを読み取りせず、入力ストリームをキャッシュします。

認証およびプロキシー

以下の認証オプションを HttpEndpoint に設定できます。
Expand
名前 デフォルト値 説明
authMethod null BasicDigest、または NTLM のいずれかの認証方法。
authMethodPriority null 認証方法の優先度。はコンマで区切られたリストです。例: NTLM を除外する Basic,Digest
authUsername null 認証用のユーザー名
authPassword null 認証のパスワード
authDomain null NTML 認証のドメイン
authHost null NTML 認証のオプションのホスト
proxyHost null プロキシーのホスト名
proxyPort null プロキシーポート番号
proxyAuthMethod null プロキシーの認証方法( Basic Digest または NTLM のいずれか)。
proxyAuthUsername null プロキシー認証用のユーザー名
proxyAuthPassword null プロキシー認証のパスワード
proxyAuthDomain null プロキシー NTML 認証のドメイン
proxyAuthHost null プロキシー NTML 認証のオプションホスト
認証を使用する場合は、authMethod オプションまたは authProxyMethod オプションのメソッドを選択する 必要 があります。プロキシーおよび認証の詳細は、HttpComponent または HttpEndoint のいずれかに設定できます。HttpEndpoint で指定される値は、HttpComponent よりも優先されます。これを 1 回実行できる HttpComponent で設定する最も適しています。
HTTP コンポーネントは設定よりも規則を使用することを意味します。つまり、authMethodPriority を明示的に設定していない場合は、select (ed) authMethod を priority としても使用します。そのため、authMethod.Basic を使用する場合、auhtMethodPriorityBasic のみになります。
注記
Camel HTTP コンポーネントは HttpClient v3.x をベースとしているため、NTLM プロトコルの初期バージョンである NTLMv1 と呼ばれる サポートのみに限定 されます。NTLMv2 をサポートしていません。Camel HTTP4 コンポーネントには、NTLMv2 のサポートがあります。

HttpComponent オプション

Expand
名前 デフォルト値 説明
httpBinding null カスタムの org.apache.camel.component.http.HttpBinding を使用するには、以下を行います。
httpClientConfigurer null カスタムの org.apache.camel.component.http.HttpClientConfigurer を使用するには、以下を行います。
httpConnectionManager null カスタムの org.apache.commons.httpclient.HttpConnectionManager を使用するには、以下を行います。
httpConfiguration null カスタムの org.apache.camel.component.http.HttpConfigurationを使用するには、以下を行います。
allowJavaSerializedObject false
Camel 2.16.1/2.15.5: リクエストが context-type=application/x-java-serialized-object を使用している場合に Java のシリアル化を許可するかどうか。このオプションはデフォルトでオフになっています。警告: このオプションを有効にすると、Java はリクエストから Java に受信データをデシリアライズし、セキュリティーリスクとなる可能性があることに注意してください。

メッセージヘッダー

Expand
名前 タイプ 説明
Exchange.HTTP_URI 文字列 呼び出す URI。エンドポイントに設定された既存の URI を直接上書きします。この URI は、呼び出す HTTP サーバーの URI です。セキュリティーなどのエンドポイントオプションを設定できる Camel エンドポイント URI とは異なります。このヘッダーは、HTTP サーバーの UTI のみをサポートしません。
Exchange.HTTP_METHOD 文字列 使用する HTTP メソッド/Verb (GET/POST/PUT/DELETE/HEAD/OPTIONS/TRACE)
Exchange.HTTP_PATH 文字列 リクエスト URI のパス。ヘッダーは HTTP_URI でリクエスト URI を構築するために使用されます。Camel 2.3.0: パスが "/ で始まる場合、http プロデューサーは Exchange.HTTP_BASE_URI ヘッダーまたは exchange.getFromEndpoint ().getEndpointUri (); に基づいて相対パスの検索を試みます。
Exchange.HTTP_QUERY 文字列 URI パラメーター。エンドポイントで直接設定された既存の URI パラメーターを上書きします。
Exchange.HTTP_RESPONSE_CODE int 外部サーバーからの HTTP 応答コード。OK の場合は 200 です。
Exchange.HTTP_CHARACTER_ENCODING 文字列 文字エンコーディング。
Exchange.CONTENT_TYPE 文字列 HTTP コンテンツタイプ。は IN メッセージと OUT メッセージの両方で設定され、text/html などのコンテンツタイプを提供します。
Exchange.CONTENT_ENCODING 文字列 HTTP コンテンツエンコーディング。は IN メッセージと OUT メッセージの両方で設定され、gzip などのコンテンツエンコーディングを提供します。
Exchange.HTTP_SERVLET_REQUEST HttpServletRequest HttpServletRequest オブジェクト。
Exchange.HTTP_SERVLET_RESPONSE HttpServletResponse HttpServletResponse オブジェクト。
Exchange.HTTP_PROTOCOL_VERSION 文字列 Camel 2.5: このヘッダーで http プロトコルバージョンを設定できます(例:)。"HTTP/1.0"。ヘッダーを指定しないと、HttpProducer はデフォルト値 HTTP/1.1 を使用します。
上記のヘッダー名は定数です。Spring DSL では、名前の代わりに定数の値を使用する必要があります。

メッセージボディー

Camel は外部サーバーからの HTTP 応答を OUT ボディーに保存します。IN メッセージからのヘッダーはすべて OUT メッセージにコピーされ、ルーティング中にヘッダーが保持されます。さらに、Camel は HTTP 応答ヘッダーと OUT メッセージヘッダーを追加します。

レスポンスコード

Camel は HTTP 応答コードに従って処理されます。
  • レスポンスコードは 100..299 の範囲にあり、Camel は応答の成功と見なします。
  • 応答コードは 300..399 の範囲にあり、Camel はこれをリダイレクト応答とみなし、その情報とともに HttpOperationFailedException を出力します。
  • 応答コードは 400+ で、Camel はこれを外部サーバーの障害と見なし、この情報とともに HttpOperationFailedException を出力します。
    throwExceptionOnFailure
    オプション throwExceptionOnFailurefalse に設定すると、失敗したレスポンスコードに対して HttpOperationFailedException が出力されないようにすることができます。これにより、リモートサーバーから応答を取得できるようになります。デモには、以下の例があります。

HttpOperationFailedException

この例外には、以下の情報が含まれます。
  • HTTP ステータスコード
  • HTTP ステータス行 (ステータスコードのテキスト)
  • サーバーがリダイレクトを返した場合は、場所をリダイレクトします
  • 応答ボディー( java.lang.String ) (サーバーがボディーを応答として提供)

GET または POST を使用した呼び出し

以下のアルゴリズムは、GET または POST HTTP メソッドのいずれかを使用する必要があるかどうかを判断するために使用されます:1。ヘッダーで提供されるメソッドを使用します。2.クエリー文字列がヘッダーで提供される場合は GET。3.エンドポイントがクエリー文字列で設定されている場合の GET。4.送信するデータがある場合は POST します(null ではありません)。5.それ以外の場合は GET

HttpServletRequest および HttpServletResponse にアクセスする方法

これらの 2 つにアクセスするには、を使用すると Camel 型コンバーターシステムを使用できます。
HttpServletRequest request = exchange.getIn().getBody(HttpServletRequest.class);
HttpServletRequest response = exchange.getIn().getBody(HttpServletResponse.class);
Copy to Clipboard Toggle word wrap

クライアントタイムアウトの使用 - SO_TIMEOUT

このリンクのユニットテストを参照してください。

プロキシーの設定

Expand
Java DSL
from("direct:start")
  .to("http://oldhost?proxyHost=www.myproxy.com&proxyPort=80");
Copy to Clipboard Toggle word wrap
proxyUsername および proxyPassword オプションを使用したプロキシー認証にも対応しています。

URI の外部でプロキシー設定の使用

Expand
Java DSL Spring DSL
 context.getProperties().put("http.proxyHost", "172.168.18.9");
 context.getProperties().put("http.proxyPort" "8080");
Copy to Clipboard Toggle word wrap
   <camelContext>
       <properties>
           <property key="http.proxyHost" value="172.168.18.9"/>
           <property key="http.proxyPort" value="8080"/>
      </properties>
   </camelContext>
Copy to Clipboard Toggle word wrap
Endpoint のオプションは、コンテキストのオプションを上書きします。

charset の設定

POST を使用してデータを送信する場合は、charsetを設定できます。
setProperty(Exchange.CHARSET_NAME, "iso-8859-1");
Copy to Clipboard Toggle word wrap

スケジュールされたポーリングを使用したサンプル

この例は、Google ホームページを 10 秒ごとにポーリングし、そのページを file. html ファイルに書き込みます。
from("timer://foo?fixedRate=true&delay=0&period=10000")
    .to("http://www.google.com")
    .setHeader(FileComponent.HEADER_FILE_NAME, "message.html").to("file:target/google");
Copy to Clipboard Toggle word wrap

レスポンスコードの取得

HTTP コンポーネントから HTTP 応答コードを取得するには、Out メッセージヘッダーと Exchange.HTTP_RESPONSE_CODE の値を取得します。
   Exchange exchange = template.send("http://www.google.com/search", new Processor() {
            public void process(Exchange exchange) throws Exception {
                exchange.getIn().setHeader(Exchange.HTTP_QUERY, constant("hl=en&q=activemq"));
            }
   });
   Message out = exchange.getOut();
   int responseCode = out.getHeader(Exchange.HTTP_RESPONSE_CODE, Integer.class);
Copy to Clipboard Toggle word wrap

throwExceptionOnFailure=false を使用して応答を返す

以下のルートでは、リモート HTTP 呼び出しから返されたデータで 補完 するメッセージをルーティングします。リモートサーバーからの応答が必要な場合、throwExceptionOnFailure オプションを false に設定して、AggregationStrategy で応答を取得します。コードは HTTP ステータスコード 404 をシミュレートするユニットテストをベースにしているため、アサーションコードなどがいくつかあります。
// We set throwExceptionOnFailure to false to let Camel return any response from the remove HTTP server without thrown
// HttpOperationFailedException in case of failures.
// This allows us to handle all responses in the aggregation strategy where we can check the HTTP response code
// and decide what to do. As this is based on an unit test we assert the code is 404
from("direct:start").enrich("http://localhost:{{port}}/myserver?throwExceptionOnFailure=false&user=Camel", new AggregationStrategy() {
    public Exchange aggregate(Exchange original, Exchange resource) {
        // get the response code
        Integer code = resource.getIn().getHeader(Exchange.HTTP_RESPONSE_CODE, Integer.class);
        assertEquals(404, code.intValue());
        return resource;
    }
}).to("mock:result");

// this is our jetty server where we simulate the 404
from("jetty://http://localhost:{{port}}/myserver")
        .process(new Processor() {
            public void process(Exchange exchange) throws Exception {
                exchange.getOut().setBody("Page not found");
                exchange.getOut().setHeader(Exchange.HTTP_RESPONSE_CODE, 404);
            }
        });
Copy to Clipboard Toggle word wrap

Cookie の無効化

Cookie を無効にするには、URI オプション httpClient.cookiePolicy=ignoreCookiesを追加して HTTP Client が Cookie を無視するように設定します。

高度な使用方法

HTTP プロデューサーをより詳細に制御する必要がある場合は、HttpComponent を使用する必要があります。ここで、さまざまなクラスを設定してカスタム動作を提供できます。

MaxConnectionsPerHost の設定

HTTP コンポーネントには org.apache.commons.httpclient.HttpConnectionManager があります。ここでは、指定のコンポーネントの各種のグローバル設定を設定できます。グローバルでは、コンポーネントによって作成されるエンドポイントに同じ HttpConnectionManager があることを意味します。したがって、ホストごとに max 接続に異なる値を設定する場合は、通常使用するエンドポイント URI では なく、HTTP コンポーネントで定義する必要があります。そのため、以下のようになります。
まず、Spring XML で http コンポーネントを定義します。はい、同じスキーム名 http を使用します。そうしないと、Camel はデフォルト設定でコンポーネントを自動検出して作成します。必要なものは、このオプションを設定できるように、これをオーバールールすることです。以下の例では、max 接続をデフォルトの 2 ではなく 5 に設定します。
<bean id="http" class="org.apache.camel.component.http.HttpComponent">
    <property name="camelContext" ref="camel"/>
    <property name="httpConnectionManager" ref="myHttpConnectionManager"/>
</bean>

<bean id="myHttpConnectionManager" class="org.apache.commons.httpclient.MultiThreadedHttpConnectionManager">
    <property name="params" ref="myHttpConnectionManagerParams"/>
</bean>

<bean id="myHttpConnectionManagerParams" class="org.apache.commons.httpclient.params.HttpConnectionManagerParams">
    <property name="defaultMaxConnectionsPerHost" value="5"/>
</bean>

Copy to Clipboard Toggle word wrap
次に、ルート内で通常通り使用できます。
<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring" trace="true">
    <route>
        <from uri="direct:start"/>
        <to uri="http://www.google.com"/>
        <to uri="mock:result"/>
    </route>
</camelContext>
Copy to Clipboard Toggle word wrap

プリエンプション認証の使用

エンドユーザーは、HTTPS での認証に問題があることを報告していました。この問題は最終的に、HTTPS サーバーが HTTP コード 401 Authorization Required を返しなかったときに解決されました。解決策は、httpClient.authenticationPreemptive=trueの URI オプションを設定することでした。

リモートサーバーからの自己署名証明書の許可

Apache Commons HTTP API でこれを行う方法については、いくつかのコードに関するメーリングリストの リンク を参照してください。

JSSE 設定ユーティリティーの使用

Camel 2.8 以降、HTTP4 コンポーネントは JSSE ユーティリティー を介して SSL/TLS 設定をサポートします。このユーティリティーは、作成する必要のあるコンポーネント固有のコードの量を大幅に減らし、エンドポイントおよびコンポーネントレベルで設定可能です。 以下の例は、HTTP4 コンポーネントで ユーティリティーを使用する方法を示しています。Security Guide の Configuring Transport Security for Camel Components の章を参照してください
このコンポーネントで使用される Apache HTTP クライアントのバージョンは、グローバルプロトコルレジストリーから SSL/TLS 情報を解決します。 このコンポーネントは、Camel JSSE Configuration ユーティリティーの使用をサポートするために、HTTP クライアントのプロトコルソケットファクトリーの実装 org.apache.camel.component.http.SSLContextParametersSecureProtocolSocketFactory を提供します。 以下の例は、プロトコルレジストリーを設定し、登録されたプロトコル情報をルートで使用する方法を示しています。
KeyStoreParameters ksp = new KeyStoreParameters();
ksp.setResource("/users/home/server/keystore.jks");
ksp.setPassword("keystorePassword");

KeyManagersParameters kmp = new KeyManagersParameters();
kmp.setKeyStore(ksp);
kmp.setKeyPassword("keyPassword");

SSLContextParameters scp = new SSLContextParameters();
scp.setKeyManagers(kmp);

ProtocolSocketFactory factory =
    new SSLContextParametersSecureProtocolSocketFactory(scp);

Protocol.registerProtocol("https",
        new Protocol(
        "https",
        factory,
        443));

from("direct:start")
        .to("https://mail.google.com/mail/").to("mock:results");
Copy to Clipboard Toggle word wrap

Apache HTTP クライアントを直接設定

基本的に、HTTP コンポーネントは Apache HTTP クライアントの上に構築され、カスタム org.apache.camel.component.http.HttpClientConfigurer を実装し、完全な制御が必要な場合に http クライアントで一部の設定を行うことができます。
ただし、キーストアとトラストストアを指定する だけ の場合は、Apache HTTP HttpClientConfigurer でこれを行うことができます。以下に例を示します。
Protocol authhttps = new Protocol("https", new AuthSSLProtocolSocketFactory(
  new URL("file:my.keystore"), "mypassword",
  new URL("file:my.truststore"), "mypassword"), 443);

Protocol.registerProtocol("https", authhttps);
Copy to Clipboard Toggle word wrap
次に、HttpClientConfigurer を実装するクラスを作成し、上記の例ごとにキーストアまたはトラストストアを提供する https プロトコルを登録する必要があります。次に、Camel ルートビルダークラスから、以下のようにフックできます。
HttpComponent httpComponent = getContext().getComponent("http", HttpComponent.class);
httpComponent.setHttpClientConfigurer(new MyHttpClientConfigurer());
Copy to Clipboard Toggle word wrap
Spring DSL を使用してこれを実行する場合は、URI を使用して HttpClientConfigurer を指定できます。以下に例を示します。
<bean id="myHttpClientConfigurer"
 class="my.https.HttpClientConfigurer">
</bean>

<to uri="https://myhostname.com:443/myURL?httpClientConfigurerRef=myHttpClientConfigurer"/>
Copy to Clipboard Toggle word wrap
上記のように HttpClientConfigurer を実装し、キーストアとトラストストアを設定すると問題なく機能します。
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

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

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

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

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

会社概要

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

Theme

© 2025 Red Hat