我正在使用 Dio 向 REST-api 发出请求。当授权令牌过期时,我刷新令牌并重新发送请求。执行此操作的代码如下所示:
onError: (DioError error, ErrorInterceptorHandler handler) async {
logger.d(errorLogString(error));
if (error.response?.statusCode == 401 && error.requestOptions.path != 'login' && _retries-- > 0) {
await authService.refreshToken();
error.response = await dio.request(
error.requestOptions.path,
data: error.requestOptions.data,
queryParameters: error.requestOptions.queryParameters,
options: Options(
method: error.requestOptions.method,
headers: error.requestOptions.headers,
),
);
}
return handler.next(error);
},
Run Code Online (Sandbox Code Playgroud)
这工作正常,但即使新请求成功,Dio 仍然会抛出错误,这意味着我必须捕获并检查每个请求的状态代码。例如这样:
try {
final response = await dio.post(
'someUrl',
);
return Object.fromJson(response.data);
} catch (error) {
if(error is DioError && (error.response?.statusCode ?? 300) < 300){
return Object.fromJson(error.response!.data);
}
throw parseError(error);
}
Run Code Online (Sandbox Code Playgroud)
有什么方法可以防止 Dio 在请求成功时完全抛出错误,或者我必须像上面那样每次都捕获错误。那么,有没有办法简化捕获错误并返回成功响应的过程呢?
我知道这是一个老问题,但如果其他人像我今天一样寻找这个问题的答案,您可以使用 handler.resolve(response)
使用上面的例子:
onError: (DioError error, ErrorInterceptorHandler handler) async {
logger.d(errorLogString(error));
if (error.response?.statusCode == 401 && error.requestOptions.path != 'login' && _retries-- > 0) {
await authService.refreshToken();
var response = await dio.request(
error.requestOptions.path,
data: error.requestOptions.data,
queryParameters: error.requestOptions.queryParameters,
options: Options(
method: error.requestOptions.method,
headers: error.requestOptions.headers,
),
);
return handler.resolve(response);
}
return handler.next(error);
},
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2491 次 |
| 最近记录: |