import 'package:dio/dio.dart';
void getHttp() async {
try {
var response = await Dio().get('http://www.google.com');
print(response);
} catch (e) {
print(e);
}
}
Overview
Dio 底层是叫做 HttpClientAdapter
的抽象类,这个类只定义了一个方法 fetch
,通过 option 去调整请求的参数,上层是 DioMinix
的 Mixin 类,实现了 Get
, Post
等方法对于fetch 的封装,并且完成了各个功能的接入,比如 FormData 类型的编码,Interperceptor 的调用等,
Interceptor
Interceptor
是 Dio 中的拦截器, Interceptor
需要定义三种方法 onRequest
, onResponse
, onError
,
定义好的 Interceptor
会进入到 Interceptors
,这个类型实现了 ListMixin
抽象类,也就是说可以像操作 List 一样操作它,那为什么不直接使用 List<Interceptor>
呢? Interceptors
除了包含 List 的功能以外,还可以通过 lock/unlock 来锁定,解锁拦截器,保证请求 / 响应的串行执行。由于 dart 没有提供 lock 函数,所以 Dio 就使用 Future 实现了 lock。
class Lock {
Future? _lock;
late Completer _completer;
bool get locked => _lock != null;
void lock() {
if (!locked) {
_completer = Completer();
_lock = _completer.future;
}
}
void unlock() {
if (locked) {
_completer.complete();
_lock = null;
}
}
void clear([String msg = 'cancelled']) {
if (locked) {
_completer.completeError(msg);
_lock = null;
}
}
Future? enqueue(EnqueueCallback callback) {
if (locked) {
// we use a future as a queue
return _lock!.then((d) => callback());
}
return null;
}
}
Cancel Token
Dio
支持 Cancel Token 的功能,Cancel Token 实际上就就是一个 Completer
,调用 cancel 的时候,会调用 Completer
的 complete 方法,
CancelToken token = CancelToken();
dio.get(url, cancelToken: token)
.catchError((DioError err){
if (CancelToken.isCancel(err)) {
print('Request canceled! '+ err.message)
}else{
// handle error.
}
});
// cancel the requests with "cancelled" message.
token.cancel("cancelled");