Angular 2 télécharger .CSV file click event avec authentification

J'utilise un backend de démarrage de printemps et mon api utilise un service pour envoyer des données via OutputStreamWriter. Je peux télécharger cela dans Angular 2 à l'aide d'un événement de clic comme ceci:

Manuscrit

results(){ window.location.href='myapicall'; } 

HTML

 <button (click)="results()" class="btn btn-primary">Export</button> 

Cela fonctionne très bien; Cependant, j'ai récemment mis en place la sécurité pour mes points d'extrémité api et maintenant je reçois un 401 chaque fois que j'essaie de faire l'appel car il n'émet pas d'en-tête.

J'ai écrit un service que je peux voir les résultats dans la console, mais je n'arrive pas à comprendre comment télécharger le fichier.

TéléchargerFileService

 import {Injectable} from '@angular/core'; import { Http, Headers } from '@angular/http'; import 'rxjs/Rx'; @Injectable() export class DownloadFileService { headers:Headers; bearer: string; constructor(public http: Http) {} getFile(url:string) { this.bearer = 'Bearer '+ localStorage.getItem('currentUser'); this.headers = new Headers(); this.headers.append('Authorization', this.bearer); return this.http.get(url, {headers: this.headers}); } } 

J'ai essayé de télécharger les données via un blob comme suggéré dans cette publication: Comment puis-je télécharger un fichier avec Angular2

Le fichier téléchargé est de type Fichier et le contenu est:

Réponse avec statut: 200 OK pour URL: mon URL

Il ne télécharge pas réellement les données.

 downloadFile(data: any){ var blob = new Blob([data], { type: 'text/csv' }); var url= window.URL.createObjectURL(blob); window.open(url); } results(){ // window.location.href='myapicall'; let resultURL = 'myapicall'; this.downloadfileservice.getFile(resultURL).subscribe(data => this.downloadFile(data)),//console.log(data), error => console.log("Error downloading the file."), () => console.info("OK"); } 

On dirait que vous devez simplement analyser le corps de la réponse, c'est-à-dire

 let parsedResponse = data.text(); this.downloadFile(parsedResponse); 

De même, je vous recommande d'utiliser FileSaver pour télécharger des fichiers car, même en 2016, il ne semble pas y avoir de moyen standard pour le faire dans les navigateurs.

 let blob = new Blob([data], { type: 'text/csv' }); saveAs(blob, "data.txt"); 

Pour un guide plus approfondi, vérifiez ici