Javascript 调用从Angular 6下载pdf的Spring boot api会导致错误can';t解析响应

Javascript 调用从Angular 6下载pdf的Spring boot api会导致错误can';t解析响应,javascript,angular,typescript,angular-httpclient,Javascript,Angular,Typescript,Angular Httpclient,我有一个spring boot API,可以创建pdf报告并下载,如果我在浏览器中直接调用该API,则会直接创建和下载pdf,但当我从Angular 6调用该GET API时,会出现以下错误: Spring引导(java)代码: Angular调用API后出现的控制台错误: error: SyntaxError: Unexpected token % in JSON at position 0 at JSON.parse (<anonymous>) at XMLHttpRequest

我有一个spring boot API,可以创建pdf报告并下载,如果我在浏览器中直接调用该API,则会直接创建和下载pdf,但当我从Angular 6调用该GET API时,会出现以下错误:

Spring引导(java)代码:

Angular调用API后出现的控制台错误:

error:
SyntaxError: Unexpected token % in JSON at position 0 at JSON.parse (<anonymous>) at XMLHttpRequest.onLoad 
message: "Http failure during parsing for https://localhost:7001/reports/app_report/en?appNum=xxxxxxx"
​
name: "HttpErrorResponse"
​
ok: false
​
status: 200
​
statusText: "OK"
​
url: "https://localhost:7001/reports/app_report/en?appNum=xxxxxx"

为什么Angular没有像我调用API时在浏览器中那样下载文件?(特别是由于请求成功)

为了避免JSON解析问题,您需要使用请求选项中的
responseType:“blob”
告诉http客户端响应将是一个blob

然后,要让导航器真正打开该文件,您可以按照


这应该适用于IE10+和其他现代浏览器,除了iOs(请参阅)

它缺少您的角度代码。很有可能,您需要在请求的选项中将
responseType
更改为'blob',抱歉,我忘了放置角度代码,基本上我正在使用httpClient.get方法调用api并订阅它记录响应,我尝试使用blob类型,但没有保存文件,没有出现错误,我会尽快添加代码,但我不能now@David我添加了Angular代码,不幸的是,即使响应类型为'blob'也没有帮助,它只帮助避免了json解析错误,但文件没有下载,请注意,在浏览器中调用api可以自动下载文件感谢您的帮助,我将尝试此方法,我想知道是否有任何方法可以直接从Angular调用API,就像从浏览器调用API一样?或者你认为我们必须使用这种解决方法?你也可以在一个新的选项卡中创建一个链接来打开url,这可能会起作用。多亏了一百万大卫,你的解决方案工作得非常出色
this.http.get(this.api_url + reportUrl, {
  responseType: 'blob'
}, ).subscribe((response: File) => {
  console.log('report is downloaded');
});

this.http.get(this.api_url + reportUrl).subscribe(
  (response) => {
    console.log('report is downloaded');
  });
error:
SyntaxError: Unexpected token % in JSON at position 0 at JSON.parse (<anonymous>) at XMLHttpRequest.onLoad 
message: "Http failure during parsing for https://localhost:7001/reports/app_report/en?appNum=xxxxxxx"
​
name: "HttpErrorResponse"
​
ok: false
​
status: 200
​
statusText: "OK"
​
url: "https://localhost:7001/reports/app_report/en?appNum=xxxxxx"
Content-disposition 
inline; filename=App_report_en.pdf
Content-Type    
application/x-pdf
    const fileName = "report.pdf";
    this.http.get(this.api_url + reportUrl, {  responseType: 'blob'})
    .subscribe((blob: Blob) => {
    console.log('report is downloaded');

    if (navigator.msSaveBlob) 
    { 
        // IE 10+
        navigator.msSaveBlob(blob, filename);
    }
    else 
    {
        let link = document.createElement("a");
        if (link.download !== undefined) 
        {
            let url = URL.createObjectURL(blob);
            link.setAttribute("href", url);
            link.setAttribute("download", fileName);
            link.style.visibility = 'hidden';
            document.body.appendChild(link);
            link.click();
            document.body.removeChild(link);
        }
        else
        {
            //html5 download not supported
        }
    }   
});