get responseObject on failure block AFNetworking 3.0
如何从AFNetworking 3.x的故障块中获取响应字符串,
在2.x版本中,实现方法是:
1 2 3 4 5 | [manager GET:path parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { NSDictionary *dictionary_FetchResult = responseObject; } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSDictionary *dictionary_FetchResult = operation.responseObject; }]; |
但是在3.x版本中,返回块的参数中没有任何操作,如下所示:
1 2 3 4 5 6 | [manager POST:path parameters:parameters progress:^(NSProgress * _Nonnull uploadProgress) { } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSDictionary *dictionary_FetchResult = responseObject; } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"Error: %@", error); }]; |
所以我希望有人能做到这一点。
只需在您的故障块中执行此操作:-
1 2 | NSString* errResponse = [[NSString alloc] initWithData:(NSData *)error.userInfo[AFNetworkingOperationFailingURLResponseDataErrorKey] encoding:NSUTF8StringEncoding]; NSLog(@"%@",errResponse); |
对于Swift:-
1 2 | var errResponse: String = String(data: (error.userInfo[AFNetworkingOperationFailingURLResponseDataErrorKey] as! NSData), encoding: NSUTF8StringEncoding) NSLog("%@", errResponse) |
已为Swift 4.1更新
1 2 | var errResponse: String = String(data: (error._userInfo![AFNetworkingOperationFailingURLResponseDataErrorKey] as! Data), encoding: String.Encoding.utf8)! print(errResponse) |
我已经找到了一个完美的解决方案。迅速
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | if let userInfo : NSDictionary = error.userInfo as NSDictionary { if let innerError : NSError = userInfo.objectForKey("NSUnderlyingError") as? NSError { if let innerUserInfo : NSDictionary = innerError.userInfo as NSDictionary { if innerUserInfo.objectForKey(AFNetworkingOperationFailingURLResponseDataErrorKey) != nil { let StrError = NSString(data: innerUserInfo.objectForKey(AFNetworkingOperationFailingURLResponseDataErrorKey) as! NSData, encoding: NSUTF8StringEncoding) print(StrError) } } else if let errResponse: String = String(data: (error.userInfo[AFNetworkingOperationFailingURLResponseDataErrorKey] as! NSData), encoding: NSUTF8StringEncoding) { print(errResponse) } } } |
而Objective-C代码是
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | NSDictionary *userinfo1 = [[NSDictionary alloc] initWithDictionary:error.userInfo]; if(userinfo1) { NSError *innerError = [userinfo1 valueForKey:@"NSUnderlyingError"]; if(innerError) { NSDictionary *innerUserInfo = [[NSDictionary alloc] initWithDictionary:innerError.userInfo]; if(innerUserInfo) { if([innerUserInfo objectForKey:AFNetworkingOperationFailingURLResponseDataErrorKey]) { NSString *strError = [[NSString alloc] initWithData:[innerUserInfo objectForKey:AFNetworkingOperationFailingURLResponseDataErrorKey] encoding:NSUTF8StringEncoding]; NSLog(@"Error is : %@",strError); } } } else { NSString *errResponse = [[NSString alloc] initWithData:[userinfo1 valueForKey:@"AFNetworkingOperationFailingURLResponseDataErrorKey"] encoding:NSUTF8StringEncoding]; if(errResponse) { NSLog(@"%@",errResponse); } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | - (void)requestWithURL:(NSString *)url parameterDictionary:(NSMutableDictionary *)data requestType:(NSString *)reqType handler:(NSObject *)handler selector:(SEL)selector { // reqType is POST or GET // handler would be self if you define selector method in same class AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; NSMutableURLRequest *req = [[AFJSONRequestSerializer serializer] requestWithMethod:reqType URLString:[NSString stringWithFormat:@"%@",url] parameters:nil error:nil]; req.timeoutInterval= [[[NSUserDefaults standardUserDefaults] valueForKey:@"timeoutInterval"] longValue]; [req setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; [req setValue:@"application/json" forHTTPHeaderField:@"Accept"]; if (data != nil) { NSLog(@"Data is not nil"); NSData *jsonData = [NSJSONSerialization dataWithJSONObject:data options:0 error:&error]; NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; [req setHTTPBody:[jsonString dataUsingEncoding:NSUTF8StringEncoding]]; }else{ NSLog(@"Data is nil"); } [[manager dataTaskWithRequest:req completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) { if (!error) { // NSLog(@"Reply JSON: %@", responseObject); [handler performSelector:selector withObject:responseObject]; if ([responseObject isKindOfClass:[NSDictionary class]]) { //blah blah } } else { NSLog(@"Error: %@, %@, %@", error, response, responseObject); [handler performSelector:selector withObject:responseObject]; } }] resume]; } |
在此修复了一些代码,可以正确处理可选内容。斯威夫特3(.1)...
1 2 3 4 5 6 | let nserror = error as NSError if let errordata = nserror.userInfo[AFNetworkingOperationFailingURLResponseDataErrorKey] as? Data { if let errorResponse = String(data: errordata, encoding: String.Encoding.utf8) { print("errorResponse: \\(errorResponse)") } } |
1 2 | let responseData:NSData = (error as NSError).userInfo[AFNetworkingOperationFailingURLResponseDataErrorKey] as! NSData let s :String = String(data: responseData as Data, encoding: String.Encoding.utf8)! |
对于Swift 3
我在GitHub上找到了解决方案:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | @interface ResponseSerializer : AFJSONResponseSerializer @end @implementation ResponseSerializer - (id)responseObjectForResponse:(NSURLResponse *)response data:(NSData *)data error:(NSError *__autoreleasing *)errorPointer { id responseObject = [super responseObjectForResponse:response data:data error:errorPointer]; if (*errorPointer) { NSError *error = *errorPointer; NSMutableDictionary *userInfo = [error.userInfo mutableCopy]; userInfo[@"responseObject"] = responseObject; *errorPointer = [NSError errorWithDomain:error.domain code:error.code userInfo:[userInfo copy]]; } return responseObject; } @end |
然后将其分配给您的经理:
1 | self.manager.responseSerializer = [ResponseSerializer serializer]; |