如何将第一个API调用的结果用作第二个API调用的输入?

时间:2019-06-12 14:41:03

标签: flutter dart

我必须进行多个API调用才能获取实际数据。我已经编写了以下代码来进行第一个API调用。它可以工作,但是我必须使用第一次调用的返回值(假设它返回访问令牌),并将此访问令牌用作第二个API调用的标头的一部分。我该如何实现?

class Service {
  final String url;
  Map<String, String> header = new Map();
  Map<String, String> body = new Map();

  Service(this.url, this.header, this.body);

  Future<Data> postCall() async {    
    final response = await http.post(url, headers: header, body: body);
    return Data.fromJson(json.decode(response.body));
  }
}




class MyApp extends StatelessWidget {
  Service service;
  Service serviceTwo;
  ....
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
      body: Center(
        child: FutureBuilder<Data>(
          future: service.postCall,
          builder: (context, snapshot) {
            if (snapshot.hasData) {
              return Text(snapshot.data.accessToken);
            } else if (snapshot.hasError) {
              return Text("${snapshot.error}");
           }
          // By default, show a loading spinner.
          return CircularProgressIndicator();
        },
      ),
    ),
  ),
);}}

1 个答案:

答案 0 :(得分:1)

有很多方法可以实现,最简单的方法是在方法上使用await追加将来的调用。

所以您的方法postCall()如下所示:

Future<Data> postCall() async {
  // The first call, supose you'll get the token
  final responseToken = await http.post(url, headers: header, body: body);

  // Decode it as you wish
  final token = json.decode(responseToken.body);

  // The second call to get data with the token
  final response = await http.get(
    url,
    headers: {authorization: "Bearer $token"},
  );

  // Decode your data and return
  return Data.fromJson(json.decode(response.body));
}

如果您会多次使用令牌,建议您将其存储在某个地方(shared prefssqflite)并根据需要使用它。