我想知道是否可以有一个全局 HTTP 拦截器来在 Flutter 中的所有请求的标头中附加令牌?我进行了很多搜索,但找不到任何有关在何处以及如何将其设置为全局的信息。多谢!
您可以扩展 BaseClient 并覆盖send(BaseRequest request):
class CustomClient extends BaseClient {
static Map<String, String> _getHeaders() {
return {
'Authentication': 'c7fabcDefG04075ec6ce0',
};
}
@override
Future<StreamedResponse> send(BaseRequest request) async {
request.headers.addAll(_getHeaders());
return request.send();
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,它'Authentication': 'c7fabcDefG04075ec6ce0'是硬编码的并且没有加密,您永远不应该这样做。
这个答案是Felipe Medeiros 答案的延伸,我无法编辑。它实际上并不是将令牌附加到每个请求的全局方法,但仍然应该考虑创建拦截器/中间件。
BaseClient 是本机http 包的一部分。您可以扩展 BaseClient 并覆盖send(BaseRequest request):
class BearerTokenMiddleware extends BaseClient {
final Future<String> Function() getBearerToken;
BearerTokenMiddleware({required this.getBearerToken});
@override
Future<StreamedResponse> send(BaseRequest request) async {
request.headers.addAll({
'Authorization': 'Bearer ${await getBearerToken()}',
});
return request.send();
}
}
Run Code Online (Sandbox Code Playgroud)
当您的类之一需要 http 客户端时,请将BaseClient抽象注入到构造函数中。示例:
class HTTPTodoGateway implements TodoGateway {
final BaseClient httpClient;
HTTPTodoGateway ({required this.httpClient});
getTodoById(string todoId) {
httpClient.get(Uri.parse('https://mytodos/$todoId'));
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以创建一个新实例,HTTPTodoGateway该实例BearerTokenMiddleware将使用身份验证承载标头包装您的请求。
| 归档时间: |
|
| 查看次数: |
16080 次 |
| 最近记录: |