【问题标题】:Parsing multipart requests with different controllers使用不同的控制器解析多部分请求
【发布时间】:2014-09-29 03:08:45
【问题描述】:

我需要将多个 http 请求批处理到一个 http 帖子中,如下所示:

Accept:application/json, text/plain, */*  
Accept-Encoding:gzip,deflate,sdch  
Connection:keep-alive  
Content-Length:604  
Content-Type:multipart/mixed; boundary=1408785817122  
Host:localhost:8080  
Origin:null

--1408785817122
Content-Type: application/http; msgtype=request

GET /api/products HTTP/1.1  
Host: localhost:8080  
Accept: application/json, text/plain, */*


--1408785817122
Content-Type: application/http; msgtype=request

POST /api/users/2 HTTP/1.1  
Host: localhost:8080  
Accept: application/json, text/plain, */*

此处为第 2 队的一些数据。

--1408785817122
Content-Type: application/http; msgtype=request

PUT /api/products HTTP/1.1  
Host: localhost:8080  
Accept: application/json, text/plain, */*  
Content-Type: application/json;charset=utf-8

"{\"Name\":\"Product X\",\"StockQuantity\":300}"

--1408785817122--

我有来自不同团队的 jars 服务器端。每个团队都包含有自己的控制器的罐子。团队 1 需要响应第 1 部分,团队 2 需要响应第 2 部分,依此类推。我需要返回单个多部分响应,其中每个边界包含来自每个指定控制器的响应,其中包含 200 或它认为正确的任何其他状态代码和数据。

  1. 因此分散在不同 jar 中的控制器需要被进程扫描和加载
  2. 随着多部分请求的到来,需要调用正确的控制器
  3. 需要返回单个多部分响应,其中包含来自所有控制器的成功或失败响应。

这对任何春季项目都可行吗?最好是spring mvc。

请指出正确的方向

【问题讨论】:

  • 我很好奇 - 你如何生成这样的请求。我可以想象以这种方式将多个请求主体(比如文件内容)捆绑在一起,但这与我之前所做的不同——将实际的 http 请求批处理在一起。 AFAIK,我不认为 Spring MVC 本身提供这种支持,但我可以想象添加一个自定义编排控制器,它可以接收这个请求并依次调度到不同的控制器(或服务)并将其聚合回来。跨度>
  • 请求是通过js生成的。某些 url 是为特定工作流注册的。所以js知道在提交之前会命中3个url所以拦截合并成1个。

标签: spring-mvc spring-boot


【解决方案1】:

这里的难点在于,由于所有这些请求都作为聚合请求中的多部分元素传输,因此单个控制器将接收一个真正的 HttpRequest,其中包含包含请求文本的 文件,它的工作将是解析每个部分的文本,做通常 Tomcat 和 DispatcherServlet 做的事情!

我想的唯一方法是这个控制器打开一个到 tomcat 服务器的低级 Socket 连接(即在端口 8080 上),分别发送不同的部分,获取不同的 响应文本(而不是 HttpResponseS),将它们连接为一个 mime 多部分对象,并将其作为自己的响应的主体发送回。您仍然必须在串行操作(在单个连接上一个接一个地)、并行操作(一个部分在其自己的连接上)或在处理请求的连接上与池混合使用之间进行选择。

但这将是一个非常低级的组件,与实际服务关系不大。

根据评论编辑:

一开始我以为调用DispatcherServletservice方法就可以了。但这并不容易,因为:

  • 我不知道如何找到配置的DispatcherServlet,但只能得到它的RequestDispatcher - 好的,调用include方法就足够了,但有点棘手
  • 您需要手动解析 HTTP 协议以生成 HttpServletRequest(并且还从头开始生成 HttpServletResponse),这通常由容器完成。

这就是为什么我选择了低级套接字的解决方案,这种解决方案似乎矛盾地更直接

【讨论】:

  • 正确。我在想可能是 DispatcherServlet 将负责查看到达 */batch 的任何请求,并以同步、并行或异步方式(可配置)将多部分请求中的每个部分分派给具有设置 SLA 的所有控制器(等待 x ms 并且如果未返回特定请求,则在多部分中响应该部分的超时),这也将是可配置的。因此,如果发送了 3 个部分并且如果 2 个在 x ms 内响应但第 3 个需要更长的时间,则返回一个多部分响应,其中 2 个部分包含数据,一个部分有超时。一切都应该是可配置的
  • 只是需要一个解决方案。它应该是 DispatcherServlet、Filter 还是其他东西?什么是 impl 细节?
  • 谢谢。我还看到了一个 MultipartResolver (docs.spring.io/spring-framework/docs/current/javadoc-api/org/…)。这能以某种方式帮助我们吗?
  • @TimJohnson:MultipartResolver 必须被使用,但它只会将多部分拆分为 sequential files,但不会将它们转换为 @ 987654329@ 个对象。
猜你喜欢
  • 2016-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-10
  • 2015-09-22
  • 2016-01-12
  • 1970-01-01
  • 2014-10-10
相关资源
最近更新 更多