在Jetty 8下运行的Servlet接收以下请求:
Header:
Content-Type = multipart/related; boundary=example
Data:
--example
content-type: text/xml; charset=UTF-8
data1here
--example
content-type: text/xml; charset=UTF-8
data2here
--example--
>有没有一种方便的方法从这种请求中获取“data1here”和“data2here”?
> Java servlet本身是否支持它?
>或者是否有任何其他库支持它?
Consume使用Apache CXF提供的JAX-RS注释事件:
@Consumes("multipart/related")
从JAX-RS文档:
It is now possible (since 2.2.5) to have individual
multipart/form-data
parts read by registered JAX-RS MessageBodyReaders,something that is already possible to do for types likemultipart/mixed
ormultipart/related
.
也可以看看:
> Spring boot multipart/related mime type support
> Jersey: How to register MultiPartConfigProvider class
请注意,GlassFish使用的Jersey在其source code中没有提及相关内容.
HTTP客户端
Google为HTTP client提供API,根据RFC解析多部分/相关消息.
高枕无忧
RESTeasy项目可以通过JAX-RS解析multipart/related
内容.
JavaMail API
通过一些流扭曲,可以使用JavaMail API来解析MimeMultipart消息:
The default multipart subtype is “mixed”. The other multipart subtypes,such as “alternative”,“related”,and so on,can be implemented as subclasses of MimeMultipart with additional methods to implement the additional semantics of that type of multipart content.
JavaMail FAQ提供了更多细节:
As described above,there are more complex cases to consider as well. In particular,messages may have arbitrary nesting of
multipart/mixed
andmultipart/alternative
parts and may includemultipart/related
parts for embedded HTML andmultipart/signed
and/ormultipart/encrypted
parts for secure messages.
我建议不要使用这种方法,因为它混合了隐喻(它将MIME / HTTP上的MIME与SMTP /邮件上的MIME混为一谈).也就是说,JavaMail在概念上用于通过SMTP / IMAP读取和写入消息,这可能会让未来的维护者想知道为什么使用JavaMail来解析通过Servlet接收的MIME消息,特别是当有基于注释的解决方案时.也就是说,记录代码及其使用原因将是一种避免混淆的方法.
容器
根据容器的不同,它可能会也可能不会处理所有相关的RFC.您可能必须尝试(或仔细阅读)不同容器的源代码,以查看实现此功能的内容.
码头
source code有一些与解析输入流相关的点,仅限于多部分/表单数据:
> MultiPartFilter
> MultiPartInputStreamParser
此外,unit tests不包括RFC 2387,这是一个强有力的指示,表明容器不处理Servlet 3.0 API下的相关部分.因此,JAX-RS可能是最好的方法.
Tomcat的
Tomcat将not implemented多部分/相关作为Servlet 3.0规范的一部分,尽管存在Tomcat 7.0.47的修补版本.