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 全体が返されます。