注意:このページは「 http://camel.apache.org/ 」のCamel ver.2.9.2時点での日本語訳です。 誤訳が含まれていますので、正確な情報が欲しい人は本家サイトを参照してください。

HTTP4コンポーネント


HTTP4コンポーネントはHTTPクライアントとして動作します。
Camel ver.2.9.2 ではHttpClient 4.1.3 ( http://hc.apache.org/ )を利用しています。

Mavenユーザは次のdependencyをpom.xmlに追加する必要があります。

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-http4</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

Camel-http4 vs camel-http
Camel-http4 は HttpClient 4.x を使い、camel-http は HttpClient 3.x を使っています。

URIフォーマット

http4:hostname[:port][/resourceUri][?options]

portのデフォルト値はHTTPで80、HTTPSで443になります。

ユーザーはクエリオプションをURIに次のフォーマットで追加する事ができます。

?option=value&option=value&...
camel-http4 vs camel-jetty
ユーザーはHTTP4コンポーネントを使ってエンドポイントの送信側だけは作る事ができます。しかし、Camelルートの入力としては使えません。Camelルートの入力としてHTTPサーバを使ったHTTPエンドポイントを置きたい場合はJettyコンポーネントを使います。

HTTPエンドポイントのオプション

名前 デフォルト値 説明
x509HostnameVerifier BrowserCompatHostnameVerifier Camel 2.7以降:ユーザーはRegistryにある異なったorg.apache.http.conn.ssl.X509HostnameVerifierインスタンスを参照する事ができます。例えば、org.apache.http.conn.ssl.StrictHostnameVerifier や org.apache.http.conn.ssl.AllowAllHostnameVerifier.
throwExceptionOnFailure true リモートサーバからの失敗レスポンスの時、HttpOperationFailedException を投げるのを無効にするオプション。これはHTTPステータスコードにかかわらずユーザーが全てのレスポンスを取得する事ができます。
bridgeEndpoint false trueの場合、HttpProducerはExchange.HTTP_URIヘッダを無視する事ができます。そしてエンドポインのURIをリクエストとして使います。さらに、全ての失敗レスポンス戻りをHttpProducerに送り出させる為にthrowExcpetionOnFailure をfalseにセットするかもしれません。もしtrueに設定した場合、content-encodingが"gzip"の場合にHttpProducerCamelServletはgzip処理をスキップします。
disableStreamCache false このオプションをfalseにセットした場合、DefaultHttpBindingはリクエスト入力ストリームをストリームキャッシュにコピーして、メッセージボディにセットします。これでマルチ読み込みをサポートできます。そうでない場合、DefaultHttpBindingはリクエストの入力ストリームをメッセージボディに直接的にセットします。
httpBindingRef null Registry内の org.apache.camel.component.http.HttpBindingを参照する。httpBinding オプションをかわりに使う事をおすすめする
httpBinding null カスタムorg.apache.camel.component.http.HttpBinding.に使う
httpClientConfigurerRef null Registry内の org.apache.camel.component.http.HttpClientConfigurerを参照する。httpClientConfigurerオプションを代わりに使う事をおすすめする。
httpContext null Camel 2.9.2以降:
httpContextRef null Camel 2.9.2以降:
httpClientConfigurer null
httpClient.XXX null
clientConnectionManager null
transferException false
maxTotalConnections 200
connectionsPerRoute 20
sslContextParametersRef null Camel 2.8以降:

ベーシック認証とプロキシ

Camel 2.8.0以降

名前 デフォルト値 説明
authUsername null 認証用のユーザー名
authPassword null 認証用のパスワード
authDomain null 認証用のドメイン名
authHost null 認証用のホスト名
proxyAuthHost null プロキシホスト名
proxyAuthPort null プロキシポート名
proxyAuthScheme null プロキシスキーム
proxyAuthUsername null プロキシ認証用のユーザー名
proxyAuthPassword null プロキシ認証用のパスワード
proxyAuthDomain null プロキシドメイン名
proxyAuthNtHost null プロキシNTホスト名

Httpコンポーネントオプション

名前 デフォルト値 説明
httpBinding null カスタムorg.apache.camel.component.http.HttpBindingに使用
httpClientConfigurer null カスタムorg.apache.camel.component.http.HttpClientConfigurerに使用
httpConnectionManager null カスタムorg.apache.commons.httpclient.HttpConnectionManager.に使用
httpContext null Camel 2.9.2以降:リクエスト実行時にカスタムorg.apache.http.protocol.HttpContextに使用
x509HostnameVerifier null Camel 2.7以降:カスタムorg.apache.http.conn.ssl.X509HostnameVerifier.に使用
sslContextParameters null Camel 2.8以降:コンポーネントレベルでカスタムSSL/TLS設定オプションを設定。より詳細は「JSSE設定ユーティリティを使用」を参照

メッセージヘッダ

名前 デフォルト値 説明
Exchange.HTTP_URI String 呼び出す用のURI。エンドポイントに直接的にセットして既存のURIを上書きします。
Exchange.HTTP_PATH String リクエストURIパス。このヘッダはHTTP_URIと一緒にリクエストURIを構築する為に使われます。
Exchange.HTTP_QUERY String URIパラメータ。エンドポイント上に直接設定して既存のURIパラメータを上書きします。
Exchange.HTTP_RESPONSE_CODE int 外部サーバからのHTTPレスポンスコード。OKの場合は200です。
Exchange.HTTP_CHARACTER_ENCODING String 文字エンコーディング
Exchange.CONTENT_TYPE String HTTP content type. content typeを指定する為にメッセージのINとOUt両方にセットされます。例えばtext/html
Exchange.CONTENT_ENCODING String HTTP contentエンコーディング。contentエンコーディングを指定する為に、メッセージのINとOUTにセットされます。例えばgzip

メッセージボディ

Camelは外部サーバからのHTTPレスポンスをボディのOUTに保存します。メッセージのINからの全てのヘッダはメッセージのOUTにコピーされます。 これで流れているヘッダは温存されます。そして、CamelはHTTPレスポンスヘッダをメッセージヘッダのOUTに追加します。

レスポンスコード

CamelはHTTPレスポンスコードに従ってハンドリングします。

  • レスポンスコードが100..299の範囲の時、Camelは成功レスポンスとします
  • レスポンスコードが300..399の範囲の時、Camelはリダイレクトレスポンスとします。そしてHttpOperationFailedExceptionを投げます。
  • レスポンスコードが400以上の時、Camelha外部サーバエラーとします。そしてHttpOperationFailedExceptionを投げます。
throwExceptionOnFailure
オプションにあるthrowExceptionOnFailureは、レスポンスコードによって投げられるHttpOperationFailedExceptionを止める為にfalseに設定する事ができます。これはリモートサーバからの全てのレスポンスを許可する事になります。

HttpOperationFailedException

この例外は次の情報を含んでいます

  • HTTP ステータスコード
  • HTTP ステータスライン (ステータスコードのテキスト)
  • リダイレクトロケーション。サーバがリダイレクトを返した時
  • レスポンスボディはjava.lang.String, サーバがレスポンスとしてボディがある時

GETやPOSTを使って呼び出す

次のアルゴリズムは、HTTPメソッドとしてGETかPOSTを決める際に使われます。

  1. ヘッダにあるメソッドを使う
  2. ヘッダにクエリ文字列がある場合はGET
  3. エンドポイントにクエリ文字列が設定されている場合はGET
  4. 送信データ(ボディがnullではない)場合はPOST
  5. その他はGET

HttpServletRequestHttpServletResponseでのアクセス方法

ユーザはここにある2つのCamelタイプコンバーターを使ってアクセスする事ができます。
注:ユーザーはリクエストレスポンスをプロセッサーからだけでは無く、camel-jettyやcamel-cxfエンドポイントの後でも取得できます。

HttpServletRequest request = exchange.getIn().getBody(HttpServletRequest.class);
HttpServletRequest response = exchange.getIn().getBody(HttpServletResponse.class);

URIを設定して呼び出す

ユーザーはエンドポイントURIからHTTPプロデューサのURIを直接セットする事ができます。次のルートでは、Camelは外部サーバoldhostをHTTPを使って呼び出します。

from("direct:start")
	    .to("http4://oldhost");

Spring環境のサンプル

<camelContext xmlns="http://activemq.apache.org/camel/schema/spring">
  <route>
    <from uri="direct:start"/>
    <to uri="http4://oldhost"/>
  </route>
</camelContext>

ユーザーはHTTPエンドポイントURIに対してメッセージ上のHTTPConstants.HTTP_URIのヘッダーキーを使って上書きする事ができます。

from("direct:start")
            .setHeader(HttpConstants.HTTP_URI, constant("http://newhost"))
	    .to("http4://oldhost");

上記の例では、Camelはエンドポイントがhttp4://oldhostと設定されているにもかかわらず、http://newhostを呼び出します。
Constantsのクラスの場所は org.apache.camel.component.http4.Constants

URIパラメータの設定

httpプロデューサはHTTPサーバに送信するためのURIパラメータをサポートしています。このURIパラーメータは直接エンドポイントURIにセットするか Exchange.HTTP_QUERYヘッダーキーをメッセージにセットする事ができます。

from("direct:start")
	    .to("http4://oldhost?order=123&detail=short");

もしくはヘッダでオプションを指定

from("direct:start")
            .setHeader(Exchange.HTTP_QUERY, constant("order=123&detail=short"))
	    .to("http4://oldhost");

httpメソッド(GET/POST/PUT/DELETE/HEAD/OPTIONS/TRACE)の設定してHTTPプロデューサに送る方法

HTTP4コンポーネントはHTTPリクエストメソッドをメッセージヘッダの設定で設定する方法を提供しています。サンプルはこれです。

from("direct:start")
            .setHeader(Exchange.HTTP_METHOD, constant(org.apache.camel.component.http4.HttpMethods.POST))
	    .to("http4://www.google.com")
            .to("mock:results");

このメソッドはstring constatntsを使って少し短く書く事ができます。

.setHeader("CamelHttpMethod", constant("POST"))

Spring環境での例

<camelContext xmlns="http://activemq.apache.org/camel/schema/spring">
  <route>
    <from uri="direct:start"/>
    <setHeader headerName="CamelHttpMethod">
        <constant>POST</constant>
    </setHeader>
    <to uri="http4://www.google.com"/>
    <to uri="mock:results"/>
  </route>
</camelContext>

クライアントタイムアウトを使う- SO_TIMEOUT

HttpSOTimeoutTestユニットテストを参照。

プロキシの設定

HTTP4コンポーネントはプロキシを設定する方法を提供しています

from("direct:start")
	    .to("http4://oldhost?proxyAuthHost=www.myproxy.com&proxyAuthPort=80");

また、proxyAuthUsernameとproxyAuthPasswordオプションを使ったプロキシ認証もサポートしています。

URI以外でのプロキシ設定を使う

システムプロパティの衝突を避けるために、CamelContextかURIを使ってプロキシ設定だけをセットする事ができます。
Jara DSL:

 context.getProperties().put("http.proxyHost", "172.168.18.9");
 context.getProperties().put("http.proxyPort" "8080");
Spring XML:
<camelContext>
       <properties>
           <property key="http.proxyHost" value="172.168.18.9"/>
           <property key="http.proxyPort" value="8080"/>
      </properties>
   </camelContext>
Camelは最初にJavaシステムかCamelContextプロパティ設定をセットします。そしてもし指定されていたらエンドポイントプロキシオプションをセットします。 これでユーザーはシステムプロパティをエンドポイントオプションで上書きする事ができます。
Camel 2.8での注意点として、スキームを明確に設定する為にhttp.proxySchemeプロパティがあります。

charsetを設定

データを送信するためにPOSTを使う時、Exchangeプロパティを使ってcharsetを設定する事ができます。

exchange.setProperty(Exchange.CHARSET_NAME, "ISO-8859-1");

スケジュールポーリングをつかったサンプル

このサンプルではGoogleホームページを10秒毎にポーリングして、message.htmlファイルにページを書き出します。

from("timer://foo?fixedRate=true&delay=0&period=10000")
    .to("http4://www.google.com")
    .setHeader(FileComponent.HEADER_FILE_NAME, "message.html")
    .to("file:target/google");

エンドポイントURIからのURIパラメータ

このサンプルでは、Webブラウザでユーザーが入力したような完全なURIエンドポイントを使っています。色々なURIパラメータは もちろんちょうどユーザーがWebブラウザでやっているのと同じようにセパレータとして&文字を使う事ができます。

// we query for Camel at the Google page
template.sendBody("http4://www.google.com/search?q=Camel", null);

メッセージからのURIパラメータ

Map headers = new HashMap();
headers.put(HttpProducer.QUERY, "q=Camel&lr=lang_en");
// we query for Camel and English language at Google
template.sendBody("http4://www.google.com/search", null, headers);

上記のヘッダ値の注意点として、?を頭につけません。そして&文字は通常のようにパラメータの分離として使えます。

レスポンスコードを得る

ユーザーはHTTP4コンポーネントからHTTPレスポンスコードを取得する事ができます。これはHttpProducer.HTTP_RESPONSE_CODEの メッセージヘッダのOUTから値を取得できます。

Exchange exchange = template.send("http4://www.google.com/search", new Processor() {
            public void process(Exchange exchange) throws Exception {
                exchange.getIn().setHeader(HttpProducer.QUERY, constant("hl=en&q=activemq"));
            }
   });
   Message out = exchange.getOut();
   int responseCode = out.getHeader(HttpProducer.HTTP_RESPONSE_CODE, Integer.class);

クッキーを無効化

クッキーを無効化するために、ユーザーはURIオプションを追加する事でHTTP Clientにクッキー無効化をセットする事ができます。
httpClient.cookiePolicy=ignoreCookies

高度な使い方

ユーザーがHTTPプロデューサに対してもっとコントロールが必要な場合、ユーザーはHttpComponentを使う必要があります。 これはカスタム動作を提供する様々なクラスをセットする事ができます。

認証でHTTPSを使う時にひっかかる

エンドユーザーのレポートによると、HTTPSを使って認証する所で問題が発生しました。 この問題は最終的には解決して、HTTPSサーバがHTTPコード401を返していませんでした。 次のURIオプションを設定する事で解決しました。:
httpClient.authenticationPreemptive=true

HTTPクライアント用にSSLをセットアップする

プログラム的にコンポーネントの設定

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);

HttpComponent httpComponent = getContext().getComponent("http4", HttpComponent.class);
httpComponent.setSslContextParameters(scp);

Spring DSLベースのエンドポイントの設定

...
  <camel:sslContextParameters
      id="sslContextParameters">
    <camel:keyManagers
        keyPassword="keyPassword">
      <camel:keyStore
          resource="/users/home/server/keystore.jks"
          password="keystorePassword"/>
    </camel:keyManagers>
  </camel:sslContextParameters>...
...
  <to uri="https4://127.0.0.1/mail/?sslContextParametersRef=sslContextParameters"/>...

KeyStore keystore = ...;
KeyStore truststore = ...;

SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("https", 443, new SSLSocketFactory(keystore, "mypassword", truststore)));

ユーザーがこれをSpring DSLを使って行うには、ユーザーはURIを使って自分のHttpClientConfigurerを指定する事ができます。例として:

<bean id="myHttpClientConfigurer"
 class="my.https.HttpClientConfigurer">
</bean>

<to uri="https4://myhostname.com:443/myURL?httpClientConfigurer=myHttpClientConfigurer"/>

ユーザーがHttpClientConfigurerを実装して自分のkeystoreとtruststoreを設定している限り、これは動作します。