IOS之AFNetworking的使用
1.IOS网络请求基础知识
在谈及AFNetworking的使用前,先简单介绍IOS中网络请求的基础知识.
1.网络请求的通信过程
1> 请求
* 客户端 --> 服务器
* 请求的内容
a. 请求行(请求方法HTTP协议请求资源路径)
b. 请求头(描述客户端的信息)
c. 请求体(POST请求才需要有, 存放具体数据)
2> 响应
* 服务器 --> 客户端
* 响应的内容
a. 状态行(响应行, 状态码)
b. 响应头(服务器信息, 返回数据的类型, 返回数据的长度)
c. 实体内容(响应体, 返回给客户端的具体内容)
2.HTTP请求的方法
1> GET
* 参数都拼接在URL后面
* 参数有限制
2> POST
* 参数都在请求体
* 参数没有限制
3.GET请求和POST的区别
(1)都是HTTP请求的方式, GET一般只是为了获取数据, 而POST获取的同时上传附加数据
(2)GET所有参数都在URL网址中, POST请求参数放在请求头中
(3)应用: 只是简单地获取数据, 使用GET请求, 登录(传密码), 上传文件或图片, 使用POST请求
2.AFNetworking使用
可到Git上下载AFNetworking这个第三方库的最新版本,在工程中添加文件以及引用头文件即可使用
1、GET请求(html、json、xml)
- (void)testGetRequest{ NSString *urlString = @"http://www.baidu.com"; AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; //注意:默认解析器认为数据是JSON,能解析的类型content-Type也是JSON,responseObject是解析后的字典或数组 //解决:设置解析器为HTTP形式,下载下来就是NSData manager.responseSerializer = [AFHTTPResponseSerializer serializer]; [manager GET:urlString parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { NSString *str = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]; NSLog(@"str = %@",str); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"error = %@",error); }]; }
2、POST请求
- (void)testPostRequest{ //POST: http://quiet.local/testdir/login.php //参数1 @"user": @"quiet" //参数2 @"password" :@"123" NSString *urlPost = @"http://quiet.local/testdir/login.php"; AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; manager.responseSerializer = [AFHTTPResponseSerializer serializer]; //参数1:传入地址 参数2:URL请求的参数,格式传入字典 //返回数据也需要解析 [manager POST:urlPost parameters:@{@"user":@"quiet",@"password":@"123"} success:^(AFHTTPRequestOperation *operation, id responseObject) { NSString *returnStr = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]; NSLog(@"return str = %@",returnStr); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"error = %@",error); }]; }
3、上传文件
- (void)testUpLoadFile{ //http://quiet.local/uploadtest/upload.php NSString *upLoadStr = @"http://23.231.10.61/server/"; //参数1:imager:参数值即为图片 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; manager.responseSerializer = [AFHTTPResponseSerializer serializer]; [manager POST:upLoadStr parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { //把上传的数据附加到请求体中 NSString *strPath = [[NSBundle mainBundle] pathForResource:@"zhongzi" ofType:@"zip"]; [strPath stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSURL *url = [NSURL fileURLWithPath:strPath]; //本地路径的初始化 //参数1:作为接口的key存在 //参数2:上传后的文件名 //参数3:mimeType根据上传的文件类型而改变 [formData appendPartWithFileURL:url name:@"file" fileName:@"zhongzi3.zip" mimeType:@"application/x-gzip" error:nil]; } success:^(AFHTTPRequestOperation *operation, id responseObject) { NSString *fileStr = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]; NSLog(@"fileStr = %@",fileStr); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"error = %@",error); }]; }
4、下载文件
- (void)testDownLoadFile{ NSString *strDownLoad = @"http://imgcache.qq.com/club/item/avatar/zip/7/i87/all.zip"; //创建会话管理器对象(通过默认配置) AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; NSURLSessionDownloadTask *task = [manager downloadTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:strDownLoad]] progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) { //设置文件的保存路径 NSString *strPath2 = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]; NSString *strPath = [NSString stringWithFormat:@"%@/all.zip",strPath2]; return [NSURL fileURLWithPath:strPath]; //本地路径 } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) { NSLog(@"DownLoad Success"); }]; [task resume]; }
注意:文件的下载是通过NSURLSession的子类NSURLSessionDownLoadTask完成的,所以执行下载记得启动任务---[task resume]
5、监控网络
- (void)testMonitorNetWorkStatus{ AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:[NSURL URLWithString:@"www.baidu.com"]]; [manager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { NSLog(@"状态为 %@",AFStringFromNetworkReachabilityStatus(status)); }]; [manager.reachabilityManager startMonitoring]; }
注意:要调用startMonitoring启动监控