api - Flutter POST 请求问题
问题描述
我是 Flutter 的新手,我正在尝试发出 POST 请求并从名为 userRequestCode() 的 api 方法获取授权令牌。我试图将代码粘贴到/////// 中,但它不起作用。如果我将此代码粘贴到 userRequestCode() 中,如何捕获异常?请帮帮我。
Map<String, String> headers = {'Content-Type': 'application/json'};
Map<String, String> headersWithAuthorization = {'Content-Type': 'application/json', 'Authorization': 'bearer ${getMobileToken()}'};
Future<String> getMobileToken() async {
final SharedPreferences prefs = await _prefs;
return prefs.getString(_token) ?? '';
}
Future<bool> setMobileToken(String token) async {
final SharedPreferences prefs = await _prefs;
return prefs.setString(_token, token);
}
Future<http.Response> userRequestCode(String body) async {
final response = await http.post(baseUrl + " ", body: body, headers: headers);
return response;
}
Future<http.Response> userLogin(String body) async {
final response = await http.post(baseUrl + " ", body: body, headers: headersWithAuthorization);
return response;
}
class CodeResponse {
final String token;
CodeResponse({this.token});
factory CodeResponse.fromJson(Map<String, dynamic> json) {
return CodeResponse(
token: json['token'],
);
}
}
void _confirmPressed() {
var body = jsonEncode({
"appId": appId,
"phone": widget.phone.replaceAll("(", "").replaceAll(")", "").replaceAll("-", ""),
"code": "1234",
});
var data = json.encode(body);
print(data);
userConfirmCode(body).then((response) {
if (response.statusCode == 201) {
setState(() {
_isLoading = false;
});
// _codeResponse = CodeResponse.fromJson(json.decode(response.body));
// _token = _codeResponse.token;
// print(_token);
// setMobileToken(_token);
print(response.body);
print(response.statusCode);
Navigator.push(context, MaterialPageRoute(builder: (context) => Profile(oldPassword: widget.password)));
} else if (response.statusCode == 403) {
setState(() {
_isLoading = false;
});
_scaffoldKey.currentState.showSnackBar(SnackBar(
content: Text("Wrong Code"),
backgroundColor: Colors.red,
));
print(response.statusCode);
} else {
print(response.statusCode);
setState(() {
_isLoading = false;
});
}
}).catchError((error) {
print('error : $error');
});
}
解决方案
有两个问题headersWithAuthorization
:
1) 初始化一次,如果prefs中的token发生变化则不会更新;
2)${getMobileToken()}
就像getMobileToken().toString()
which 不等待实际的字符串值,而是给你Future
的字符串表示。尝试打印它以查看此表示的外观。
要解决此问题,请将headersWithAuthorization
变量替换为异步函数:
Future<Map<String, String>> getHeadersWithAuthorization() async {
final String mobileToken = await getMobileToken();
return {'Content-Type': 'application/json', 'Authorization': 'bearer $mobileToken'};
}
然后,当您需要具有授权的标头时,调用此函数并等待其值:
Future<http.Response> userLogin(String body) async {
final headersWithAuth = await getHeadersWithAuthorization();
final response = await http.post(baseUrl + " ", body: body, headers: headersWithAuth);
return response;
}
推荐阅读
- c++ - 当 std::make_unique 发生什么
() 分配给 std::unique_ptr ? - react-native - 找不到 detox 应用程序,您是否运行了“./gradlew assembleAndroidTest”?
- ios - 将应用程序上传到 testflight 应用程序后无法加载 CoreData
- c# - 获取第 3 方应用程序窗口属性 c#
- ruby-on-rails - 如何为没有 application.erb rails 的控制器使用单独的 erb 文件
- python - 将矩阵转换为元组
- javascript - 是否可以使用渐变来绘制它?
- asp.net-mvc - 如何更改 IList 中的属性值
- linux - 从 Docker 运行 Spring Boot 应用程序不起作用
- image - 应用程序显示来自我自己以外的其他 URL 的 URL 图像