【Warming】:AFNetworking 奇葩問題旨在針對奇葩問題提出奇葩的解法括荡,部分驗證并在實際中用到寇甸,但不保證有隱性問題芽卿。
AFNetworking能獲取錯誤碼的空間是[200,300],但是如果后臺返回一個401肋僧,并且?guī)Я隋e誤的信息呢羞秤?如果不修改AFNetworking是會返回錯誤的来候,但是無法獲取跟后臺同步的錯誤提示跷叉,這個時候就需要修改AFNetwoking的源碼了。解決的大概思路
1营搅、修改AFNetworking獲取錯誤碼的空間性芬,找到AFNetworking->Serialization->AFURLResponseSerialization.m
修改init方法里面的
self.acceptableStatusCodes = [NSIndexSet indexSetWithIndexesInRange(200,100)];
修改范圍為(200,310);
2、修改AFHTTPSessionManager里面的方法
- (NSURLSessionDataTask *)dataTaskWithHTTPMethod:(NSString *)method
URLString:(NSString *)URLString
parameters:(id)parameters
uploadProgress:(nullable void (^)(NSProgress *uploadProgress)) uploadProgress
downloadProgress:(nullable void (^)(NSProgress *downloadProgress)) downloadProgress
success:(void (^)(NSURLSessionDataTask *, id))success
failure:(void (^)(NSURLSessionDataTask *, NSError *))failure
將
-(NSURLSessionDataTask*)dataTaskWithRequest:uploadProgress:downloadProgress:completionHandler
中的
if(error){
if(failure){
failure(dataTask,error);
}
}
屏蔽了剧防,因為此時后臺返回的都是“正確”的數據植锉,我們需要對返回的所有的數據進行處理,當然也可以改錯誤返回, 如failure(void(^)(NSURLSessionDataTask*, id, NSError *))failure, 然后把response也加進去返回
3峭拘、對返回的具體錯誤碼進行解析并處理
獲取錯誤碼的方法
NSHTTPURLResponse * response = (NSHTTPURLResponse*)task.response;
NSInteger statusCode = response.statusCode;
如果屏蔽了就加到success里面去處理俊庇,如果沒有屏蔽而是改了failure回調,則加到failure里面去處理