如何编写原始多部分 SOAP HTTP 消息以使用 Grails 输出

How to write raw multipart SOAP HTTP message to output with Grails

我有一个 Grails 应用程序,它应该使用以前存储的原始 SOAP 消息进行响应。这些消息是从数据库中读取的。当我将消息写入输出时,它被添加到 HTTP 响应的 body 部分。结果是读取客户端响应失败,因为 HTTP headers 等是 body 的一部分。客户端的结果看起来像这样

------=_Part_0_1123526246346
Content-Type: application/soap+xml; charset=utf-8
Content-Transfer-Encoding: 8bit
Content-ID: <some-id>

<soap:Envelope>
<!-- Message contents -->
</soap:Envelope>

------=_Part_0_1123526246346
Content-Type: application/pdf
Content-Transfer-Encoding: binary
Content-ID: <temp.pdf>
Content-Disposition: attachment; name="temp.pdf"

<!-- Lots of binary data -->

%%EOF
------=_Part_0_1123526246346--

所有这些都意味着它是一个包含 PDF 文档作为附件的多部分 SOAP 消息。写入数据库的消息被客户端正确使用,只有 soap 信封被视为 body,PDF 被视为附件。

如何使用 Grails 将此消息写为 RAW 输出,这样 HTTP 内容才不会被复制?

如果你需要完全控制控制器产生的response,包括headers,那么你应该通过response [=31]查看response object which is available. Every controller in Grails has access to the HttpServletResponse =] 这样您就可以自己管理原始响应。

但是,您的问题是您需要 multi-part 响应并且 HTTP headers 嵌入在您的文本中。您应该能够解析它们并从 Jason Hunter 手动创建 MultiPartResponse using the famous package

通过对您的数据进行一些分析,结合 Grails 中可用的 HttpServletResponseMultipartResponse,您应该能够获得所需的结果。

另一个可能的选择是简单地在 HttpServletResponse 上设置 headers 以指示它是一个 multi-part 响应并将 text/data 直接写入输出流。这可能有效也可能无效,具体取决于它的消费方式,但值得一试。

// some controller method
response.setContentType("multipart/x-mixed-replace")
response.outputstream << theDataAsAByteArray