如需使用最新稳定版本,请使用 Spring Integration 7.0.4spring-doc.cadn.net.cn

HTTP 入站组件

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

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

请注意,servlet 名称与 bean 名称相匹配。 更多信息请参阅 HttpRequestHandlerServlet Javadocs。spring-doc.cadn.net.cn

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

对于示例应用程序和相应的配置,请参阅 Spring Integration 示例 仓库。 其中包含 HTTP 示例 应用程序,该应用程序演示了 Spring Integration 的 HTTP 支持。

以下示例 bean 定义了一个 HTTP 入站端点:spring-doc.cadn.net.cn

<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,意味着自定义转换器将替换默认列表。spring-doc.cadn.net.cn

消息转换过程使用(可选的)requestPayloadType 属性和传入的 Content-Type 头信息。 从版本 4.3 开始,如果请求没有内容类型头,则默认假设为 application/octet-stream,这是 RFC 2616 所推荐的。 此前,此类消息的主体会被忽略。spring-doc.cadn.net.cn

Spring Integration 2.0 实现了多部分文件支持。 如果请求已被包装为 MultipartHttpServletRequest,当您使用默认转换器时,该请求会被转换为一个 Message 负载,它是一个 MultiValueMap,其中包含的值可能是字节数组、字符串或 Spring 的 MultipartFile 实例,具体取决于各个部分的 content type。spring-doc.cadn.net.cn

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

如果您希望将multipart/form-data代理到另一个服务器,最好将其保留为原始形式。 要处理这种情况,请勿将multipartResolver bean 添加到上下文中。 配置端点以期望byte[]请求,自定义消息转换器以包含ByteArrayHttpMessageConverter,并禁用默认的 multipart 转换器。 您可能需要其他转换器来处理响应。 以下示例展示了这种配置:spring-doc.cadn.net.cn

<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 标志(构造函数参数)设置为使网关在创建 HTTP 响应之前等待回复 Message。 以下示例配置了一个网关,使其作为具有视图名称的 Spring MVC 控制器:spring-doc.cadn.net.cn

<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 方法,默认情况下它们是 POSTGETspring-doc.cadn.net.cn

回复消息可在模型映射中获取。 默认情况下,该映射条目的键为'reply',但你可以通过设置端点配置上的'replyKey'属性来覆盖此默认值。spring-doc.cadn.net.cn

负载验证

从 5.2 版本开始,HTTP 入站端点可以接收一个 Validator,用于在将有效负载发送到通道之前对其进行检查。 该有效负载已经是经过 payloadExpression 转换和提取后的结果,以便就关键数据缩小验证范围。 验证失败的处理方式与 Spring MVC 中的错误处理完全相同。spring-doc.cadn.net.cn