HTTP 出站元件

本節介紹 Spring Integration 的 HTTP 出站元件。

使用 HttpRequestExecutingMessageHandler

要配置 HttpRequestExecutingMessageHandler,編寫類似如下的 Bean 定義:

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

預設情況下,HTTP 請求是使用 SimpleClientHttpRequestFactory 的一個例項生成的,該例項使用 JDK 的 HttpURLConnection。透過 CommonsClientHttpRequestFactory 也支援使用 Apache Commons HTTP Client,您可以注入它(如前所示)。

對於出站閘道器,閘道器生成的回覆訊息包含請求訊息中存在的所有訊息頭。

使用 Cookies

出站閘道器上的 transfer-cookies 屬性提供了基本的 cookie 支援。當設定為 true(預設為 false)時,從伺服器響應中收到的 Set-Cookie 頭部會轉換為回覆訊息中的 Cookie。然後,此頭部會用於後續的傳送。這使得簡單的有狀態互動成為可能,例如以下情況:

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

如果 transfer-cookiesfalse,收到的任何 Set-Cookie 頭部將保留為回覆訊息中的 Set-Cookie,並在後續傳送中被丟棄。

空響應體

HTTP 是一種請求-響應協議。然而,響應可能沒有正文,只有頭部。在這種情況下,HttpRequestExecutingMessageHandler 會生成一個回覆 Message,其負載為 org.springframework.http.ResponseEntity,無論是否提供了 expected-response-type。根據 HTTP RFC 狀態碼定義,許多狀態碼要求響應不能包含訊息體(例如,204 No Content)。還有一些情況是,對同一 URL 的呼叫可能返回或不返回響應體。例如,對某個 HTTP 資源的第一次請求返回內容,但第二次請求不返回(返回 304 Not Modified)。然而,在所有情況下,都會填充 http_statusCode 訊息頭部。這可以在 HTTP 出站閘道器之後的一些路由邏輯中使用。您也可以使用一個`` 將帶有 ResponseEntity 的訊息路由到與帶有正文的響應所使用的流程不同的流程。

expected-response-type

除了前面關於空響應體的注意事項之外,如果響應確實包含正文,則必須提供適當的 expected-response-type 屬性,否則您將再次收到沒有正文的 ResponseEntityexpected-response-type 必須與(配置的或預設的)HttpMessageConverter 例項和響應中的 Content-Type 頭部相容。這可以是一個抽象類,甚至是介面(例如在使用 Java 序列化和 Content-Type: application/x-java-serialized-object 時使用 java.io.Serializable)。

從版本 5.5 開始,HttpRequestExecutingMessageHandler 暴露了一個 extractResponseBody 標誌(預設為 true),用於僅返回響應體,或將整個 ResponseEntity 作為回覆訊息的負載返回,這與提供的 expectedResponseType 無關。如果 ResponseEntity 中沒有正文,則忽略此標誌,並返回整個 ResponseEntity