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) {}];
阅读全文
1 0
- iOS解读AFN查看请求头,判断响应成功、失败
- AFN 添加请求头
- iOS - 简述二次封装AFN,设置请求头,https安全策略
- wget/curl查看请求响应头信息
- PHP file_get_contents 判断是否获取成功,查看请求返回头信息
- Linux —— curl 查看请求头和响应头
- 查看ios网络http请求响应
- iOS 判断网络请求是否成功
- Http请求头解读
- ios AFN 网络请求失败 failed: unacceptable content-type: text/html application/x-javascript
- http请求头响应头
- 请求头和响应头
- 请求头、响应头小记
- Http请求头、响应头
- 响应头与请求头
- Http请求/响应头
- iOS开发之HTTP的请求头和响应头 以及常见的响应状态码
- 使用AFN ,通过post请求上传图片,带请求头
- HDU 1878-欧拉回路
- [总结]操作系统真是博大精深(五)
- Java中的abstract方法和abstract类的问题
- Codeforces Round #411 D. Minimum number of steps【逆向思维+模拟】
- 文章学习《深度学习动手入门:GitHub上四个超棒的TensorFlow开源项目》未完
- iOS解读AFN查看请求头,判断响应成功、失败
- Prime算法
- 运行项目总是报错
- RecyclerView.Adapter封装,包括点击监听,长按监听,继承时不需要重新设置
- 进程控制-------僵尸进程、守护进程
- substring(参数)
- java中hashmap原理
- tomcat在linux中修改日志路径
- 设计模式之简单工厂