我必须进行多个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();
},
),
),
),
);}}
答案 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 prefs,sqflite)并根据需要使用它。