对于最新的稳定版本,请使用 Spring Integration 6.5.1spring-doc.cadn.net.cn

HTTP 出站组件

本节介绍 Spring Integration 的 HTTP 出站组件。spring-doc.cadn.net.cn

HttpRequestExecutingMessageHandler

要配置HttpRequestExecutingMessageHandler,编写类似于以下内容的 bean 定义:spring-doc.cadn.net.cn

<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. 该模板反过来又委托给一个列表HttpMessageConverter实例,从Message有效载荷。 您可以配置这些转换器以及ClientHttpRequestFactory实例,如以下示例所示:spring-doc.cadn.net.cn

<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 请求是通过使用SimpleClientHttpRequestFactory,它使用 JDKHttpURLConnection. 通过以下方式还支持使用 Apache Commons HTTP 客户端CommonsClientHttpRequestFactory,您可以注入(如前所示)。spring-doc.cadn.net.cn

对于出站网关,网关生成的回复消息包含请求消息中存在的所有消息头。

使用 Cookie

基本的 cookie 支持由transfer-cookies属性。当设置为true(默认值为false)、一个Set-Cookie响应中从服务器接收的标头将转换为Cookie在回复消息中。然后,此标头将用于后续发送。这支持简单的有状态交互,例如:spring-doc.cadn.net.cn

…​→logonGateway→…​→doWorkGateway→…​→logoffGateway→…​spring-doc.cadn.net.cn

如果transfer-cookiesfalse任何Set-Cookie收到的标头仍为Set-Cookie并在后续发送时被删除。spring-doc.cadn.net.cn

空响应体

HTTP 是一种请求-响应协议。但是,响应可能没有正文,只有标头。在这种情况下,HttpRequestExecutingMessageHandler生成回复Message有效载荷是org.springframework.http.ResponseEntity,无论提供什么expected-response-type. 根据 HTTP RFC 状态代码定义,有许多状态要求响应不得包含消息正文(例如,204 No Content). 在某些情况下,对同一 URL 的调用可能会也可能不会返回响应正文。例如,对 HTTP 资源的第一个请求返回内容,但第二个请求不会返回(返回304 Not Modified). 但是,在所有情况下,http_statusCodemessage header 被填充。这可以在 HTTP 出站网关之后的某些路由逻辑中使用。您还可以使用“<payload-type-router/>”来路由带有ResponseEntity到与用于身体响应的流程不同的流程。spring-doc.cadn.net.cn

预期响应类型

继前面关于空响应正文的说明之后,如果响应确实包含正文,则必须提供适当的expected-response-type属性,或者,同样,您会收到一个ResponseEntity没有身体。 这expected-response-type必须与(已配置或默认)兼容HttpMessageConverter实例和Content-Type标头。这可以是抽象类,甚至可以是接口(例如java.io.Serializable当您使用 Java 序列化和Content-Type: application/x-java-serialized-object).spring-doc.cadn.net.cn

从 5.5 版本开始,HttpRequestExecutingMessageHandler暴露了一个extractResponseBody标志(即true默认情况下)仅返回响应正文,或返回整个ResponseEntity作为回复消息有效负载,独立于提供的expectedResponseType. 如果ResponseEntity,这个标志被忽略了,整个ResponseEntity被返回。spring-doc.cadn.net.cn