(角度5)でこのように観測できるようにしたいと思います。 Angular 6でresponseType
を宣言するにはどうすればよいですか?
Angular 5コード:
public ExportSomeThing(
ano: number
): Observable<IDownloadArquivo> {
let q = this.http
.get(this.apiUrl + ano + '/pordia/Excel', {
responseType: ResponseContentType.Blob // <<<-- This code
}).map((res) => {
My angular 6 code:
public MyExport(
ano: number
): Observable<IXpto> {
let q = this.http
.get( this.api_rul + ano + '/some_path/', {
responseType: "ResponseContentType.Blob" // <<<--- error here !!!
}).map((res) => {
エラーは:
[ts]
Argument of type '{ responseType: "ResponseContentType.Blob"; }' is not assignable to parameter of type '{ headers?: HttpHeaders | { [header: string]: string | string[]; }; observe?: "body"; params?: HttpParams | { [param: string]: string | string[]; }; reportProgress?: boolean; responseType?: "json"; withCredentials?: boolean; }'.
Types of property 'responseType' are incompatible.
Type '"ResponseContentType.Blob"' is not assignable to type '"json"'.
http.get
をAngular 6?で類似させるにはどうすればよいですか?
Excelメソッドをダウンロードしようとしています!
回避策Angular 8
クライアント側:
getBlob(url: string): Observable<Blob> {
return this.http.get<Blob>(url, { observe: 'body', responseType: 'blob' as 'json' })
}
'blob'を 'json'トリックとして注意してください
サーバー側はbyte []を返します:
@GetMapping(value = "/api/someApi")
public @ResponseBody byte[] GetBlob() {
byte[] ret = this.service.getData();
return ret;
}
「ResponseContentType.Blob」を「blob」に置き換えます
this.http.get( this.api_rul + ano + '/some_path/', {
responseType: 'blob'
}).map((res) => {})
これは、Angular 6 +バージョンにresponseTypeを追加する方法です。
const httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'application/json'
}),
observe: 'response' as 'body',
responseType: 'blob' as 'blob'
};
return this.httpClient.get("API_URL", httpOptions);
詳細については、 ここ を参照してください。
非常に良い説明が与えられています ここ 。以下のコードを試してください
public getRequest(urlPath: string): Observable<any> {
const options = {
headers: new HttpHeaders({
'Content-Type': 'application/json',
'Authorization': token // if you have to give token
}),
// Ignore this part or if you want full response you have
// to explicitly give as 'boby'as http client by default give res.json()
observe:'response' as 'body',
// have to explicitly give as 'blob' or 'json'
responseType: 'blob' as 'blob'
};
// resObj should be of type Blob
return this.http.get(urlPath, options)
.map((resObj: Blob) => resObj)
.catch((errorObj: any) => Observable.throw(errorObj || 'Server error'));
}
これを試して。私にとってはうまくいきます...
public post(data?: any, useHeaders: boolean = true, contentType: HttpContentTypeEnum = HttpContentTypeEnum.Json, responseType: HttpResponseTypeEnum = HttpResponseTypeEnum.Json): Observable<any> {
try {
if (useHeaders) {
let resonseType: any;
let headers: HttpHeaders;
switch (contentType) {
case HttpContentTypeEnum.Json: {
headers = new HttpHeaders({ "Content-Type": "application/json" });
break;
}
}
switch (responseType) {
case HttpResponseTypeEnum.Text: {
resonseType = 'text';
break;
}
case HttpResponseTypeEnum.Json: {
resonseType = 'json';
break;
}
case HttpResponseTypeEnum.Blob: {
resonseType = 'blob';
break;
}
}
return this.http.post(this._baseUri, data, { responseType: resonseType, headers: headers }).pipe(catchError((err: any) => {
if (err.status === 401) {
return Observable.throw('Unauthorized');
}
}));
}
else {
return this.http.post(this._baseUri, data).pipe(catchError((err: any) => {
if (err.status === 401) {
return Observable.throw('Unauthorized');
}
}));
}
} catch (err) {
//console.log((<Error>e).message);
}
}