对于最新的稳定版本,请使用 Spring Integration 6.3.1Spring中文文档

对于最新的稳定版本,请使用 Spring Integration 6.3.1Spring中文文档

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

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

请注意,servlet 名称与 Bean 名称匹配。 有关更多信息,请参阅 Javadocs。HttpRequestHandlerServletSpring中文文档

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

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

以下示例 Bean 定义了一个 HTTP 入站端点:Spring中文文档

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

接受实例列表,否则依赖于默认列表。 转换器允许自定义从 到 的映射。 默认转换器封装了简单的策略,例如,这些策略为内容类型以 开头的请求创建一条消息。 有关完整的详细信息,请参阅 Javadoc。 可以设置一个额外的标志 () 以及自定义列表,以在自定义转换器之后添加默认转换器。 默认情况下,此标志设置为 ,这意味着自定义转换器将替换默认列表。HttpRequestHandlingMessagingGatewayHttpMessageConverterHttpServletRequestMessageStringPOSTtextmergeWithDefaultConvertersHttpMessageConverterfalseSpring中文文档

消息转换过程使用(可选)属性和传入标头。 从版本 4.3 开始,如果请求没有内容类型标头,则假定为 。 以前,此类消息的正文被忽略。requestPayloadTypeContent-Typeapplication/octet-streamRFC 2616Spring中文文档

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

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

如果您希望将 a 代理到另一台服务器,最好将其保留为原始形式。 要处理这种情况,请不要将 Bean 添加到上下文中。 将终结点配置为需要请求,自定义消息转换器以包含 ,并禁用默认的分段转换器。 您可能需要一些其他转换器来回复。 以下示例演示了这样的安排:multipart/form-datamultipartResolverbyte[]ByteArrayHttpMessageConverterSpring中文文档

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

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

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

由于 的值,它等待回复。 前面的示例还演示了如何自定义网关接受的 HTTP 方法,这些方法默认为和默认。constructor-argtruePOSTGETSpring中文文档

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

有关示例应用程序和相应的配置,请参阅 Spring Integration Samples 存储库。 它包含 HTTP 示例应用程序,它演示了 Spring Integration 的 HTTP 支持。
如果 bean 名称为 (与 Spring 的预期名称相同),则 HTTP 入站端点会在上下文中定位 a。 如果它确实找到了该 Bean,则会在入站请求映射器上启用对分段文件的支持。 否则,当它尝试将多部分文件请求映射到 Spring Integration 时,它将失败。 有关 Spring 对 的支持的更多信息,请参阅 Spring 参考手册MultipartResolvermultipartResolverDispatcherServletMessageMultipartResolver

如果您希望将 a 代理到另一台服务器,最好将其保留为原始形式。 要处理这种情况,请不要将 Bean 添加到上下文中。 将终结点配置为需要请求,自定义消息转换器以包含 ,并禁用默认的分段转换器。 您可能需要一些其他转换器来回复。 以下示例演示了这样的安排:multipart/form-datamultipartResolverbyte[]ByteArrayHttpMessageConverterSpring中文文档

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

有效负载验证

从版本 5.2 开始,可以为 HTTP 入站端点提供一个,以便在发送到通道之前检查有效负载。 此有效载荷已经是转换和提取的结果,以缩小有关有价值数据的验证范围。 验证失败处理与我们在Spring MVC错误处理中完全相同。ValidatorpayloadExpressionSpring中文文档