iOS解读AFN查看请求头,判断响应成功、失败

来源:互联网 发布:linux下配置java home 编辑:程序博客网 时间:2024/04/30 14:55

AFN不管是GET、POST、PUT、DELETE请求,最终都会调用此方法 ,建立一个任务。

AFHTTPSessionManager.m

- (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{    NSError *serializationError = nil;    NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:method URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters error:&serializationError];    if (serializationError) {        if (failure) {#pragma clang diagnostic push#pragma clang diagnostic ignored "-Wgnu"            dispatch_async(self.completionQueue ?: dispatch_get_main_queue(), ^{                failure(nil, serializationError);            });#pragma clang diagnostic pop        }        return nil;    }    __block NSURLSessionDataTask *dataTask = nil;    dataTask = [self dataTaskWithRequest:request                          uploadProgress:uploadProgress                        downloadProgress:downloadProgress                       completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) {        if (error) {            if (failure) {                failure(dataTask, error);            }        } else {            if (success) {                success(dataTask, responseObject);            }        }    }];    return dataTask;}

发送请求如下:

AFURLRequestSerialization.m

- (NSMutableURLRequest *)requestWithMethod:(NSString *)method                                 URLString:(NSString *)URLString                                parameters:(id)parameters                                     error:(NSError *__autoreleasing *)error{    NSParameterAssert(method);    NSParameterAssert(URLString);    NSURL *url = [NSURL URLWithString:URLString];    NSParameterAssert(url);    NSMutableURLRequest *mutableRequest = [[NSMutableURLRequest alloc] initWithURL:url];    mutableRequest.HTTPMethod = method;    for (NSString *keyPath in AFHTTPRequestSerializerObservedKeyPaths()) {        if ([self.mutableObservedChangedKeyPaths containsObject:keyPath]) {            [mutableRequest setValue:[self valueForKeyPath:keyPath] forKey:keyPath];        }    }    mutableRequest = [[self requestBySerializingRequest:mutableRequest withParameters:parameters error:error] mutableCopy];return mutableRequest;}

我们在控制台输出request时,只会得到一个URL,因此要想看到请求头,就具体打印po mutableRequest.allHTTPHeaderFields


AFURLResponseSerialization.m

- (instancetype)init {    self = [super init];    if (!self) {        return nil;    }    self.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", nil];    return self;}
通过初始化方法可以看出来,AFNetworking支持的ContentType有:application/json;text/json;text/javascript 。

- (BOOL)validateResponse:(NSHTTPURLResponse *)response                    data:(NSData *)data                   error:(NSError * __autoreleasing *)error{    BOOL responseIsValid = YES;    NSError *validationError = nil;    if (response && [response isKindOfClass:[NSHTTPURLResponse class]]) {        if (self.acceptableContentTypes && ![self.acceptableContentTypes containsObject:[response MIMEType]] &&            !([response MIMEType] == nil && [data length] == 0)) {            if ([data length] > 0 && [response URL]) {                NSMutableDictionary *mutableUserInfo = [@{                                                          NSLocalizedDescriptionKey: [NSString stringWithFormat:NSLocalizedStringFromTable(@"Request failed: unacceptable content-type: %@", @"AFNetworking", nil), [response MIMEType]],                                                          NSURLErrorFailingURLErrorKey:[response URL],                                                          AFNetworkingOperationFailingURLResponseErrorKey: response,                                                        } mutableCopy];                if (data) {                    mutableUserInfo[AFNetworkingOperationFailingURLResponseDataErrorKey] = data;                }                validationError = AFErrorWithUnderlyingError([NSError errorWithDomain:AFURLResponseSerializationErrorDomain code:NSURLErrorCannotDecodeContentData userInfo:mutableUserInfo], validationError);            }            responseIsValid = NO;        }        if (self.acceptableStatusCodes && ![self.acceptableStatusCodes containsIndex:(NSUInteger)response.statusCode] && [response URL]) {            NSMutableDictionary *mutableUserInfo = [@{                                               NSLocalizedDescriptionKey: [NSString stringWithFormat:NSLocalizedStringFromTable(@"Request failed: %@ (%ld)", @"AFNetworking", nil), [NSHTTPURLResponse localizedStringForStatusCode:response.statusCode], (long)response.statusCode],                                               NSURLErrorFailingURLErrorKey:[response URL],                                               AFNetworkingOperationFailingURLResponseErrorKey: response,                                       } mutableCopy];            if (data) {                mutableUserInfo[AFNetworkingOperationFailingURLResponseDataErrorKey] = data;            }            validationError = AFErrorWithUnderlyingError([NSError errorWithDomain:AFURLResponseSerializationErrorDomain code:NSURLErrorBadServerResponse userInfo:mutableUserInfo], validationError);            responseIsValid = NO;        }    }    if (error && !responseIsValid) {        *error = validationError;    }    return responseIsValid;}

通过statusCode==200来判断请求是否成功

查看响应头如下:

[manager POST:urlStr parameters:parameters progress:^(NSProgress * _Nonnull uploadProgress) {} success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {    NSHTTPURLResponse *response = (NSHTTPURLResponse *)task.response;    NSDictionary *allHeaders = response.allHeaderFields;    NSLog(@"响应--%@\n响应头--%@",response,allHeaders);        success(responseObject);} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {}];