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 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 例項列表,或者依賴於預設列表。轉換器允許自定義從 HttpServletRequestMessage 的對映。預設轉換器封裝了簡單的策略,例如,對於內容型別以 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 參考手冊

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

<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 標誌(建構函式引數)設定為 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 方法,預設情況下是 POSTGET

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

負載驗證

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

© . This site is unofficial and not affiliated with VMware.