Http 入站组件
要通过 HTTP 接收消息,您需要使用 HTTP 入站通道适配器或 HTTP 入站网关。为了支持 HTTP 入站适配器,需要将它们部署在 servlet 容器中,例如 Apache Tomcat 或 Jetty。最简单的方法是使用 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
Javadocs。
如果您在 Spring MVC 应用程序中运行,则上述显式 servlet 定义不是必需的。在这种情况下,网关的 bean 名称可以与 URL 路径匹配,就像您对 Spring MVC Controller bean 所做的那样。有关更多信息,请参阅 Web MVC 框架,它是 Spring Framework 参考文档的一部分。
有关示例应用程序和相应的配置,请参阅 Spring Integration 示例 存储库。它包含 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
实例列表,或者依赖于默认列表。转换器允许自定义从 HttpServletRequest
到 Message
的映射。默认转换器封装了简单的策略,例如,为 POST
请求创建一个 String
消息,其中内容类型以 text
开头。有关完整详细信息,请参阅 Javadoc。可以在自定义 HttpMessageConverter
列表中设置一个额外的标志 (mergeWithDefaultConverters
),以便在自定义转换器之后添加默认转换器。默认情况下,此标志设置为 false
,这意味着自定义转换器替换默认列表。
消息转换过程使用(可选)requestPayloadType
属性和传入的 Content-Type
标头。从版本 4.3 开始,如果请求没有内容类型标头,则假设为 application/octet-stream
,如 RFC 2616
所建议。以前,此类消息的主体会被忽略。
Spring Integration 2.0 实现了多部分文件支持。如果请求已被包装为 MultipartHttpServletRequest
,当您使用默认转换器时,该请求将转换为一个 Message
负载,该负载是一个 MultiValueMap
,其中包含可能为字节数组、字符串或 Spring 的 MultipartFile
实例的值,具体取决于各个部分的内容类型。
如果上下文中存在一个名为 multipartResolver 的 bean(与 Spring 的 DispatcherServlet 预期的名称相同),则 HTTP 入站端点会在该上下文中找到一个 MultipartResolver 。如果它确实找到了该 bean,则会在入站请求映射器上启用对多部分文件支持。否则,当它尝试将多部分文件请求映射到 Spring Integration Message 时会失败。有关 Spring 对 MultipartResolver 支持的更多信息,请参阅 Spring 参考手册。 |
如果您希望将
|
当您向客户端发送响应时,您可以通过多种方式自定义网关的行为。默认情况下,网关通过发送 200
状态代码确认已收到请求。可以通过提供一个由 Spring MVC ViewResolver
解析的 'viewName' 来自定义此响应。如果网关应该期望对 Message
的回复,则可以将 expectReply
标志(构造函数参数)设置为导致网关在创建 HTTP 响应之前等待回复 Message
。以下示例配置了一个网关作为具有视图名称的 Spring MVC Controller
<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 方法,默认情况下为 POST
和 GET
。
回复消息在模型映射中可用。默认情况下,该映射条目对应的键为 'reply',但您可以通过在端点的配置上设置 'replyKey' 属性来覆盖此默认值。
有效负载验证
从版本 5.2 开始,可以为 HTTP 入站端点提供一个 Validator
,以在将有效负载发送到通道之前检查它。此有效负载已经是 payloadExpression
转换和提取的结果,以缩小关于有价值数据的验证范围。验证失败处理与我们在 Spring MVC 中的处理完全相同 错误处理。