我如何让HttpClient将数据作为JSON对象返回?
角度文档说HttpClient应该将返回的JSON数据解析为一个对象。在我的项目中,它仅以字符串形式返回数据。
如果我使用JSON.parse
,则可以将数据转换为对象并以这种方式获取数据,然后它就可以工作了。但是从我在文章中看到的情况来看,这不是一个好习惯。此外,大多数文章/教程仅使用界面。
我已经创建了一个界面并尝试使用它,但是它不起作用。我已经阅读了很多文章和文章,但是所有人都说HttpClient应该默认返回一个对象。
这是我服务中的代码。 第一个函数获取用户的坐标,第二个函数使用坐标从api请求数据。
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable, pipe } from 'rxjs';
import { map } from 'rxjs/operators';
import { environment } from '../../../environments/environment';
import { Aqi } from './aqi';
@Injectable({
providedIn: 'root'
})
export class AqiService {
aqiUrlCoords = `${environment.apiUri}airvisual/geo/`;
constructor(private http: HttpClient) {}
getLocation(): Observable<any> {
return Observable.create(observer => {
if(window.navigator && window.navigator.geolocation) {
window.navigator.geolocation.getCurrentPosition(
(position) => {
observer.next(position);
observer.complete();
},
(error) => observer.error(error)
);
} else {
observer.error('Unsupported Browser');
}
});
}
getGeoLocationAqi(lat, long): Observable<any> {
return this.http.get<any>(this.aqiUrlCoords, { params: {
lat: lat,
long: long
}});
}
}
要使getGeoLocationAqi()
功能正常工作,我必须使用此功能...
getGeoLocationAqi(lat, long): Observable<any> {
return this.http.get<any>(this.aqiUrlCoords, { params: {
lat: lat,
long: long
}}).pipe(
map(res => {
return JSON.parse(res);
})
);
}
这是使用服务和数据的组件。 typeof总是打印字符串。
import { Component, OnInit } from '@angular/core';
import { AqiService } from '../services/aqi/aqi.service';
import { Aqi } from './aqi';
export class GeoComponent implements OnInit {
aqi: any;
errorMessage: string;
constructor(private aqiService: AqiService) {}
ngOnInit() {
this.getCurrentCoordinatesAqi();
}
getCurrentCoordinatesAqi() {
this.aqiService.getLocation().subscribe(pos => {
let lat = pos.coords.latitude.toString();
let long = pos.coords.longitude.toString();
this.aqiService.getGeoLocationAqi(lat, long).subscribe((res) => {
this.aqi = res;
console.log(res);
console.log(typeof res);
});
}, (err) => {
this.errorMessage = err;
});
}
}
这是我创建的界面。
export interface Aqi {
status: string,
data: {
city: string,
state: string,
country: string,
location: {
type: string,
coordinates: [
number,
number
]
},
current: {
weather: {
ts: string,
hu: number,
ic: string,
pr: number,
tp: number,
wd: number,
ws: number
},
pollution: {
ts: string,
aqius: number,
mainus: string,
aqicn: number,
maincn: string
}
}
}
}
这是使用邮递员从api返回的内容。
{
"status": "success",
"data": {
"city": "Hanoi",
"state": "Hanoi",
"country": "Vietnam",
"location": {
"type": "Point",
"coordinates": [
105.81881,
21.021938
]
},
"current": {
"weather": {
"ts": "2019-04-30T16:00:00.000Z",
"hu": 100,
"ic": "04n",
"pr": 1010,
"tp": 25,
"wd": 70,
"ws": 2.6
},
"pollution": {
"ts": "2019-04-30T15:00:00.000Z",
"aqius": 151,
"mainus": "p2",
"aqicn": 76,
"maincn": "p2"
}
}
}
}
我希望typeof
打印object
,但是除非我使用string
,否则它总是打印JSON.parse()
。当使用接口时,我仍然得到字符串。任何帮助表示赞赏!
答案 0 :(得分:2)
您不需要解析响应,默认情况下,http客户端会返回对象,只要您的端点返回JSON对象且内容类型为application / json。您的端点可能正在返回某种文本内容类型。