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 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:(voidvoid *)context
- {
- if (object == _progress && [keyPath isEqualToString:@"fractionCompleted"] == YES) {
- // NSLog(@"%f%%", [change[@"new"] doubleValue] * 100);
- NSLog(@"%.2f%%", _progress.fractionCompleted * 100);
- }
- }