HTTP 送信コンポーネント

このセクションでは、Spring Integration の HTTP 送信コンポーネントについて説明します。

HttpRequestExecutingMessageHandler を使用する

HttpRequestExecutingMessageHandler を構成するには、次のような Bean 定義を作成します。

<bean id="httpOutbound"
  class="org.springframework.integration.http.outbound.HttpRequestExecutingMessageHandler">
  <constructor-arg value="http://localhost:8080/example" />
  <property name="outputChannel" ref="responseChannel" />
</bean>

この Bean 定義は、RestTemplate に委譲することにより HTTP リクエストを実行します。次に、そのテンプレートは、HttpMessageConverter インスタンスのリストに委譲して、Message ペイロードから HTTP リクエスト本文を生成します。次の例に示すように、これらのコンバーターと ClientHttpRequestFactory インスタンスを使用するように構成できます。

<bean id="httpOutbound"
  class="org.springframework.integration.http.outbound.HttpRequestExecutingMessageHandler">
  <constructor-arg value="http://localhost:8080/example" />
  <property name="outputChannel" ref="responseChannel" />
  <property name="messageConverters" ref="messageConverterList" />
  <property name="requestFactory" ref="customRequestFactory" />
</bean>

デフォルトでは、HTTP リクエストは、JDK HttpURLConnection を使用する SimpleClientHttpRequestFactory のインスタンスを使用して生成されます。Apache Commons HTTP クライアントの使用も、(前述のように) 挿入できる CommonsClientHttpRequestFactory を通じてサポートされています。

送信ゲートウェイの場合、ゲートウェイによって生成される応答メッセージには、リクエストメッセージに存在するすべてのメッセージヘッダーが含まれます。

クッキーを使用する

基本的な Cookie サポートは、送信ゲートウェイの transfer-cookies 属性によって提供されます。true (デフォルトは false)に設定すると、サーバーからのレスポンスで受信した Set-Cookie ヘッダーが、レスポンスメッセージで Cookie に変換されます。このヘッダーは、後続の送信で使用されます。これにより、次のようなシンプルなステートフルなインタラクションが可能になります。

…​→logonGateway→…​→doWorkGateway→…​→logoffGateway→…​

transfer-cookies が false の場合、受信した Set-Cookie ヘッダーは応答メッセージ内で Set-Cookie のままであり、後続の送信でドロップされます。

空のレスポンスボディ

HTTP はリクエストレスポンスプロトコルです。ただし、レスポンスには本文がなく、ヘッダーのみが含まれる場合があります。この場合、HttpRequestExecutingMessageHandler は、提供された expected-response-type に関係なく、ペイロードが org.springframework.http.ResponseEntity であるレスポンス Message を生成します。HTTP RFC ステータスコードの定義 [W3C] (英語) によれば、レスポンスにメッセージ本文を含めてはならないことをリクエストするステータスが多数あります (例: 204 No Content)。同じ URL への呼び出しがレスポンス本文を返す場合と返さない場合もあります。例: HTTP リソースへの最初のリクエストはコンテンツを返しますが、2 番目は返しません ( 304 Not Modified を返します)。ただし、すべての場合において、http_statusCode メッセージヘッダーは設定されます。これは、HTTP 送信ゲートウェイの後のルーティングロジックで使用できます。また、`<payload-type-router/>` を使用して、ResponseEntity を含むメッセージを、本文を含むレスポンスに使用されるフローとは異なるフローにルーティングすることもできます。

expected-response-type

空のレスポンス本文に関する前述の注意に加えて、レスポンスに本文が含まれている場合、適切な expected-response-type 属性を指定するか、本文のない ResponseEntity を受け取る必要があります。expected-response-type は、レスポンス内の(設定済みまたはデフォルトの) HttpMessageConverter インスタンスおよび Content-Type ヘッダーと互換性がある必要があります。これは、抽象クラスまたはインターフェース(Java 直列化と Content-Type: application/x-java-serialized-object を使用する場合の java.io.Serializable など)でさえあります。

バージョン 5.5 以降、HttpRequestExecutingMessageHandler は extractResponseBody フラグ(デフォルトでは true)を公開して、レスポンス本文のみを返すか、提供された expectedResponseType とは関係なく、ResponseEntity 全体をレスポンスメッセージペイロードとして返します。ボディが ResponseEntity に存在しない場合、このフラグは無視され、ResponseEntity 全体が返されます。