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

HTTP 出站组件

本节描述了 Spring 集成的 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 ClientCommonsClientHttpRequestFactory,您可以注入它(如前所述)。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其中 payload 是一个org.springframework.http.ResponseEntity,无论提供的任何expected-response-type. 根据 HTTP RFC 状态代码定义,有许多状态要求响应不能包含消息正文(例如,204 No Content). 在某些情况下,对同一 URL 的调用可能会也可能不会返回响应正文。 例如,对 HTTP 资源的第一个请求返回内容,但第二个请求不会(返回304 Not Modified). 但是,在所有情况下,http_statusCode消息报头。 这可以在 HTTP 出站网关之后的某些路由逻辑中使用。 您还可以使用 '<payload-type-router/>' 来路由带有ResponseEntity发送到与用于 body 响应的流不同的流。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