持有者令牌请求 http 颤振



我需要为我的API发送我的令牌。 我将我的令牌保存在共享首选项中,我可以恢复它。 我的API需要一个,带有持有者,但该怎么办?

我用授权、Http 等进行了测试。

在 SP 中保存的方法

Future<bool> setToken(String value) async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
return prefs.setString('token', value);
}
Future<String> getToken() async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
return prefs.getString('token');
}
Future<Candidate> candidateAuth({Map map}) async {
String url = 'http://10.0.2.2:3000/v1/api/auth/candidate';
await http
.post(url,
headers: {
'Content-type': 'application/json',
'Accept': 'application/json'
},
body: jsonEncode(map))
.then((response) {
if (response.statusCode == 201) {
token = Candidate.fromJson(json.decode(response.body)).token;
Candidate().setToken(token);
return Candidate.fromJson(json.decode(response.body));
} else {
throw Exception('Failed auth');
}
});
}
}

我的接口调用 :


Future<List<Theme>> getThemes() async {
String url = 'http://10.0.2.2:3000/v1/api/theme';
String token;
Candidate().getToken().then((value) {
token = value;
});
final response = await http.get(url, headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer $token',
});
print('Token : ${token}');
print(response);
if (response.statusCode == 200) {
List themesList = jsonDecode(response.body);
List<Theme> themes = [];
for (var themeMap in themesList) {
themes.add(Theme.fromJson(themeMap));
}
return themes;
} else {
throw Exception('Failed to load themes');
}
}

我的 API 返回错误 401:未经授权

token

在调用http.get时可能未设置。将其更改为

String token = await Candidate().getToken();
final response = await http.get(url, headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer $token',
});
print('Token : ${token}');
print(response);

这样它肯定是用正确的值设置的。

你也可以使用这种方法

String token = await Candidate().getToken();
final response = http.get(url,
headers: {HttpHeaders.contentTypeHeader: "application/json", HttpHeaders.authorizationHeader: "Bearer $token"});

您只需要将授权字段添加到请求标头中:

var token = await getToken();
http.post(
"$url",
headers: {
"Content-Type": "application/json",
'Authorization': 'Bearer $token',
},
encoding: Encoding.getByName("utf-8"),
).then((response) {
if (response.statusCode == 200) {
print(json.decode(response.body));
// Do the rest of job here
}
});

这是该问题的另一种可能的解决方案。在继续之前,您必须等待getToken((函数的响应。您可以通过两种不同的方式完成它。使用"然后"或"等待"。

Future<List<Theme>> getThemes() async {
String url = 'http://10.0.2.2:3000/v1/api/theme';
String token;
Candidate().getToken().then((value) {
token = value;
final response = await http.get(url, headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer $token',
});
print('Token : ${token}');
print(response);
if (response.statusCode == 200) {
List themesList = jsonDecode(response.body);
List<Theme> themes = [];
for (var themeMap in themesList) {
themes.add(Theme.fromJson(themeMap));
}
return themes;
} else {
throw Exception('Failed to load themes');
}
});
}

更干净的代码

String? token = await Candidate().getToken();
Map<String, String> requestHeaders = {
'Content-Type': 'application/json',
'Authorization': 'Bearer $token',
};
await http.get(url, headers: requestHeaders);

然后,如果您希望响应或数据来自后端,则可以替换await http.get(url, headers: requestHeaders);通过var responce = await http.get(url, headers: requestHeaders);并使用响应。

问题是你以不同的方式分配你的令牌。

当您执行此操作时await asyncFunction();Dart将等到它完成。但是,当你这样做时asyncFunction().then((value) => print)这会告诉Dart它可以继续执行你的代码,并且当asyncFunction完成时,打印值。

这就是您的案件中发生的事情

Candidate().getToken().then((value) {
token = value;
});

这是一个例子,在Dart Pad上执行它。

未来飞镖

这是发布请求的示例。您只需要添加标题"授权":"不记名$token">

final response = await http.post(
url,
headers: {'Authorization': 'Bearer $token'},
);

我有类似的问题,不知道它是否适合所有人,将 url 更改为 https://解决了它。

我花了一天的时间,只是告诉你的后端开发人员这样做。

当 Dio/Http 发送标头时,它将降低所有标头键的大小写。

因此,如果您有权访问服务器,则必须将密钥小写。

例如。[菲律宾语]$token = array_change_key_case($this->input->request_headers((, CASE_LOWER(['authorization'];

@Flutter代码

final response = await http.get(url, headers: { "内容类型": "应用程序/json", "接受": "应用程序/json", "授权":"不记名$token", });

final response = await http.get(url);
if (response.statusCode == 200) {
final body = jsonDecode(response.body);
//print(body);
final Iterable json = body;
return json.map((country) {
return Country.fromJson(
country); // if you use "{}", you must use return
}).toList();

相关内容

  • 没有找到相关文章

最新更新