Ошибка Http во время синтаксического анализа для http: // {url} - ngx-restangular - PullRequest
4 голосов
/ 23 апреля 2020

Я использую Angular 8. Я звоню бэкэнду, ответом которого является файл PDF. Я использую ngx-restangular версию 5. При звонке в бэкэнд от почтальона я получил ожидаемый ответ. Но вызов backend из angular приводит к следующей ошибке в консоли:

{
  headers: {...},
  status: 200,
  statusText: "OK",
  url: "...",
  ok: false,
  name: "HttpResponseError",
  message: "Http failure during parsing for http://{url}",
  error: {...},
  request: {...},
  data:{...}
}

Я попытался добавить responseType: 'blob' в заголовок, как предложено в некоторых решениях. Но это тоже не работает. Ниже приведен код.

класс обслуживания:

...
download(id: number): Observable<any> {
    return this.restAngular
              .one('/download/' + id)
              .customGET('', {}, {responseType: 'blob'});
}
...

класс компонента:

printFile(id: number) {
    this._service.download(id).subscribe(
        res => {
            FileSaver.saveAs(res, 'form.pdf');
        }, err => {
            console.log(err);
        }
    );
  }

и пользовательский перехватчик выглядит следующим образом:

@Injectable({providedIn: 'root'})
export class CustomHttpInterceptor implements HttpInterceptor {

    intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        const accessToken = localStorage.getItem('accessToken');
        if (accessToken) {
            request = request.clone({
                headers: new HttpHeaders({
                    'Content-Type': 'application/json',
                    'Authorization': accessToken,
                    'Accept': 'application/json'
                })
            });
            return next.handle(request);
        } else {
            request = request.clone({
                headers: new HttpHeaders({
                    'Content-Type': 'application/json',
                    'Accept': 'application/json'
                })
            });
            return next.handle(request);
        }
    }
}

app.module.ts:

...
export function restangularConfigFactory(RestangularProvider) {
    RestangularProvider.setBaseUrl(environment.baseUrl);
    RestangularProvider.setDefaultHeaders({Authorization: sessionStorage.getItem('accessToken')});
}

@NgModule({
    declarations: [
        ...
    ],
    imports: [
        BrowserModule,
        AppRoutingModule,
        EntityModule,
        RestangularModule.forRoot(restangularConfigFactory),
        ReactiveFormsModule,
        ...
    ],
    bootstrap: [AppComponent],
    providers: [{
        provide: HTTP_INTERCEPTORS, useClass: CustomHttpInterceptor, multi: true
    }],
    schemas: [
        CUSTOM_ELEMENTS_SCHEMA
    ]
})
export class AppModule {
}

ошибка выглядит так:

enter image description here

Ответы [ 2 ]

0 голосов
/ 02 мая 2020

Вы пытаетесь проанализировать PDF как приложение / json. Установите mime-тип для ответа на application / pdf.

0 голосов
/ 28 апреля 2020

Согласно документации , вы можете передавать только параметры строки заголовка с customGET, поэтому ваш тип ответа BLOB-объекта игнорируется. Вы можете убедиться, что, как показывает ваш скриншот, ошибка произошла при вызове JSON.parse

. Вы можете использовать .withHttpConfig для передачи пользовательской конфигурации в базовый httpClient

download(id: number): Observable<any> {
    return this.restAngular.one('/download/' + id)
    .withHttpConfig({responseType: 'blob'})
    .get();
}

Вот 1011 * Пример стекаблиц

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...