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

时间:2015-02-16 08:28:33

标签: http grails http-headers multipart

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

------=_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--

所有这些意味着它是一个多部分SOAP消息,其中PDF文档作为附件出现。写入数据库的消息由客户端正确使用,只有肥皂信封被视为正文,PDF作为附件。

如何使用Grails将此消息写为RAW输出,以便HTTP内容最终不会重复?

1 个答案:

答案 0 :(得分:1)

如果您需要完全控制控制器生成的response,包括标题,那么您应该查看可用的response对象。 Grails中的每个控制器都可以通过response对象访问HttpServletResponse,因此您可以自己管理原始响应。

但是,您的问题是您需要多部分响应,并且HTTP标头嵌入在您的文本中。您应该能够解析它们并使用Jason Hunter的MultiPartResponse手动创建famous package

通过对您的数据进行一些解析,结合Grails和HttpServletResponse中提供的MultipartResponse,您应该能够获得所需的结果。

另一个可能的选择是简单地在HttpServletResponse上设置标头以指示它是多部分响应并将文本/数据直接写入输出流。这取决于它的消耗方式可能有效,也可能无效,但值得一试。

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