Api 颤振后请求问题
我是Flatter的新手,我正在尝试发出POST请求,并从名为userRequestCode()的api方法中获取授权令牌。我试图将代码粘贴到内部,但没有成功。如果我将此代码粘贴到userRequestCode()中,如何捕获异常?请帮帮我Api 颤振后请求问题,api,flutter,dart,Api,Flutter,Dart,我是Flatter的新手,我正在尝试发出POST请求,并从名为userRequestCode()的api方法中获取授权令牌。我试图将代码粘贴到内部,但没有成功。如果我将此代码粘贴到userRequestCode()中,如何捕获异常?请帮帮我 Map<String, String> headers = {'Content-Type': 'application/json'}; Map<String, String> headersWithAuthorization = {'
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');
});
}
Map headers={'Content-Type':'application/json'};
Map headersWithAuthorization={'Content-Type':'application/json','Authorization':'bearer${getMobileToken()}};
未来的getMobileToken()异步{
最终共享优先权=等待优先权;
返回prefs.getString(_标记)??“”;
}
Future setMobileToken(字符串令牌)异步{
最终共享优先权=等待优先权;
返回prefs.setString(_token,token);
}
未来的userRequestCode(字符串体)异步{
最终响应=等待http.post(baseUrl+“”,body:body,headers:headers);
返回响应;
}
未来用户登录(字符串体)异步{
最终响应=等待http.post(baseUrl+“”,body:body,headers:headersWithAuthorization);
返回响应;
}
类代码响应{
最终字符串标记;
CodeResponse({this.token});
factory CodeResponse.fromJson(映射json){
返回码响应(
token:json['token'],
);
}
}
void _confirmPressed(){
var body=jsonEncode({
“appId”:appId,
“phone”:widget.phone.replaceAll((“,”).replaceAll(“),”).replaceAll(“-”,”),
“代码”:“1234”,
});
var data=json.encode(body);
打印(数据);
userConfirmCode(主体)。然后((响应){
如果(response.statusCode==201){
设置状态(){
_isLoading=false;
});
//_codeResponse=codeResponse.fromJson(json.decode(response.body));
//_token=_coderessponse.token;
//打印(_令牌);
//setMobileToken(_令牌);
打印(响应.正文);
打印(响应状态码);
push(context,materialpage(builder:(context)=>Profile(oldPassword:widget.password));
}else if(response.statusCode==403){
设置状态(){
_isLoading=false;
});
_scaffoldKey.currentState.showSnackBar(SnackBar(
内容:文本(“错误代码”),
背景颜色:Colors.red,
));
打印(响应状态码);
}否则{
打印(响应状态码);
设置状态(){
_isLoading=false;
});
}
}).catchError((错误){
打印('error:$error');
});
}
拥有授权的负责人有两个问题
:
1) 初始化一次,如果prefs中的令牌发生变化,则不会更新
2) ${getMobileToken()}
的工作原理类似于getMobileToken().toString()
,它不等待实际的字符串值,而是提供未来的
字符串表示形式。尝试打印它以查看此表示形式的外观
要解决此问题,请将headersWithAuthorization
变量替换为异步函数:
Future getHeadersWithAuthorization()异步{
最后一个字符串mobileToken=wait getMobileToken();
返回{'Content-Type':'application/json','Authorization':'bearer$mobileToken'};
}
然后,当您需要具有授权的标题时,调用此函数并等待其值:
Future userLogin(字符串体)异步{
final Headers WithAuth=等待GetHeaders WithAuthorization();
最终响应=等待http.post(baseUrl+“”,body:body,headers:headersWithAuth);
返回响应;
}
谢谢你的回答,你能帮我拿到这个代币吗?我做错了什么?我不知道当你查询令牌时服务器返回了什么。尝试打印response.body