有时我们不需要复杂的应用程序,只需要显示一个数据列表的简单功能,我们可以通过一个简单的方法来实现:
Future fetchItems() {
return Dio().("https://some-website.com/listing");
}
复制代码
没有任何错误,也不用用log打印任何响应信息。
但是事实是,几乎没有这么简单的应用程序,有时我们需要做更多用于从服务器获取响应或调试我们的应用程序,比如:
将动态的Header发送给服务器,比如存储在SharedPreferences中的值。
检查每个响应头并保存他的值。
验证服务器返回的错误并将他们映射到我们应用程序中能够处理的错误类中。
另外,我们希望为我们的应用添加简单的缓存功能,以便在连接超时或用户无法访问网络时,可以显示该请求的缓存响应;
我们也可以添加log日志来打印我们的请求和响应信息。
Interceptors拦截器将通过为我们提供错误,请求和响应的特定回调来帮助我们处理这些问题。
在深入之前,我们先来看一下如何配置Dio。
Dio 配置
可以通过BaseOption来配置Dio,该对象允许我们设置一些参数来初始化Dio实例: connectTimeout,receiveTimeout和baseUrl,他们将用于每个Api的调用。
Dio createDio() {
return Dio(
BaseOptions(
connectTimeout: 5000,
receiveTimeout: 5000,
baseUrl: "https://some-website.com"
)
);
}
复制代码
但是在基本配置中无法添加拦截器,我们需要在创建dio实例的时候在拦截器集合中添加我们需要的拦截器:
Dio addInterceptors(Dio dio) {
return dio..interceptors.add(InterceptorsWrapper(
onRequest: (RequestOptions options) => requestInterceptor(options),
onResponse: (Response response) => responseInterceptor(response),
onError: (DioError dioError) => errorInterceptor(dioError)));
}
复制代码
我们已经设置了一个dio实例,可以用于任何一个Api调用。
添加动态Headers
假如我们需要将SharedPreferences中存储的一个值作为header传给服务器,我们不能使用BaseOption中的extra字段,该字段用于访问在创建请求时设置静态数据。
InterceptorsWrapper给我们提供了一个RequestOptions对象,有如下一些属性:
Request dynamic data
Url String path
Query Parameters Map queryParameters
有了这些信息,我们就可以实现我们自己的requestInterceptor方法了。
此方法返回一个动态类型,可以是:
RequestOptions对象,如果我们想继续请求的话
Response对象,如果应用程序想自己处理请求
DioError或dio.reject对象,将会抛出一个异常
这将使我们可以灵活的验证每个请求,添加数据以及在必要时抛出错误,我们使用起来只需要添加一些数据,然后处理返