Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Api 颤振后请求问题_Api_Flutter_Dart - Fatal编程技术网

Api 颤振后请求问题

Api 颤振后请求问题,api,flutter,dart,Api,Flutter,Dart,我是Flatter的新手,我正在尝试发出POST请求,并从名为userRequestCode()的api方法中获取授权令牌。我试图将代码粘贴到内部,但没有成功。如果我将此代码粘贴到userRequestCode()中,如何捕获异常?请帮帮我 Map<String, String> headers = {'Content-Type': 'application/json'}; Map<String, String> headersWithAuthorization = {'

我是Flatter的新手,我正在尝试发出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');
  });
}
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