优雅地处理REST服务器错误

时间:2015-03-12 19:21:24

标签: javascript jquery rest pdf

我有一个动态生成PDF的应用程序(通过service / generatePdf访问)。

它返回一个HTTP响应,其内容类型=" application / pdf"并且outputStream设置为二进制内容。

根据业务规范,当用户点击按钮时,我们需要打开一个显示该PDF的新窗口/标签。

提交下面的表格,一切都在Happy Path上精彩地发挥作用,其中响应是实际的PDF。

<form action="service/generatePdf" method="post" name="PdfForm" target="_blank">

然而,不能正常工作的是,无法以任何理由生成PDF。例如,假设HTTP响应outputStream为空。

想要能够做的是在第一页上显示一条漂亮的错误消息,而不是打开新窗口/标签。

但似乎没有办法做到这一点。你的选择似乎是

  • 返回有效的PDF或
  • 了解浏览器的PDF插件如何处理损坏的文件

我已经尝试过jQuery,Ajax,jQuery Form Plugin,jQuery Download plugin插件,但似乎没有任何效果。

2 个答案:

答案 0 :(得分:4)

服务器应通过HTTP状态代码指示错误或成功(例如200 = OK,500 =错误)。这可以通过JQuery

在REST客户端中捕获
$.ajax({
    url: 'service/generatedPDF',
    error: function(jqXHR, textStatus, errorThrown) {
        ... // show error message
    },
).done(function(data) {
    // data contains the PDF
}

最好在服务器上创建PDF,将其放在临时存储中,然后在响应中将URL发送到此PDF。客户端下载文件后,或在某次下载后,将从商店中删除PDF。

在这种情况下,您只需打开一个新窗口,其中包含您从服务器收到的URL。

如果服务器在初始请求中提供PDF,您可以将其转换为Data URI并在新窗口中打开该数据URI。

答案 1 :(得分:0)

这是一个相当普遍的要求。您需要使您的REST应用程序更智能一点。它需要检查LiveCycle PDF生成的结果,如果不成功,则返回HTML响应(内容类型为text / html)。

浏览器相当愚蠢。它检查传入响应的内容类型,并根据内容类型启动插件。然后由插件来处理响应。 PDF插件也不那么明亮,它假设传入的数据流是PDF,如果它是空的,则会产生错误。

这里的关键是向浏览器发送正确的内容类型(和内容),这意味着如果PDF结果失败,请检查PDF结果并发送更合适的响应。

我们经常在LiveCycle业务流程中看到这一点。诱惑是将PDF生成为com.adobe.idp.Document对象,然后直接返回该对象。这会导致您描述的类似问题。相反,更好的方法是检查PDF生成的结果。 如果有效,则返回该响应。如果PDF生成失败,则在com.adobe.idp.Document对象(具有相应的text / html内容类型)中构造HTML响应,然后返回该响应。