有效载荷(空内容类型)禁止错误|从ember

时间:2017-10-01 16:28:37

标签: javascript pdf ember.js

目标:想要通过生成以下网址从服务器下载PDF文件: http://localhost:4200/bookStore/secured/rest/books/14119

在路线中的book.js中执行以下行时会生成URL。

return this.store.findRecord('book', bookId);

但我得到403禁止错误。详细错误:

Error: Ember Data Request GET /bookStore/secured/rest/books/14119 returned a 403
Payload (Empty Content-Type)
Forbidden
    at new AdapterError (-private.js:3170)
    at Class.handleResponse (rest.js:594)
    at ajaxError (rest.js:956)
    at Class.hash.error (rest.js:623)
    at fire (jquery.js:3317)
    at Object.fireWith [as rejectWith] (jquery.js:3447)
    at done (jquery.js:9274)
    at XMLHttpRequest.<anonymous> (jquery.js:9514)

我是否需要将内容类型设置为'application / pdf'?如果是,那么请建议如何设置它。

以下是JS代码:

路由\ book.js

actions: {
    pdfClick(bookId) {
      return this.store.findRecord('book', bookId);
   }
}

模板\ book.hbs

<button {{action "pdfClick" book.bookId}}>PDF</button>

在服务器端,接收和响应请求的代码如下:

@GET
@Path("/{bookId}")
@Produces("application/pdf")
public Response bookExport(@PathParam("bookId") long bookId) {
   //Code
}

根据服务器端代码,我们从服务器获取PDF文件。使用PostMan成功测试。

3 个答案:

答案 0 :(得分:6)

看起来您正在尝试使用Ember Data下载PDF文件。 Ember Data主要用于处理JSON数据,因此在这种情况下这可能不是最合适的。您仍然可以继续使用Ember Data,但是为了下载PDF,我建议您只使用它来生成正确的URL。

您应该能够像这样大致生成URL:

let url = this.store.adapterFor('book').urlForFindRecord(bookId, 'book');

或只是:

let url = `http://localhost:4200/bookStore/secured/rest/books/${bookId}`;

如果您根本不想使用Ember数据。

最后下载您可以使用的PDF:

document.location.assign(url);

或将您的按钮转换为链接:

<a href={{url}}>Download PDF</a>

答案 1 :(得分:0)

您正在向http://localhost:4200/bookStore/secured/rest/books/14119发出请求,但这是Ember开发服务器。如果使用ember数据,则可以在适配器中自定义主机。有关如何执行此操作,请参阅this section of the documentation

请注意,Ember Data不知道如何自动处理PDF文件。如果您只是想下载它,我建议您直接使用<a href="location of pdf file"链接到它。

答案 2 :(得分:0)

您想要检索二进制文件(pdf)作为对休息呼叫的响应。您有几种不同的选择:

第一个与TBienek的<a href={{url}}>Download PDF</a> aproach相同。我认为这是简单的跨浏览器解决方案。这将使得需要休息。

第二个是在json对象中发送pdf字节,例如:

{
  content:'<base64 encoded byte arr>',
  filename:'<string>,
  contentType: 'application/pdf'
}

之后创建一个Blob content并触发打开它(通过window.open)。

还有第三种方法可以在不改变当前服务器端点的情况下使用XMLHttpRequest。在第二个选项中使用response XMLHttpRequest作为content

他们都没有使用Ember数据。