AFNetWorking的使用方法

来源:互联网 发布:洗车刷卡软件 编辑:程序博客网 时间:2024/06/03 14:51

AFN需要注意的是,默认提交请求的数据是二进制的,返回格式是JSON

请求格式

AFHTTPRequestSerializer            二进制格式AFJSONRequestSerializer            JSON格式AFPropertyListRequestSerializer    PList(是一种特殊的XML,解析起来相对容易)返回格式AFHTTPResponseSerializer           二进制格式AFJSONResponseSerializer           JSON格式AFXMLParserResponseSerializer      XML,只能返回XMLParser,还需要自己通过代理方法解析AFXMLDocumentResponseSerializer (Mac OS X)AFPropertyListResponseSerializer   PList格式AFImageResponseSerializer          Image格式AFCompoundResponseSerializer       组合格式

//网络监测
//AFN提供了四种网络状态:
/*
AFNetworkReachabilityStatusUnknown = -1, // 未知
AFNetworkReachabilityStatusNotReachable = 0, // 无连接
AFNetworkReachabilityStatusReachableViaWWAN = 1, // 3G 花钱
AFNetworkReachabilityStatusReachableViaWiFi = 2, // 局域网络,不花钱
*/

//判断网络连接状态的方法:
- (void)netWorkStatues
{
//创建AFNetworkReachabilityManager
//AFNetworkReachabilityManager *manager = [[AFNetworkReachabilityManager alloc] init];

//获得AFNetworkReachabilityManagerAFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];//开启网络监测[manager startMonitoring];//监测到网络状态更改后的block回调[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {    switch (status)    {        case -1:        {            //未知网络            NSLog(@"当前网络为 未知网络");        }            break;        case 0:        {            //无网络            NSLog(@"当前无网络连接");        }            break;        case 1:        {            //移动网络            NSLog(@"当前网络为 蜂窝移动网络");        }            break;        case 2:        {            //WiFi            NSLog(@"当前网络为 无线网络");        }            break;        default:            break;    }}];

}

//发送GET请求
//所有的网络请求都是由AFHTTPRequestOperationManager发起的

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];NSString *urlStr = @"http://localhost:8080/RoyLoginAndRegisterService/LoginAndRegisterServlet";//假如URL有中文需要编码(ios 9.0 以前可用)//NSString *encodeStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];//iOS 9.0以后可用的编码方法// NSString *encodeStr = [urlStr stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];//1,假如提交的数据格式不是二进制,需要申明请求的数据格式//申明请求的数据格式,默认二进制格式

// manager.requestSerializer = [AFHTTPRequestSerializer serializer];

//假如请求的数据格式是json//manager.requestSerializer = [AFJSONRequestSerializer serializer];//2,获取的数据格式默认支持json,所以假如获取的数据格式不是json,需要申明一下//申明获取的数据格式为二进制格式manager.responseSerializer = [AFHTTPResponseSerializer serializer];//添加一种可以接受的数据格式//manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html", nil];//设置请求头//[manager.requestSerializer setValue:@"image/jpg" forHTTPHeaderField:@"Content-Type"];/* //1,无参数的get请求//发送get请求的方法//第一个参数:请求的资源路径(URL)的字符串//第二个参数:请求的参数//第三个参数:成功后的回调//第四个参数:失败后的回调[manager GET:urlStr parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {    NSLog(@"请求成功了 %@",operation.responseString);} failure:^(AFHTTPRequestOperation *operation, NSError *error) {    NSLog(@">>>>>> %@",operation.responseString);    NSLog(@"请求失败了:%@",error.localizedDescription);}];*///2,有参数的get请求//AFN的get请求,参数是按照键值的方式存放在以一个字典,请求的parameters参数就是这个参数字典NSDictionary *parameterDic = @{@"name":@"roy",@"psw":@"123456",@"command":@"1"};[manager GET:urlStr parameters:parameterDic success:^(AFHTTPRequestOperation *operation, id responseObject) {    NSLog(@"====== %@",operation.responseString);} failure:^(AFHTTPRequestOperation *operation, NSError *error) {     NSLog(@"error ====== %@",error.localizedDescription);}];

//发送POST请求
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

//申明一下接收的数据格式为二进制数据manager.responseSerializer = [AFHTTPResponseSerializer serializer];NSString *urlStr = @"http://localhost:8080/RoyLoginAndRegisterService/LoginAndRegisterServlet";//1,普通的表单数据//post请求的参数部分也是按照键值进行上传的 NSDictionary *parameterDic = @{@"name":@"roy",@"psw":@"123456",@"command":@"1"};//发送post请求[manager POST:urlStr parameters:parameterDic success:^(AFHTTPRequestOperation *operation, id responseObject) {    NSLog(@">>>>>>> %@",operation.responseString);} failure:^(AFHTTPRequestOperation *operation, NSError *error) {    NSLog(@"err === %@",error.localizedDescription);}];// 2,multi-part 数据请求(不光是表单参数,还有额外的文件数据,比如新浪微博的发送微博和图片的接口)UIImage *image = [UIImage imageNamed:@"xxx.png"];NSData *imgData = UIImagePNGRepresentation(image);//第一个block块提供了一个AFMultipartFormData参数,就是用来提交额外文件数据(multi-part)的参数[manager POST:urlStr parameters:parameterDic constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {    //往formData参数后边追加额外的文件数据    //第一个参数:文件数据    //第二个参数:上传的文件数据,对应服务器请求参数的字段名    //第三个参数:上传的文件名。注意:文件名不可为空,并且最好文件的后缀不要省去,后缀根据上传的文件格式而定    //第四个参数:上传文件的格式,不可为空。参考请求头的Content-Type字段。比如:image/jpg    [formData appendPartWithFileData:imgData name:@"pic" fileName:@"xxx.png" mimeType:@"image/png"];    //[formData appendPartWithFormData:<#(NSData *)#> name:<#(NSString *)#>]} success:^(AFHTTPRequestOperation *operation, id responseObject) {} failure:^(AFHTTPRequestOperation *operation, NSError *error) {}];

}

//上传请求UPLOAD
//创建AFHTTPSessionManager
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

//[manager.requestSerializer setValue:@"image/png" forHTTPHeaderField:@"Content-Type"];//申明获取的数据格式manager.responseSerializer = [AFHTTPResponseSerializer serializer];NSURL *url = [NSURL URLWithString:@"http://localhost:8080/RoyUploadFileServer/RoyUploadServlet"];NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];//设置请求的方式(必填)[request setHTTPMethod:@"POST"];NSString *filePath = [[NSBundle mainBundle] pathForResource:@"123" ofType:@"mp4"];NSData *imgData = [NSData dataWithContentsOfFile:filePath];//设置执行上传任务时回调的block,在这个回调里边可以获取上传的进度信息[manager setTaskDidSendBodyDataBlock:^(NSURLSession *session, NSURLSessionTask *task, int64_t bytesSent, int64_t totalBytesSent, int64_t totalBytesExpectedToSend) {    //回到主队列,进行进度刷新    dispatch_async(dispatch_get_main_queue(), ^{        _slider.value = (float)totalBytesSent/totalBytesExpectedToSend;    });    NSLog(@"当前线程是%@",[[NSThread currentThread] isMainThread]?@"主线程":@"分线程");}];//upload请求,并且获取上传的任务//第一个参数:请求对象//第二个参数:上传的数据//第三个参数:进度信息//第四个参数:结束的回调block

NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithRequest:request fromData:imgData progress:nil completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {

   //把response转化为NSHTTPURLResponse类型   NSHTTPURLResponse *newResponse = (NSHTTPURLResponse *)response;   NSLog(@">>>>> %d  %@ %@",newResponse.statusCode,responseObject,error.localizedDescription);   NSLog(@"====== %@",[[NSString alloc] initWithData:(NSData *)responseObject encoding:NSUTF8StringEncoding]);

}];

//[manager uploadTaskWithRequest:<#(NSURLRequest *)#> fromFile:<#(NSURL *)#> progress:<#(NSProgress *__autoreleasing *)#> completionHandler:<#^(NSURLResponse *response, id responseObject, NSError *error)completionHandler#>]//开始执行任务[uploadTask resume];

//下载DOWNLOAD请求
/*
这样也可以进行下载任务
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

[manager downloadTaskWithRequest:<#(NSURLRequest *)#> progress:<#(NSProgress *__autoreleasing *)#> destination:<#^NSURL *(NSURL *targetPath, NSURLResponse *response)destination#> completionHandler:<#^(NSURLResponse *response, NSURL *filePath, NSError *error)completionHandler#>] */NSURL *url = [NSURL URLWithString:@"http://localhost:8080/RoyUploadFileServer/ybsh.mov"];NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];//创建AFHTTPRequestOperation,并且初始化请求AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];NSString *filePath = [NSString stringWithFormat:@"%@/Documents/download.mov",NSHomeDirectory()];NSLog(@"filePath === %@",filePath);// 设置文件保存路径[operation setOutputStream:[NSOutputStream outputStreamToFileAtPath:filePath append:YES]];[operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {     NSLog(@"当前线程是%@",[[NSThread currentThread] isMainThread]?@"主线程":@"分线程");    _slider.value = (float)totalBytesRead / totalBytesExpectedToRead;}];//设置操作执行结束后的回调block[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {    NSLog(@"下载成功了");} failure:^(AFHTTPRequestOperation *operation, NSError *error) {    NSLog(@"下载失败了");}];//开始执行操作[operation start];
0 0