HTTP 入站元件

要透過 HTTP 接收訊息,你需要使用 HTTP 入站通道介面卡或 HTTP 入站閘道器。為了支援 HTTP 入站介面卡,它們需要部署在 servlet 容器中,例如 Apache TomcatJetty。最簡單的方法是使用 Spring 的 HttpRequestHandlerServlet,透過在 web.xml 檔案中提供以下 servlet 定義:

<servlet>
    <servlet-name>inboundGateway</servlet-name>
    <servlet-class>o.s.web.context.support.HttpRequestHandlerServlet</servlet-class>
</servlet>

請注意,servlet 名稱與 bean 名稱匹配。有關更多資訊,請參閱 HttpRequestHandlerServlet 的 Javadoc。

如果你在 Spring MVC 應用中執行,則上述顯式的 servlet 定義不是必需的。在這種情況下,你的閘道器的 bean 名稱可以像 Spring MVC 控制器 bean 那樣與 URL 路徑匹配。有關更多資訊,請參閱 Web MVC 框架,它是 Spring Framework 參考文件的一部分。

有關示例應用及其相應配置,請參閱 Spring Integration 示例倉庫。它包含 HTTP 示例應用,展示了 Spring Integration 的 HTTP 支援。

以下 bean 示例定義了一個 HTTP 入站端點:

<bean id="httpInbound"
  class="org.springframework.integration.http.inbound.HttpRequestHandlingMessagingGateway">
  <property name="requestChannel" ref="httpRequestChannel" />
  <property name="replyChannel" ref="httpReplyChannel" />
</bean>

HttpRequestHandlerMessagingGateway 接受一個 HttpMessageConverter 例項列表,或者依賴於預設列表。轉換器允許自定義從 HttpServletRequestMessage 的對映。預設轉換器封裝了簡單的策略,例如對於內容型別以 text 開頭的 POST 請求,會建立一個 String 訊息。有關完整詳細資訊,請參閱 Javadoc。可以設定一個附加標誌(mergeWithDefaultConverters)以及自定義 HttpMessageConverter 列表,以在自定義轉換器之後新增預設轉換器。預設情況下,此標誌設定為 false,意味著自定義轉換器會替換預設列表。

訊息轉換過程使用(可選的)requestPayloadType 屬性和傳入的 Content-Type 頭。從 4.3 版本開始,如果請求沒有內容型別頭,則假定為 application/octet-stream,正如 RFC 2616 所建議的。以前,此類訊息的主體會被忽略。

Spring Integration 2.0 實現了 multipart 檔案支援。如果請求已包裝為 MultipartHttpServletRequest,當使用預設轉換器時,該請求將轉換為 Message 載荷,該載荷是一個 MultiValueMap,包含可能是位元組陣列、字串或 Spring 的 MultipartFile 例項的值,具體取決於各個部分的內容型別。

如果上下文中存在 bean 名稱為 multipartResolverMultipartResolver(與 Spring 的 DispatcherServlet 期望的名稱相同),則 HTTP 入站端點會定位它。如果定位到該 bean,則在入站請求對映器上啟用 multipart 檔案支援。否則,當嘗試將 multipart 檔案請求對映到 Spring Integration Message 時會失敗。有關 Spring 對 MultipartResolver 的更多支援,請參閱 Spring 參考手冊

如果你希望將 multipart/form-data 代理到另一個伺服器,最好將其保持為原始形式。要處理這種情況,請不要將 multipartResolver bean 新增到上下文中。配置端點以期望 byte[] 請求,自定義訊息轉換器以包含 ByteArrayHttpMessageConverter,並停用預設的 multipart 轉換器。對於回覆,你可能需要其他轉換器。以下示例展示了這樣的配置:

<int-http:inbound-gateway
                  channel="receiveChannel"
                  path="/inboundAdapter.htm"
                  request-payload-type="byte[]"
                  message-converters="converters"
                  merge-with-default-converters="false"
                  supported-methods="POST" />

<util:list id="converters">
    <beans:bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter" />
    <beans:bean class="org.springframework.http.converter.StringHttpMessageConverter" />
    <beans:bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />
</util:list>

當你向客戶端傳送響應時,有多種方法可以自定義閘道器的行為。預設情況下,閘道器透過傳送 200 狀態碼來確認請求已收到。可以透過提供一個由 Spring MVC ViewResolver 解析的 'viewName' 來自定義此響應。如果閘道器應期望收到對 Message 的回覆,可以設定 expectReply 標誌(建構函式引數),使閘道器在建立 HTTP 響應之前等待回覆 Message。以下示例配置了一個閘道器,使其充當具有檢視名稱的 Spring MVC 控制器:

<bean id="httpInbound"
  class="org.springframework.integration.http.inbound.HttpRequestHandlingController">
  <constructor-arg value="true" /> <!-- indicates that a reply is expected -->
  <property name="requestChannel" ref="httpRequestChannel" />
  <property name="replyChannel" ref="httpReplyChannel" />
  <property name="viewName" value="jsonView" />
  <property name="supportedMethodNames" >
    <list>
      <value>GET</value>
      <value>DELETE</value>
    </list>
  </property>
</bean>

由於 constructor-arg 的值為 true,它會等待回覆。前面的示例還展示瞭如何自定義閘道器接受的 HTTP 方法,預設情況下是 POSTGET

回覆訊息在模型對映中可用。預設情況下,該對映項的鍵是 'reply',但你可以透過在端點配置上設定 'replyKey' 屬性來覆蓋此預設值。

載荷驗證

從 5.2 版本開始,HTTP 入站端點可以提供一個 Validator,用於在傳送到通道之前檢查載荷。這個載荷已經是 payloadExpression 轉換和提取後的結果,可以縮小驗證範圍以針對有價值的資料。驗證失敗處理與 Spring MVC 錯誤處理中的方式完全相同。