AFNetworking中捕获failure 中error的状态码

在利用AFNetworking 发送网络请求的时候我们在请求失败时候通常打印出的error 是长串东西,很难拿出他的错误码和具体描述的错误信息,这样我们就无法在请求成功数据和失败时候统一处理业务逻辑,很常见的一个请求需求是:
账号session过期问题,如果我们拿一个过期的session去访问数据接口,往往在failure 中提示 403 错误,这样我们可能无法与sucess中统一了
这个问题的解决方案其实很简单,我们需要拦截一下[AFJSONRequestSerializer serializer] 这个方法的实现,将我们想要的数据写入 到 error 中去,

1.继承AFJSONResponseSerializer 重写父类方法 类名AFResponseSerializerWithData

static NSString * const ResponseSerializerStatusKey = @"statusCode";
static NSString * const ResponseSerializerDataKey = @"body";
- (id)responseObjectForResponse:(NSURLResponse *)response data:(NSData *)data error:(NSError *__autoreleasing  _Nullable *)error{
    id JSONObject = [super responseObjectForResponse:response data:data error:error];
    if (*error != nil) {
        NSMutableDictionary *userInfo = [(*error).userInfo mutableCopy];
        [userInfo setValue:[NSJSONSerialization JSONObjectWithData:data options:0 error:nil] forKey:ResponseSerializerDataKey];
        [userInfo setValue:[response valueForKey:ResponseSerializerStatusKey] forKey:ResponseSerializerStatusKey];
        NSError *newError = [NSError errorWithDomain:(*error).domain code:(*error).code userInfo:userInfo];
        (*error) = newError;
    }
    return JSONObject;
}

2.设置响应数据解析格式

AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager];
mgr.requestSerializer = [AFJSONRequestSerializer serializer];
mgr.responseSerializer = [AFResponseSerializerWithData serializer];

3.获取状态码以及错误数据信息数据

[self.mgr GET:url parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        
}];

在 failure 中可以通过
int statusCode = [error.userInfo[@"statusCode"] intValue]
NSDictionary *body = error.userInfo[@"body"]
获取到 statusCodebody 数据

这样我们可以很方便处理这个统一的逻辑,在AFNetworking 上封装一层,返回数据和响应错误状态码,可以方便我们进行统一的错误提示。

你可能感兴趣的:(AFNetworking中捕获failure 中error的状态码)