【发布时间】:2018-12-11 19:33:41
【问题描述】:
我正在使用返回 PDF 作为响应的 Web API 服务 (DocRaptor)。在最初使用 API 时,我能够生成 PDF 并在他们的网站上查看 PDF。我收到一个 200 状态代码,告诉我响应成功。但是,使用此代码,帖子的结果仍然在 Angular 端作为错误返回:
return this.http
.post("https://docraptor.com/docs", {
headers: {
"Content-Type": "application/json"
},
user_credentials: "WEB_API_KEY",
doc: {
test: true,
name: "testDocument.pdf",
document_content: documentContent,
type: "pdf"
}
})
.subscribe(
res => {
console.log(res);
},
err => {
console.log("Error occured: " + err);
}
);
我假设这是因为代码期望 JSON 作为结果,而 API 返回了 PDF。
Angular 在Requesting non-JSON Data 上的文档没有详细说明如何使用 HttpClient 来使用响应(DocRaptor 的文档也没有就此问题)。调试时,我无法告诉(使用 Chrome 中的网络选项卡)API 调用甚至正在发送,或者使用下面的代码返回响应。这可能是以下语法中的一个问题,但以下代码是我尝试使用我知道可用的文档的一种方法:
return this.http
.post("https://docraptor.com/docs", {
responseType: "blob",
headers: {
"Content-Type": "application/json",
Accept: "application/pdf"
},
user_credentials: "WEB_API_KEY",
doc: {
test: true,
name: "testDocument.pdf",
document_content: documentContent,
type: "pdf"
}
})
.pipe(tap(data => this.downloadFile(data, "application/pdf")));
更新:
我已按照此处回复中的建议重新构建了我的代码。但是,我仍然收到原始错误,即我从 DocRaptor API 返回 200 状态,但 Angular 的 HttpClient 没有将响应解析为 PDF。我已在标题中添加以接受 PDF,但我仍然收到一条错误消息“位置 0 处的 JSON 中的意外令牌 %”。
repl.component.ts
generatePdf() {
var htmlCard = this.cards.filter((card: Card) => card.language === "html")[0];
var cssCard = this.cards.filter((card: Card) => card.language === "css")[0];
var documentContent = this.generateCode(
htmlCard.editorContent,
cssCard.editorContent
);
this.docRaptorService.generatePdf(documentContent).subscribe(results => {
let blob = results;
let filename = "testDocument.pdf";
FileSaver.saveAs(blob, filename);
});
}
doc-raptor.service.ts
generatePdf(documentContent: string) {
return this.http
.post("https://docraptor.com/docs", {
headers: {
"Content-Type": "application/json",
Accept: "application/pdf"
},
user_credentials: "WEB_API_KEY",
doc: {
test: true,
name: "testDocument.pdf",
document_content: documentContent,
type: "pdf"
},
responseType: "blob"
})
.pipe(
tap(
data => console.log(documentContent, data),
error => console.log(documentContent, error)
)
);
}
【问题讨论】:
-
在您的第二个示例中,未订阅 Observable。不知道你是否在其他地方订阅,但 Observables 在订阅之前什么都不做。
-
我不确定
pipe和tap与subscribe的关系如何。 Angular 的文档在本节中省略了subscribe,因此我假设当您尝试在返回中使用非 JSON 数据时,使用pipe和tap代替subscribe。 -
pipe和tap是运算符,是Observable流的核心部分。当数据通过流时,它们会更改数据,在这种情况下,将数据散布到对象中。 Angular 在这里省略了subscribe,因为在服务中将subscribe转换为Observables被认为是不好的做法,而是将Observable返回给调用者。Observables仅在订阅时运行。 -
以下链接解决了我的问题。stackoverflow.com/questions/50332447/…
标签: angular pdf http-post pdf-generation angular-httpclient