我做了一个api调用并得到如下所示的响应,显示在控制台上
我的Api提供者:
import { HttpClient, HttpParams, HttpHeaders } from '@angular/common/http';
import { Injectable } from '@angular/core';
import 'rxjs/add/operator/map';
@Injectable()
export class RestapiProvider {
apiUrl = 'http://example.com/api/GetItemByCategory?cat_id=1&merchant_id=1&json=true';
constructor(public http: HttpClient) {
//console.log('Hello RestapiProvider Provider');
}
getItembyCategory() {
return new Promise(resolve => {
this.http.get(this.apiUrl).subscribe(data => {
resolve(data);
console.log(data);
}, err => {
console.log(err);
});
});
}
Console.log(数据)显示
[object Object]: {code: 1, details: Object, msg: "success..", request: "{"cat_id":"1","merchant_id":"1","json":"true"}"}
我需要解析' details: Object
'
我尝试了 console.log(data.details)
得到错误:
Unable to get property 'details' of undefined or null reference
更新
我试图使用map
运算符,如下所示
this.http.get(this.apiUrl).map(data => data.json()).subscribe(data => {
resolve(data);
console.log(data);
}
又出现了一个错误:property json does not exist on type 'Object'
请让我知道如何使它在离子3上起作用。
此致
答案 0 :(得分:4)
我设法完成了细节'与
data['details'];
和' item'
data['details']['item'];
感谢所有建议。
答案 1 :(得分:0)
你为什么不尝试这样:
导入toPromise运算符:
import 'rxjs/add/operator/toPromise';
然后在你的帮助下将你的观察变成一个承诺。当您使用新的Angular HttpClient
时,无需将响应映射到Json,默认情况下会映射它。
getItembyCategory() {
return this.http.get(this.apiUrl)
.toPromise()
.then((data: any) => {
console.log('Success', data.details);
return data;
})
.catch(err => {
console.log('Error', err);
return err;
})
}
这样代码就更清晰了。它经过测试和运作。如果没有,那么你应该检查你的apiUrl。
<强>被修改强>
您收到错误property 'details' does not exist on type 'Object'
的原因是您需要为收到的数据对象提供类型(默认Object
除外)。我用这个更新了这个例子:
(data: any) => {
console.log(data.details);
return data;
}
这比data['details']
:)中的丑方括号要好得多。