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

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

请注意,Servlet 名称与 Bean 名称匹配。 有关更多信息,请参阅 Javadocs。HttpRequestHandlerServletspring-doc.cn

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

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

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

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

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

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

Spring Integration 2.0 实现了多部分文件支持。 如果请求已包装为 a ,则当您使用默认转换器时,该请求将转换为一个有效负载,该有效负载是包含的值,这些值可以是字节数组、字符串或 Spring 的实例,具体取决于各个部分的内容类型。MultipartHttpServletRequestMessageMultiValueMapMultipartFilespring-doc.cn

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

如果您希望将 a 代理到另一台服务器,最好将其保持为原始形式。 要处理这种情况,请不要将 Bean 添加到上下文中。 将终端节点配置为需要请求,自定义消息转换器以包含 ,并禁用默认的 multipart 转换器。 您可能需要一些其他转换器来回复。 以下示例显示了这种安排:multipart/form-datamultipartResolverbyte[]ByteArrayHttpMessageConverterspring-doc.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>

当您向客户端发送响应时,您可以通过多种方式自定义网关的行为。 默认情况下,网关通过发回状态代码来确认已收到请求。 可以通过提供 Spring MVC 解析的 'viewName' 来自定义此响应。 如果网关需要对 的回复,则可以设置标志(constructor 参数)以使网关在创建 HTTP 响应之前等待回复。 下面的示例将网关配置为用作具有视图名称的 Spring MVC 控制器:200ViewResolverMessageexpectReplyMessagespring-doc.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>

由于 的值 ,它会等待回复。 前面的示例还显示了如何自定义网关接受的 HTTP 方法,这些方法默认为 and。constructor-argtruePOSTGETspring-doc.cn

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

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

如果您希望将 a 代理到另一台服务器,最好将其保持为原始形式。 要处理这种情况,请不要将 Bean 添加到上下文中。 将终端节点配置为需要请求,自定义消息转换器以包含 ,并禁用默认的 multipart 转换器。 您可能需要一些其他转换器来回复。 以下示例显示了这种安排:multipart/form-datamultipartResolverbyte[]ByteArrayHttpMessageConverterspring-doc.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>

有效载荷验证

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