HTTP 出站组件

本节描述了 Spring Integration 的 HTTP 出站组件。

使用 HttpRequestExecutingMessageHandler

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

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

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

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

使用 Cookie

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

...​→logonGateway→...​→doWorkGateway→...​→logoffGateway→...​

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

空响应正文

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

expected-response-type

除了前面关于空响应正文的说明之外,如果响应确实包含正文,则必须提供适当的 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

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