在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--
答案 0 :(得分:6)
Consume使用Apache CXF提供的JAX-RS注释事件:
@Consumes("multipart/related")
来自JAX-RS文档:
现在可以(从2.2.5开始)通过已注册的JAX-RS MessageBodyReaders读取单个
multipart/form-data
部分,这些内容已经可以用于multipart/mixed
或{{1}等类型}。
另见:
请注意,GlassFish使用的Jersey在其source code中未提及multipart/related
。
Google为API提供HTTP client,根据RFC分析related
条消息。
RESTeasy项目可以通过JAX-RS解析multipart/related
内容。
通过一些流扭曲,可以使用JavaMail API来解析MimeMultipart消息:
默认的多部分子类型为"混合"。其他多部分子类型,例如" alternative","相关"等等,可以实现为MimeMultipart的子类,并使用其他方法来实现该类型的多部分内容的附加语义
JavaMail FAQ提供了更多详细信息:
如上所述,还有更复杂的案例需要考虑。特别是,消息可能具有
multipart/related
和multipart/mixed
部分的任意嵌套,并且可能包含multipart/alternative
部分用于嵌入式HTML和multipart/related
和/或multipart/signed
部分以确保安全消息。
我建议反对这种方法,因为它混合了隐喻(它将MIME / HTTP上的MIME与SMTP /邮件上的MIME混为一谈)。也就是说,JavaMail在概念上用于通过SMTP / IMAP读取和写入消息,这可能会让未来的维护者想知道为什么使用JavaMail来解析通过Servlet接收的MIME消息,特别是当有基于注释的解决方案时。也就是说,记录代码及其使用原因是避免混淆的一种方法。
根据容器的不同,它可能会也可能不会处理所有相关的RFC。您可能必须尝试(或仔细阅读)不同容器的源代码,以查看实现此功能的内容。
source code有几个与解析输入流相关的点,仅限于multipart/encrypted
:
此外,unit tests不包含RFC 2387,这是容器无法处理Servlet 3.0 API下的multipart/form-data
部分的强烈指示。因此,JAX-RS可能是最好的方法。
Tomcat将not implemented related
作为Servlet 3.0规范的一部分,尽管存在Tomcat 7.0.47的修补版本。
答案 1 :(得分:-2)
您可以使用JavaMail库并以“mail”方式读取数据。最终得到一个MimeMessage,可以通过BodyParts进行处理。用法非常简单,我使用这种方法来实现AS2服务器,我看到AS2的其他实现也是如此,所以这是一种非常常见的方法。
我不认为这里存在标准冲突。整个请求格式是MIME,因此处理用于处理MIME编码消息的库处理它是我处理事情的正确方法。