使用未知数字

时间:2017-08-16 21:19:57

标签: javascript angular

我正在使用维基百科的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;
    });
}

这是我能够深入了解响应并获得提取值的地方。

2 个答案:

答案 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'
            }
        }
    }
}