Сохранить CSV-файл из HttpClient пост ответа - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть веб-сайт, где пользователь может запросить некоторые данные в виде csv-файла.Затем данные возвращаются как и должны быть загружены / сохранены в файл.

Я отправляю запрос на публикацию и подписываюсь, но, похоже, каждый раз происходит сбой в методе catch.

Заголовок запроса, удаленная авторизация и тому подобное:

POST /api/@£$ HTTP/1.1
Connection: keep-alive
Content-Length: 144
Accept: application/json, text/plain, */*
Origin: https://@£$
Authorization: @£$
Content-Type: application/json
Accept-Encoding: gzip, deflate, br
Accept-Language: en-GB,en;

с телом, содержащим параметры, поэтому ответ правильный.

Ответ:

HTTP/1.1 200 OK
Transfer-Encoding: chunked
Content-Type: text/csv
Content-Encoding: gzip
Vary: Origin,Accept-Encoding
Server: Kestrel
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: 
Request-Context: 
Content-Disposition: attachment; filename=export_20181120_103716.csv
X-Powered-By: ASP.NET
Set-Cookie: 
Date: Tue, 20 Nov 2018 10:37:16 GMT

Я что-то упускаю из виду?Нужно ли устанавливать тип ответа?Этот API-интерфейс будет возвращать только данные CSV-файла, поэтому не нужно проверять тип файла.

EDIT: добавление кода, отправляющего запрос.

dataExport(parameters) {

    const send = {
        'id': parameters.ids,
        'from': parameters.from,
        'to': parameters.to
    };

    this.adalService.post(url, send,
  { headers: new HttpHeaders({ 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json'}) })
        .do(() => { this.success('success'); })
        .catch((error) => {
            this.error(error);
            return Observable.of(null);
        })
        .subscribe(r => {
            const blob = new Blob([r], {type: 'text/csv'});
            const url = window.URL.createObjectURL(blob);
            window.open(url);
        });

}

EDIT: добавлено responseType: 'text' к пост-запросу.Это не вызывает улов из-за неправильного формата ответа.Это правильный тип?машинопись не позволила мне использовать text / csv или application / csv.И я беспокоюсь, что когда файл станет действительно большим, у блоба не будет достаточно места для сохранения данных.

1 Ответ

0 голосов
/ 21 ноября 2018

Удалось решить мою проблему с помощью заголовка responseType, а также с помощью пакета file-saver npm.Это решение является жизнеспособным в настоящее время, но поскольку это данные, выбранные пользователем, размер файла может стать большим ...

  ...post(url, send,
        { headers: new HttpHeaders({ 'Authorization': `Bearer ${token}`, 'Content-Type': contentType  }), observe: 'response', responseType: 'text'})
  .subscribe(r => { saveAs(new Blob([r.body], { type: 'text/csv' }), 'download.csv')});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...