首页 > 解决方案 > 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');
  });
}

标签: apiflutterdart

解决方案


有两个问题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;
}

推荐阅读