跳到主要内容

HTTP 外发组件

QWen Plus 中英对照 HTTP Outbound Components

本节描述了 Spring Integration 的 HTTP 外发组件。

使用 HttpRequestExecutingMessageHandler

要配置 HttpRequestExecutingMessageHandler,编写一个类似于以下内容的bean定义:

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

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

<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>
xml

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

备注

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

使用 Cookies

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

…​→ 登录网关 →…​→ 执行工作网关 →…​→ 注销网关 →…​

如果 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 序列化时为 java.io.SerializableContent-Type: application/x-java-serialized-object)。

从 5.5 版本开始,HttpRequestExecutingMessageHandler 暴露了一个 extractResponseBody 标志(默认为 true),用于返回仅响应体,或者将整个 ResponseEntity 作为回复消息的有效负载返回,这独立于提供的 expectedResponseType。如果 ResponseEntity 中没有主体,此标志将被忽略,并返回整个 ResponseEntity