【发布时间】:2020-06-29 22:00:44
【问题描述】:
我想知道是否可以有一个全局 HTTP 拦截器在 Flutter 中的所有请求的标头中附加令牌?我进行了很多搜索,但找不到任何关于在何处以及如何将其设置为全局的信息。非常感谢!
【问题讨论】:
我想知道是否可以有一个全局 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();
}
}
在上面的例子中,'Authentication': 'c7fabcDefG04075ec6ce0' 是硬编码的,没有加密,你永远不应该这样做。
【讨论】:
使用dio 包你可以做到这一点:
Dio dio = Dio(BaseOptions(
connectTimeout: 30000,
baseUrl: 'your api',
responseType: ResponseType.json,
contentType: ContentType.json.toString(),
))
..interceptors.addAll(
[
InterceptorsWrapper(onRequest: (RequestOptions requestOptions) {
dio.interceptors.requestLock.lock();
String token = ShareP.sharedPreferences.getString('token');
if (token != null) {
dio.options.headers[HttpHeaders.authorizationHeader] =
'Bearer ' + token;
}
dio.interceptors.requestLock.unlock();
return requestOptions;
}),
// other interceptor
],
);
【讨论】:
Flutter 提供http_interceptor.dart 包。
样本
class LoggingInterceptor implements InterceptorContract {
@override
Future<RequestData> interceptRequest({RequestData data}) async {
print(data);
return data;
}
@override
Future<ResponseData> interceptResponse({ResponseData data}) async {
print(data);
return data;
}
}
【讨论】: