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 Javadoc。
如果您在 Spring MVC 应用程序中运行,则不需要上述显式 servlet 定义。
在这种情况下,您的网关的 bean 名称可以像 Spring MVC Controller 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 实例列表,否则依赖于默认列表。
转换器允许自定义从 HttpServletRequest 到 Message 的映射。
默认转换器封装了简单的策略,例如,它们会为内容类型以 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 实例,具体取决于各个部分的 content type。
|
HTTP 入站端点在上下文中查找 |
|
如果您希望将
|
当您向客户端发送响应时,您可以通过多种方式自定义网关的行为。
默认情况下,网关通过发送 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 错误处理 完全相同。