AF的请求 是基于NSURLReuqest的。且使用的时异步队列,AFHTTPRequestOperation
在新版的AFNetWorking加入了监听当前网络的状态,可以判断当前的移动设备是出于3G/WIFI/还是2G等...,但是新版的需要导入官方库。
使用新版的AFNetWorking需添加官方库:(旧版的不需要)
Security.framework
MobileCoreService.framework
SystemConfiguration.framework
在AFNetWork中设置最大等待时间,可以通过创建请求的时候设置。
//创建请求并设置超时时间
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:[baseUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]
cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];
AFNetWork可以有多种请求方式,包含了8种HTTP请求的方式。
!!需要 最后设置开始请求的方式有: [operation start];
在旧版中:
AFHTTPRequestOperation 默认的普通请求,它返回的是NSData数据,需要json或xml解析。
AFJSONRequestOperation json请求,它返回的是json解析后的结果(数组或者字典)。
AFXMLRequestOperation ……
不需要设置开始请求,它会自动开始请求的是:
AFHTTPClient --- 它可以设置(8种Http请求方式)
-(void)startReuest { /** AF的请求 是基于NSURLReuqest的。且使用的时异步队列,AFHTTPRequestOperation */ NSURL *url=[NSURL URLWithString:@"https://api.douban.com/v2/book/search?q=harry&start=0"]; AFHTTPRequestOperation *operation=[[AFHTTPRequestOperation alloc] initWithRequest:[NSURLRequest requestWithURL:url]]; //设置完成后的block回调,这里的responseObject就是NSData,需要解析 [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { //json或xml解析 } failure:^(AFHTTPRequestOperation *operation, NSError *error) { }]; //开始请求 [operation start]; } -(void)jsonReuqest { NSURL *url=[NSURL URLWithString:@"https://api.douban.com/v2/book/search?q=harry&start=0"]; // json的AF请求 AFJSONRequestOperation *operation=[[AFJSONRequestOperation alloc] initWithRequest:[NSURLRequest requestWithURL:url]]; //这里完成请求后,得到的数据在responseObiect里,因为是json请求,所以,它自动的已经解析了,responseObiect就是解析后的字典或数组 [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { } failure: ^(AFHTTPRequestOperation *operation, NSError *error) { }]; [operation start]; } -(void)clientRequest { //baseurl 就是前半段请求地址 AFHTTPClient *client=[[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://10.0.8.8/sns/"]]; /* 使用AFHTTPClient请求的结果responseObject,是NSData,需要解析 */ //进行get请求 [client getPath:@"my/user_list.php" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { //json 或 xml 解析 } failure:^(AFHTTPRequestOperation *operation, NSError *error) { }]; //进行post请求 [client postPath:@"my/user_list.php" parameters:@{@"count":@"20"} success:^(AFHTTPRequestOperation *operation, id responseObject) { //json 或 xml 解析 } failure:^(AFHTTPRequestOperation *operation, NSError *error) { }]; }
在新版中:
新版的 AFNetWorking请求是基于一个请求队列管理器 AFHTTPRequestOperationManager来实现请求的。
使用新版的AFNetWorking需添加官方库:(旧版的不需要)
Security.framework
MobileCoreService.framework
SystemConfiguration.framework
代码:
#pragma mark - 判断当前网络状态 - (void)monitorNetworkType { //AFNetworking通过呼叫某个服务器来监测网络状态,因此建议呼叫大型门户网站 //创建一个请求队列的管理对象 AFHTTPRequestOperationManager * manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:[NSURL URLWithString:@"www.baidu.com"]]; //监控网络状态 [manager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { //异步任务,当网络状态发生改变,回调这个方法 //判断网络状态 switch (status) { case AFNetworkReachabilityStatusNotReachable: NSLog(@"网络未连接"); break; case AFNetworkReachabilityStatusReachableViaWWAN: NSLog(@"3G网络"); break; case AFNetworkReachabilityStatusReachableViaWiFi: NSLog(@"WIFI网络"); break; default: break; } }]; //启动监控 [manager.reachabilityManager startMonitoring]; } #pragma mark - 异步加载图片 //异步下载图片数据,赋给UIImageView - (void)asyncLoadImage { //创建图片视图 UIImageView * imageView = [[UIImageView alloc] initWithFrame:self.view.bounds]; [self.view addSubview:imageView]; [imageView setImageWithURL:[NSURL URLWithString:@"http://10.0.8.8/sns/my/headimage.php?uid=10"]]; } #pragma mark - GET请求 JSON数据 //如果下载的是JSON数据,可以自动解析成字典或数组 - (void)jsonGetRequest { //URLString NSString * urlString = @"http://10.0.8.8/sns/my/user_list.php"; //创建请求数据的队列管理器,单例 AFHTTPRequestOperationManager * manager = [AFHTTPRequestOperationManager manager]; //设置数据的格式 //如果JSON文件就按照下面设置,能自动进行解析 manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html", nil]; //发起请求了,设置请求成功失败的block [manager GET:urlString parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { //成功 //数据会回调在responseObject中,如果是JSON则数据已经被解析,responseObject根据数据源的不同,可能是字典或数组 NSLog(@"%@", responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { //失败 NSLog(@"%@", error); }]; } #pragma mark - GET请求 非JSON数据 - (void)dataGetRequest { NSString * urlString = @"http://10.0.8.8/sns/my/user_list.php"; AFHTTPRequestOperationManager * manager = [AFHTTPRequestOperationManager manager]; //设置请求的数据格式,设置为data,适用于任何格式,获取到数据之后是NSData格式,我们可以自己解析 manager.responseSerializer = [AFHTTPResponseSerializer serializer]; [manager GET:urlString parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { //成功 //responseObject装着数据,是NSData NSString * str = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]; NSLog(@"%@", str); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"%@", error); }]; } #pragma mark - POST请求 - (void)postRequest { NSString * url = @"http://localhost/cgi-bin/post1.cgi"; //访问cgi-bin服务器,访问POST1.cgi程序 //创建单例对象 AFHTTPRequestOperationManager * manager = [AFHTTPRequestOperationManager manager]; //获取接收的回馈数据的类型,POST请求也会收到回馈 manager.responseSerializer = [AFHTTPResponseSerializer serializer]; //post键值对 NSDictionary * dict = @{@"username":@"Tom", @"password":@"123456", @"message":@"woooooooooow"}; //发送请求 [manager POST:url parameters:dict success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"成功!%@",[[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"失败%@", error); }]; } #pragma mark - 上传文件 - (void)uploadFile { NSString * url = @"http://localhost/cgi-bin/post2.cgi"; AFHTTPRequestOperationManager * manager = [AFHTTPRequestOperationManager manager]; manager.responseSerializer = [AFHTTPResponseSerializer serializer]; //发送数据 [manager POST:url parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { //在这里将需要发送的数据,添加到formData对象 //找到图片 NSString * imagePath = [[NSBundle mainBundle] pathForResource:@"annotation" ofType:@"png"]; //将图片转成data NSData * data = [NSData dataWithContentsOfFile:imagePath]; //将data传给formData [formData appendPartWithFileData:data name:@"image" fileName:@"annotation.png" mimeType:@"image/png"]; //mimeType:@"image/png" @"text/html" @"text/json" @"text/xml" @"image/jpeg"等 } success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"成功"); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"失败"); }]; } #pragma mark - 文件下载 - (void)requestFile { NSString * urlString = @"http://10.0.8.8/download/归档Archieve.pdf"; //创建下载实用类 AFURLSessionManager * manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; //参数是用来管理进度显示等kvo数据的 //因为路径存在中文,无法转成URL,需要转码 urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSURLRequest * request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]]; //第一个参数是请求,第二个参数是进度对象指针的地址,为了返回进度 //__autoreleasing修饰传入地址的对象指针 __autoreleasing NSProgress * progress = nil; //调用函数后,会自动创建一个progress对象,然后改变progress指针的值,让它指向这个对象 //返回一个下载任务 NSURLSessionDownloadTask * task = [manager downloadTaskWithRequest:request progress:&progress destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) { //告诉下载管理器,文件存储的路径 NSString * path = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/视频.mp4"]; return [NSURL fileURLWithPath:path]; } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) { //下载完成的回调,可能正确可能错误 if (error) { NSLog(@"%@", error); } }]; //启动下载任务 [task resume]; _task = task; NSLog(@"%@", NSHomeDirectory()); //得到了progress对向 _progress = progress; //用成员变量指向,如同做了一个强引用,保证刚刚创建的progress对象不会在当前函数结束时消失 //设置观察者,观察进度 属性@"fractionCompleted"表示完成的进度 [_progress addObserver:self forKeyPath:@"fractionCompleted" options:NSKeyValueObservingOptionNew context:nil]; } //监控下载进度 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if (object == _progress && [keyPath isEqualToString:@"fractionCompleted"] == YES) { // NSLog(@"%f%%", [change[@"new"] doubleValue] * 100); NSLog(@"%.2f%%", _progress.fractionCompleted * 100); } }