Flutter 全局 Http 拦截器

Rya*_*ing 9 dart flutter

我想知道是否可以有一个全局 HTTP 拦截器来在 Flutter 中的所有请求的标头中附加令牌?我进行了很多搜索,但找不到任何有关在何处以及如何将其设置为全局的信息。多谢!

Fel*_* B. 7

您可以扩展 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'是硬编码的并且没有加密,您永远不应该这样做。


Ado*_*Ren 0

这个答案是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将使用身份验证承载标头包装您的请求。