Angular SyntaxError: Неожиданный токен P в JSON в позиции 0 - PullRequest
1 голос
/ 03 октября 2019

Я пытаюсь загрузить файл xls с моим угловым приложением, это работало до angular 8 и вдруг больше не работает. Вот что у меня есть:

  export(selectedUsers: any) {
    this.getReport(selectedUsers).subscribe(data => this.downloadFile(data));
  }

  private getReport(selectedUsers: number[]): Observable<Blob> {
        const headers = new HttpHeaders({'content-type' : 'application/json',
                                'Access-Control-Allow-Origin' : '*',
                                responseType : 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'});
    return this.http.post<Blob>(this.globals.api + 'persoon/export', selectedUsers, {headers, 'blob'});
  }

  private downloadFile(data: Blob) {
    console.log('downloading...');
    const blob = new Blob([data], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
    const url = window.URL.createObjectURL(blob);
    window.open(url);
  }

В угловой документации упоминалось что-то вроде HttpEvent<Blob>, я тоже пробовал, но это не сработало. Я пробовал этот похожий вопрос: HttpClient - Как запросить данные не-JSON Но решение также не сработало, поскольку в основном говорилось, что оно не принимает responseType в данной позиции.

Я также проверил заголовки ответа на мой запрос, тип контента также application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

Вот мой импорт:

import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Mail } from './models/mail';
import { Klant } from './models/klant';
import { GlobalsService } from './globals.service';
import { Observable } from 'rxjs';

Может кто-нибудь указать мнеправильное направление и помочь мне решить эту проблему?

Ошибка моей консоли The console error ПРИМЕЧАНИЕ

Я получил еще одинвопрос после применения принятого решения:

the expected type comes from property 'responseType' which is declared here on type '{ headers?: HttpHeaders | { [header: string]: string | string[]; }; observe?: "body"; params?: HttpParams | { [param: string]: string | string[]; }; reportProgress?: boolean; responseType?: "json"; withCredentials?: boolean; }'

Для этого нужно перейти сюда: Типы свойства 'responseType' несовместимы

Ответы [ 2 ]

2 голосов
/ 03 октября 2019

Как упоминалось в сообщении, на которое вы ссылались. responseType: 'blob' - это не заголовок, а опция в запросе. поэтому ваш запрос должен выглядеть так:

  private getReport(selectedUsers: number[]): Observable<Blob> {
    const headers = new HttpHeaders({
      'content-type' : 'application/json',
      'Access-Control-Allow-Origin' : '*'
    });
    return this.http.post<Blob>(this.globals.api + 'persoon/export', selectedUsers, {headers, ResponseType: 'blob'});
  }
0 голосов
/ 03 октября 2019

Я думаю, что вы были на правильном пути с перемещением responseType, так как это вариант для запроса (т. Е. Должен интерпретироваться HttpClient), а не заголовок (для интерпретации сервером, получающим запрос)).

  private getReport(selectedUsers: number[]): Observable<Blob> {
        const headers = new HttpHeaders({'content-type' : 'application/json',
                                'Access-Control-Allow-Origin' : '*'
                               );
        const options = {
            headers: headers,
            responseType: 'blob'
            };
    return this.http.post<Blob>(this.globals.api + 'persoon/export', selectedUsers, options);
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...