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.第70章 HTTP
HTTP コンポーネント リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
http: コンポーネントは HTTP ベースの エンドポイント を提供し、外部の HTTP リソース(HTTP を使用して外部サーバーを呼び出すクライアントとして)を消費します。
Maven ユーザーは、このコンポーネントの
pom.xml
に以下の依存関係を追加する必要があります。
URI 形式 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
http:hostname[:port][/resourceUri][?param1=value1][¶m2=value2]
http:hostname[:port][/resourceUri][?param1=value1][¶m2=value2]
デフォルトでは、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 メッセージとして返します。
Java DSL | Spring DSL |
---|---|
from("direct:start") .to("http://myhost/mypath");
|
<from uri="direct:start"/> <to uri="http://oldhost"/>
|
ヘッダーを追加することで、HTTP エンドポイント URI を上書きできます。Camel は http://newhost を呼び出します。これは、REST urls などに非常に便利です。
Java DSL |
---|
from("direct:start") .setHeader(Exchange.HTTP_URI, simple("http://myserver/orders/${header.orderId}")) .to("http://dummyhost");
|
URI パラメーターは、エンドポイント URI またはヘッダーとして直接設定できます。
Java DSL |
---|
|
HTTP リクエストメソッドを POST に設定します。
Java DSL | Spring DSL |
---|---|
from("direct:start") .setHeader(Exchange.HTTP_METHOD, constant("POST")) .to("http://www.google.com");
|
|
HTTPEndpoint オプション リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
名前 | デフォルト値 | 説明 |
---|---|---|
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=5000 は SO_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 に設定できます。
名前 | デフォルト値 | 説明 |
---|---|---|
authMethod
|
null
|
Basic 、Digest 、または 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
を使用する場合、auhtMethodPriority
は Basic
のみになります。
注記
Camel HTTP コンポーネントは HttpClient v3.x をベースとしているため、NTLM プロトコルの初期バージョンである NTLMv1 と呼ばれる サポートのみに限定 されます。NTLMv2 をサポートしていません。Camel HTTP4 コンポーネントには、NTLMv2 のサポートがあります。
HttpComponent オプション リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
名前 | デフォルト値 | 説明 |
---|---|---|
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 に受信データをデシリアライズし、セキュリティーリスクとなる可能性があることに注意してください。
|
メッセージヘッダー リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
名前 | タイプ | 説明 |
---|---|---|
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オプションthrowExceptionOnFailure
をfalse
に設定すると、失敗したレスポンスコードに対して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);
HttpServletRequest request = exchange.getIn().getBody(HttpServletRequest.class);
HttpServletRequest response = exchange.getIn().getBody(HttpServletResponse.class);
クライアントタイムアウトの使用 - SO_TIMEOUT リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
このリンクのユニットテストを参照してください。
プロキシーの設定 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Java DSL |
---|
from("direct:start") .to("http://oldhost?proxyHost=www.myproxy.com&proxyPort=80");
|
proxyUsername
および proxyPassword
オプションを使用したプロキシー認証にも対応しています。
URI の外部でプロキシー設定の使用 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Java DSL | Spring DSL |
---|---|
context.getProperties().put("http.proxyHost", "172.168.18.9"); context.getProperties().put("http.proxyPort" "8080");
|
|
Endpoint のオプションは、コンテキストのオプションを上書きします。
charset の設定 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
POST
を使用してデータを送信する場合は、charset
を設定できます。
setProperty(Exchange.CHARSET_NAME, "iso-8859-1");
setProperty(Exchange.CHARSET_NAME, "iso-8859-1");
スケジュールされたポーリングを使用したサンプル リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
この例は、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");
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");
レスポンスコードの取得 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
HTTP コンポーネントから HTTP 応答コードを取得するには、Out メッセージヘッダーと
Exchange.HTTP_RESPONSE_CODE
の値を取得します。
throwExceptionOnFailure=false を使用して応答を返す リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
以下のルートでは、リモート HTTP 呼び出しから返されたデータで 補完 するメッセージをルーティングします。リモートサーバーからの応答が必要な場合、
throwExceptionOnFailure
オプションを false
に設定して、AggregationStrategy
で応答を取得します。コードは HTTP ステータスコード 404 をシミュレートするユニットテストをベースにしているため、アサーションコードなどがいくつかあります。
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 に設定します。
次に、ルート内で通常通り使用できます。
プリエンプション認証の使用 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
エンドユーザーは、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
を提供します。 以下の例は、プロトコルレジストリーを設定し、登録されたプロトコル情報をルートで使用する方法を示しています。
Apache HTTP クライアントを直接設定 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
基本的に、HTTP コンポーネントは Apache HTTP クライアントの上に構築され、カスタム
org.apache.camel.component.http.HttpClientConfigurer
を実装し、完全な制御が必要な場合に http クライアントで一部の設定を行うことができます。
ただし、キーストアとトラストストアを指定する だけ の場合は、Apache HTTP
HttpClientConfigurer
でこれを行うことができます。以下に例を示します。
次に、
HttpClientConfigurer
を実装するクラスを作成し、上記の例ごとにキーストアまたはトラストストアを提供する https プロトコルを登録する必要があります。次に、Camel ルートビルダークラスから、以下のようにフックできます。
HttpComponent httpComponent = getContext().getComponent("http", HttpComponent.class); httpComponent.setHttpClientConfigurer(new MyHttpClientConfigurer());
HttpComponent httpComponent = getContext().getComponent("http", HttpComponent.class);
httpComponent.setHttpClientConfigurer(new MyHttpClientConfigurer());
Spring DSL を使用してこれを実行する場合は、URI を使用して
HttpClientConfigurer
を指定できます。以下に例を示します。
上記のように HttpClientConfigurer を実装し、キーストアとトラストストアを設定すると問題なく機能します。