Http 入站组件

要通过 HTTP 接收消息,你需要使用 HTTP 入站通道适配器或 HTTP 入站网关。为了支持 HTTP 入站适配器,它们需要部署在 servlet 容器中,例如 Apache TomcatJetty。最简单的方法是使用 Spring 的 HttpRequestHandlerServlet,通过在 web.xml 文件中提供以下 servlet 定义:

<servlet>
    <servlet-name>inboundGateway</servlet-name>
    <servlet-class>o.s.web.context.support.HttpRequestHandlerServlet</servlet-class>
</servlet>

请注意,servlet 名称与 bean 名称匹配。更多信息请参阅 HttpRequestHandlerServlet Javadoc。

如果你在 Spring MVC 应用程序中运行,则不需要上述显式的 servlet 定义。在这种情况下,你的网关的 bean 名称可以像 Spring MVC 控制器 bean 那样与 URL 路径匹配。更多信息请参阅 Web MVC 框架,它是 Spring Framework 参考文档的一部分。

有关示例应用程序和相应的配置,请参阅 Spring Integration Samples 仓库。它包含 HTTP 示例应用程序,该应用程序演示了 Spring Integration 的 HTTP 支持。

以下示例 bean 定义了一个 HTTP 入站端点:

<bean id="httpInbound"
  class="org.springframework.integration.http.inbound.HttpRequestHandlingMessagingGateway">
  <property name="requestChannel" ref="httpRequestChannel" />
  <property name="replyChannel" ref="httpReplyChannel" />
</bean>

HttpRequestHandlingMessagingGateway 接受 HttpMessageConverter 实例列表,或者依赖于默认列表。转换器允许自定义从 HttpServletRequestMessage 的映射。默认转换器封装了简单的策略,例如,对于内容类型以 text 开头的 POST 请求,它会创建一个 String 消息。有关详细信息,请参阅 Javadoc。可以设置一个附加标志 (mergeWithDefaultConverters) 和自定义 HttpMessageConverter 列表,以便在自定义转换器之后添加默认转换器。默认情况下,此标志设置为 false,这意味着自定义转换器将替换默认列表。

消息转换过程使用(可选的)requestPayloadType 属性和传入的 Content-Type 标头。从版本 4.3 开始,如果请求没有内容类型标头,则假定为 application/octet-stream,如 RFC 2616 建议。此前,此类消息的主体会被忽略。

Spring Integration 2.0 实现了多部分文件支持。如果请求已包装为 MultipartHttpServletRequest,当你使用默认转换器时,该请求将转换为 Message 有效负载,该有效负载是 MultiValueMap,其中包含的值可以是字节数组、字符串或 Spring 的 MultipartFile 实例,具体取决于各个部分的内容类型。

HTTP 入站端点会在上下文中查找 MultipartResolver,如果有一个 bean 名称为 multipartResolver(与 Spring 的 DispatcherServlet 预期的名称相同)。如果它找到该 bean,则在入站请求映射器上启用多部分文件支持。否则,当它尝试将多部分文件请求映射到 Spring Integration Message 时会失败。有关 Spring 对 MultipartResolver 的支持的更多信息,请参阅 Spring 参考手册

如果你希望将 multipart/form-data 代理到另一个服务器,最好保持其原始形式。要处理这种情况,请不要将 multipartResolver bean 添加到上下文中。配置端点以期望 byte[] 请求,自定义消息转换器以包含 ByteArrayHttpMessageConverter,并禁用默认的多部分转换器。你可能需要其他转换器来处理回复。以下示例显示了这样的安排:

<int-http:inbound-gateway
                  channel="receiveChannel"
                  path="/inboundAdapter.htm"
                  request-payload-type="byte[]"
                  message-converters="converters"
                  merge-with-default-converters="false"
                  supported-methods="POST" />

<util:list id="converters">
    <beans:bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter" />
    <beans:bean class="org.springframework.http.converter.StringHttpMessageConverter" />
    <beans:bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />
</util:list>

当你向客户端发送响应时,有多种方法可以自定义网关的行为。默认情况下,网关通过发送 200 状态码来确认请求已收到。可以通过提供一个由 Spring MVC ViewResolver 解析的“viewName”来自定义此响应。如果网关应该期望对 Message 的回复,你可以将 expectReply 标志(构造函数参数)设置为 true,以使网关在创建 HTTP 响应之前等待回复 Message。以下示例配置了一个网关,使其作为带有视图名称的 Spring MVC 控制器:

<bean id="httpInbound"
  class="org.springframework.integration.http.inbound.HttpRequestHandlingController">
  <constructor-arg value="true" /> <!-- indicates that a reply is expected -->
  <property name="requestChannel" ref="httpRequestChannel" />
  <property name="replyChannel" ref="httpReplyChannel" />
  <property name="viewName" value="jsonView" />
  <property name="supportedMethodNames" >
    <list>
      <value>GET</value>
      <value>DELETE</value>
    </list>
  </property>
</bean>

由于 constructor-arg 的值为 true,它会等待回复。前面的示例还展示了如何自定义网关接受的 HTTP 方法,默认情况下是 POSTGET

回复消息在模型映射中可用。默认情况下,该映射条目的键是“reply”,但你可以通过在端点配置上设置“replyKey”属性来覆盖此默认值。

负载验证

从版本 5.2 开始,HTTP 入站端点可以提供一个 Validator,用于在发送到通道之前检查负载。此负载已是经过 payloadExpression 转换和提取的结果,以缩小验证范围,使其仅限于有价值的数据。验证失败处理方式与 Spring MVC 错误处理中的方式完全相同。

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