Http 入站元件
要透過 HTTP 接收訊息,你需要使用 HTTP 入站通道介面卡或 HTTP 入站閘道器。為了支援 HTTP 入站介面卡,它們需要部署在 servlet 容器中,例如 Apache Tomcat 或 Jetty。最簡單的方法是使用 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 Samples 倉庫。它包含 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>
HttpRequestHandlingMessagingGateway 接受 HttpMessageConverter 例項列表,或者依賴於預設列表。轉換器允許自定義從 HttpServletRequest 到 Message 的對映。預設轉換器封裝了簡單的策略,例如,對於內容型別以 text 開頭的 POST 請求,它會建立一個 String 訊息。有關詳細資訊,請參閱 Javadoc。可以設定一個附加標誌 (mergeWithDefaultConverters) 和自定義 HttpMessageConverter 列表,以便在自定義轉換器之後新增預設轉換器。預設情況下,此標誌設定為 false,這意味著自定義轉換器將替換預設列表。
訊息轉換過程使用(可選的)requestPayloadType 屬性和傳入的 Content-Type 標頭。從版本 4.3 開始,如果請求沒有內容型別標頭,則假定為 application/octet-stream,如 RFC 2616 建議。此前,此類訊息的主體會被忽略。
Spring Integration 2.0 實現了多部分檔案支援。如果請求已包裝為 MultipartHttpServletRequest,當你使用預設轉換器時,該請求將轉換為 Message 有效負載,該有效負載是 MultiValueMap,其中包含的值可以是位元組陣列、字串或 Spring 的 MultipartFile 例項,具體取決於各個部分的內容型別。
HTTP 入站端點會在上下文中查詢 MultipartResolver,如果有一個 bean 名稱為 multipartResolver(與 Spring 的 DispatcherServlet 預期的名稱相同)。如果它找到該 bean,則在入站請求對映器上啟用多部分檔案支援。否則,當它嘗試將多部分檔案請求對映到 Spring Integration Message 時會失敗。有關 Spring 對 MultipartResolver 的支援的更多資訊,請參閱 Spring 參考手冊。 |
|
如果你希望將
|
當你向客戶端傳送響應時,有多種方法可以自定義閘道器的行為。預設情況下,閘道器透過傳送 200 狀態碼來確認請求已收到。可以透過提供一個由 Spring MVC ViewResolver 解析的“viewName”來自定義此響應。如果閘道器應該期望對 Message 的回覆,你可以將 expectReply 標誌(建構函式引數)設定為 true,以使閘道器在建立 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 方法,預設情況下是 POST 和 GET。
回覆訊息在模型對映中可用。預設情況下,該對映條目的鍵是“reply”,但你可以透過在端點配置上設定“replyKey”屬性來覆蓋此預設值。
負載驗證
從版本 5.2 開始,HTTP 入站端點可以提供一個 Validator,用於在傳送到通道之前檢查負載。此負載已是經過 payloadExpression 轉換和提取的結果,以縮小驗證範圍,使其僅限於有價值的資料。驗證失敗處理方式與 Spring MVC 錯誤處理中的方式完全相同。