HTTP 出站组件

本节介绍 Spring Integration 的 HTTP 出站组件。

使用 HttpRequestExecutingMessageHandler

要配置 HttpRequestExecutingMessageHandler,请编写类似于以下的 bean 定义

<bean id="httpOutbound"
  class="org.springframework.integration.http.outbound.HttpRequestExecutingMessageHandler">
  <constructor-arg value="https://127.0.0.1:8080/example" />
  <property name="outputChannel" ref="responseChannel" />
</bean>

此 bean 定义通过委托给 RestTemplate 来运行 HTTP 请求。该模板反过来委托给 HttpMessageConverter 实例列表,以从 Message 负载生成 HTTP 请求主体。您可以配置这些转换器以及要使用的 ClientHttpRequestFactory 实例,如下例所示

<bean id="httpOutbound"
  class="org.springframework.integration.http.outbound.HttpRequestExecutingMessageHandler">
  <constructor-arg value="https://127.0.0.1:8080/example" />
  <property name="outputChannel" ref="responseChannel" />
  <property name="messageConverters" ref="messageConverterList" />
  <property name="requestFactory" ref="customRequestFactory" />
</bean>

默认情况下,HTTP 请求是通过使用 SimpleClientHttpRequestFactory 实例生成的,该实例使用 JDK HttpURLConnection。还支持使用 Apache Commons HTTP Client,通过 CommonsClientHttpRequestFactory,您可以注入(如前所示)。

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

使用 Cookie

出站网关上的 transfer-cookies 属性提供了基本的 Cookie 支持。当设置为 true(默认值为 false)时,从服务器在响应中接收到的 Set-Cookie 头部将转换为回复消息中的 Cookie。然后,此头部将在后续发送中使用。这使得简单的有状态交互成为可能,例如以下情况

…​→logonGateway→…​→doWorkGateway→…​→logoffGateway→…​

如果 transfer-cookiesfalse,则接收到的任何 Set-Cookie 头部将保留为回复消息中的 Set-Cookie,并在后续发送中被丢弃。

空响应主体

HTTP 是一种请求-响应协议。但是,响应可能没有主体,只有头部。在这种情况下,HttpRequestExecutingMessageHandler 会生成一个回复 Message,其负载为 org.springframework.http.ResponseEntity,无论提供什么 expected-response-type。根据 HTTP RFC 状态码定义,有许多状态规定响应不得包含消息主体(例如,204 No Content)。还有一些情况,对同一 URL 的调用可能返回或可能不返回响应主体。例如,对 HTTP 资源的第一个请求返回内容,但第二个请求不返回内容(返回 304 Not Modified)。但是,在所有情况下,http_statusCode 消息头都会被填充。这可以在 HTTP 出站网关之后的某些路由逻辑中使用。您还可以使用 <payload-type-router/> 将具有 ResponseEntity 的消息路由到与具有主体的响应所使用的流程不同的流程。

预期响应类型

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

从 5.5 版本开始,HttpRequestExecutingMessageHandler 公开了一个extractResponseBody标志(默认情况下为true),用于仅返回响应主体,或将整个ResponseEntity作为回复消息有效负载返回,而与提供的expectedResponseType无关。如果ResponseEntity中不存在主体,则忽略此标志,并返回整个ResponseEntity