如何将变量(&id)从一个api传递到另一个api以获取相应的数据?

时间:2018-12-27 18:26:27

标签: json api dart flutter

我想在listview中显示我正在使用此API的玩家统计信息:https://cricapi.com/api/playerStats?apikey=apikey&pid=pid

上述api的输出是:

{
  "pid": xxxx,
  "profile": "profile description",
  "imageURL": "https://www.cricapi.com/playerpic/xxxx.jpg",

pid为每个玩家从另一个api中检索:

https://cricapi.com/api/playerFinder?apikey=apikey&name=playerName

上述api的输出是:

{
  "data": [
    {
      "pid": xxxx,
      "fullName": "Firstname Lastname",

当前,我正在第一个api中传递硬编码的pid来显示玩家的状态,并且代码是:

FetchJson() async {
var response = await http.get(
    'https://cricapi.com/api/playerStats?apikey=apikey&pid=1111');

if (response.statusCode == 200) {
  String responseBody = response.body;
  var responseJson = jsonDecode(responseBody);
  pid = responseJson['pid'];
  name = responseJson['name'];
  playingRole = responseJson['playingRole'];
  battingStyle = responseJson['battingStyle'];
  country = responseJson['country'];
  imageURL = responseJson['imageURL'];
  data = responseJson;

  var stats = data['data']['batting'];
  var testStats = stats['tests'];
  var odiStats = stats['ODIs'];
  var tStats = stats['T20Is'];

  // T20 Stats

  matches_t = tStats['Mat'];
  runs_t = tStats['Runs'];
  half_t = tStats['50'];
  century_t = tStats['100'];
  highest_t = tStats['HS'];
  avg_t = tStats['Ave'];

我正在FetchJson()内部呼叫initState()

我尝试了针对类似/更早的问题How to fetch api data by passing variables (parameters)?的解决方案,但这使我走上了一条不同的道路。我无法实现该解决方案,因为我无法通过pid会收到的第一个api返回FetchJson()

我的问题是:

如何从第二个api(playerFinder)检索pid并将其提供给第一个api(playerStats),以及如何利用该pid以便不传递硬编码的pid,我可以将pid作为变量传递,并且可以在UI中显示多个玩家统计信息?

所需的代码在这里:https://pastebin.com/iU8x9U8z

我想在UI中显示球员统计信息,但目前我正在传递硬编码的playerid,该代码仅向我显示一个球员的统计信息,但是我想显示不同的球员统计信息。

**********更新*************

作为一种替代解决方案,我现在使用pids的列表,并使用map解析它们,并将它们传递给FetchJson() for循环内,如下所示:

var playerIds = [{"pid":35320},{"pid":28114},{"pid":28779},{"pid":28763},{"pid":30176},{"pid":7133},{"pid":5390}]

@override
  void initState() {
    var intIds = playerIds.map<int>((m) => m['pid'] as int).toList();
    for (int i = 0; i < intIds.length; i++) {
      FetchJson(intIds[i]);
    }
  }

FetchJson(int ids) async {
    print(ids);
    var response = await http.get(
        'https://cricapi.com/api/playerStats?apikey=apikey&pid=$ids');
....
}

我现在用这种方法面临的问题是,它从列表中取出最后一个pid并在UI中重复显示其数据。我希望看到的预期输出是:UI中所有pids的玩家数据,我不确定如何实现。

在此处完成引用的代码:https://pastebin.com/kFYBfHuf

1 个答案:

答案 0 :(得分:1)

一个答案是从两套api向下创建Maps到所需的播放器数据,然后使用类似于where子句的如下所示的switch语句来识别匹配的数据。

最大的问题是您需要在两个api中标识匹配的数据项。在我的示例中,我假设它可能是球员名称,也可能是他们的球队和球队编号,但是必须有一些东西可以验证您正在寻找同一球员的不同数据点。

switch(variable_expression) { 
   case name = full_name: { 
      // statements; 
   } 
   break; 

   case constant_expr2: { 
      //statements; 
   } 
   break; 

   default: { 
      //statements;  
   }
   break; 
}