Flutter:编辑配置文件返回401“未经身份验证”,但可以在POSTMAN中运行

时间:2019-08-20 02:07:31

标签: http flutter dart

我试图根据此 tutorial使用flutter和laravel编辑用户的个人资料。我的注册和登录工作正常。但是,当我尝试编辑它时,始终会返回此错误。

这是我的一些代码;

api.dart

class CallApi {
final String _url = 'http://10.0.2.2:8000/api/';
var token ;

postData(data, apiUrl) async {
var fullUrl = _url + apiUrl + await _getToken();
print(fullUrl);
return await http.post(
    fullUrl,
    body: jsonEncode(data),
    headers: _setHeaders());
}

editData(data, apiUrl) async {

var fullUrl = _url + apiUrl + await _getToken();
return await http.post(
    fullUrl,
    body: jsonEncode(data),
    headers: _setTokenHeaders())
    .then((response) {
  print('Response status : ${response.statusCode}');
  print('Response body : ${response.body}');
});
 }

getData(apiUrl) async {
var fullUrl = _url + apiUrl + await _getToken();
return await http.get(fullUrl, headers: _setHeaders());
 }

_setHeaders() => {
    'Content-type': 'application/json',
    'Accept': 'application/json',
  };

_getToken() async {
SharedPreferences localStorage = await SharedPreferences.getInstance();
var token = localStorage.getString('token');
return '?token=$token';
 }

_setTokenHeaders() =>
  {
    'Content-type': 'application/json',
    'Accept': 'application/json',
    'Authorization': 'Bearer $_getToken()',
  };


}

句柄更新功能

void _handleUpdate() async {
setState(() {
  _isLoading = true;
});



var data = {
  'residency': locationController.text,
  'spouse': spouseController.text,
  'occupation': occupationController.text,
 };

var res = await CallApi().postData(data, 'profile');
 // i've tried both postData and editData which returns the same error
var body = json.decode(res.body); 
print(body);
/*if (body['status'] == true) {
  SharedPreferences localStorage = await SharedPreferences.getInstance();
  localStorage.setString('user_details', json.encode(body['token']));

  Navigator.of(context).pushNamed(Profile.tag);
}*/
}

Logcat

I/flutter ( 2390): {message: Unauthenticated.}

api通过postman正常工作,我检查了我在post请求中输入的url和参数,它们与postman相同,但仍然出现错误。

POSTMAN上有什么用

  • 注册
  • 登录
  • 注销
  • 更新

在Flutter应用上

  • 注册
  • 登录

1 个答案:

答案 0 :(得分:0)

您应该只返回token。无需返回字符串查询。

_getToken() async {
    ...
    return token;
};

此外,从您的_getToken()变量中删除fullUrl。您需要通过标头而不是查询参数发送令牌。

已编辑

您的postData()函数应该在标题中使用_setTokenHeaders()