我正在使用维基百科的api,响应如下:
{
'query': {
'pages': {
212187: {
'extract': value;
}
}
}
}
我正在尝试获取提取值。但是,当我无法越过212187时,因为它是一个数字,随着我的每次通话都会改变。这不允许我准确地建模出响应对象。 我目前的模型在212187级别未定义,阻止我进行提取。
我怎样才能做到这一点?任何帮助/建议/提示将不胜感激。
更新 我有一个完全匹配响应结构的接口,除了212187我有数字(假设这是错误的)。 我的请求看起来像:
fetchDescriptionWiki(qSearch: string) {
const params: URLSearchParams = new URLSearchParams();
params.set('origin', '*');
params.set('format', 'json');
params.set('action', 'query');
params.set('prop', 'extracts');
params.set('exintro', '');
params.set('explaintext', '');
params.set('indexpageids', '');
params.set('titles', qSearch);
const options = new RequestOptions({
search: params
});
return this.http.get(this.pendingCardsDescriptionWikiUrl, options)
.map(this.extractApiData);
}
extractApiData:
private extractApiData(res: Response) {
const body = res.json();
return body || [];
}
我的component.ts功能如下:
getDescription() {
this.pendingCardService.fetchDescriptionWiki('SomeStringValue')
.subscribe(data => {
this.wikiResult = data;
});
}
这是我能够深入了解响应并获得提取值的地方。
答案 0 :(得分:3)
我使用了以下内容来使用Angular HttpClient(Angular 4+)从Wikipedia API提取查询中检索数据。它利用Object.keys()然后通过数组索引(在这种情况下为索引0)定位所需的页面,因此您不需要知道页面ID。
我已经更新了使用示例中的类和方法名称的答案。我建议升级到HttpClient
,但您可以使用Angular 2 Http
获得相同的结果。
@Injectable()
export class PendingCardService {
private: string wikipediaUrl =
'https://en.wikipedia.org/w/api.php?action=query' +
'&format=json&prop=extracts&exintro=1&explaintext=1' +
'&origin=*&titles=Some_title';
fetchDescriptionWiki(): Observable<any> {
// this can use URLSearchParams as you did
return this.http.get(this.wikipediaUrl).map(this.extractApiData);
}
private extractApiData(res: Response): Foobar {
// json() is unnecessary in Angular 4+ as json() is automatically called
const body = res.json();
const pages = body.query.pages;
const pageKeys = Object.keys(pages);
// Retrieve the first page (index 0)
const page = pages[pageKeys[0]];
// ES6 object destructuring to get extract value
const { extract } = page;
// creating some object from retrieved value
const foobar: Foobar = { extract };
return foobar;
}
}
组件:
getDescription() {
this.pendingCardService.fetchDescriptionWiki()
.subscribe((foobar: Foobar) => {
this.wikiResult = foobar;
});
}
希望这有帮助!
答案 1 :(得分:0)
像这样:
interface IWikipediaData {
query: {
pages: {
[key: number]: {
extract: string
}
}
}
}
let example: IWikipediaData = {
query: {
pages: {
212187: {
extract: 'value'
}
}
}
}