移动开发在路上-- IOS移动开发 五 网络请求封装
接着上次的讲,这次我们讲 网络请求的封装 打开创建的项目,让我们一起来继续完成他,
上次我们说到GET请求地址的拼接;
我们接着上次的继续完善;
下边我们要定义的是
block
//定义block __block ASIFormDataRequest *request=[ASIFormDataRequest requestWithURL:url];
请求超出时间
//设置请求超出时间 [request setTimeOutSeconds:60];
POST请求参数的处理
//处理POST请求方式的参数 NSComparisonResult comparRet2=[httpMethod caseInsensitiveCompare:@"POST"]; if (comparRet2==NSOrderedSame) { NSArray *allkeys=[params allKeys]; for (int i=0; i<params.count; i++) { NSString *key=[allkeys objectAtIndex:i]; id value=[params objectForKey:key]; //判断是否文件上传 if ([value isKindOfClass:[NSData class]]) { [request addData:value forKey:key]; }else{ [request addPostValue:value forKey:key]; } } }
POST里边涉及到的知识点,在GET上边已经提到,在这里就不做赘述;
把这段这个代码贴出来看一下:
//定义block __block ASIFormDataRequest *request=[ASIFormDataRequest requestWithURL:url]; //设置请求超出时间 [request setTimeOutSeconds:60]; //设置请求方式 [request setRequestMethod:httpMethod]; //处理POST请求方式的参数 NSComparisonResult comparRet2=[httpMethod caseInsensitiveCompare:@"POST"]; if (comparRet2==NSOrderedSame) { NSArray *allkeys=[params allKeys]; for (int i=0; i<params.count; i++) { NSString *key=[allkeys objectAtIndex:i]; id value=[params objectForKey:key]; //判断是否文件上传 if ([value isKindOfClass:[NSData class]]) { [request addData:value forKey:key]; }else{ [request addPostValue:value forKey:key]; } } }
block执行完以后就该处理json 返回数据
接下来,就是请求完成后的操作了
我们要设置请求完成的block
block中返回的数据是json格式的首先我们要把他转化成自己熟悉的格式
就是类似于在C#里边是Dictionary键值对字典 NSMutableDictionary ;
那么我们就不得不又要扩展一下了,解析json有两种方法:原生的 或者 第三方的
NSJSONSerialization:
ios5中apple增加了解析JSON的api——NSJSONSerialization。网上已经有人做过测试,NSJSONSerialization在效率上完胜SBJSON、TouchJSON、YAJL、JSONKit、NextiveJson。既然apple为我们提供了这么良好的工具,我们没理由不用吧。
NSJSONSerialization提供了将JSON数据转换为Foundation对象(一般都是NSDictionary和NSArray)和Foundation对象转换为JSON数据(可以通过调用isValidJSONObject来判断Foundation对象是否可以转换为JSON数据)。
JSONKit:
JSONKIT是Object-C一个处理json数据的库,非常高效而且易用,对比同类型的库有非常明显的性能优势
JSONDecoder的解析方法:
[JSONDecoder decoderWithParseOptions:parseOptionFlags]) mutableObjectWithData:self error:error];
总的来说,JSONKit对
NSArray
NSString
NSData
NSDictionary
都进行了序列化和反序列化的扩展,可以把这些对象与JSON对象之间相互转换。
由于JSONKit没有使用ARC,所以使用时不要忘了在build phases -》compile sources 选择文件后面加-fno-objc-arc参数。
在这里还要注明一下:在创建的arc项目中如果用到了非arc的类库或者是插件,都要添加-fno-objc-arc参数。
//设置请求完成的block [request setCompletionBlock:^{ NSData *data = request.responseData; float version = [[[UIDevice currentDevice] systemVersion] floatValue]; id result = nil; //解析json数据集 //判断系统是否5.0或以上版本 if (version >= 5.0) { //系统版本是5.0或以上版本执行此段代码 //这种是ios5.0时,apple新加的一个功能 result = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil]; }else{ //第三方json解析方法 result=[data objectFromJSONData]; } if (block!=nil) { block(result); } }]; //开始异步请求 异步 startAsynchronous 同步 startSynchronous [request startAsynchronous];
到这里 网络请求的封装就完了
这里我这个把代码贴一下出来
ZWJDataService.h
// // ZWJDataService.h // 1.FrontTableViewDome // // Created by 张文健 on 14-3-14. // Copyright (c) 2014年 张文健. All rights reserved. // #import <Foundation/Foundation.h> #import "ASIFormDataRequest.h" //block定义 typedef void(^RequestFinishBlock)(id result); @interface ZWJDataService : NSObject //定义接口 +(ASIHTTPRequest *)requestWithURL:(NSString *)urlstring params:(NSMutableDictionary *)params httpMethod:(NSString *)httpMethod completeBlock:(RequestFinishBlock)block; @end
ZWJDataService.m
// // ZWJDataService.m // 1.FrontTableViewDome // // Created by 张文健 on 14-3-14. // Copyright (c) 2014年 张文健. All rights reserved. // #define BASE_URL @"http://**********/api/" #import "ZWJDataService.h" #import "JSONKit.h" @implementation ZWJDataService +(ASIHTTPRequest *)requestWithURL:(NSString *)urlstring params:(NSMutableDictionary *)params httpMethod:(NSString *)httpMethod completeBlock:(RequestFinishBlock)block{ //拼接URL字符串 urlstring=[BASE_URL stringByAppendingFormat:@"%@?access_token=aa",urlstring]; NSLog(@"urlStr : %@ ",urlstring); //处理GET请求的参数 NSComparisonResult comparRet1=[httpMethod caseInsensitiveCompare:@"GET"]; if(comparRet1==NSOrderedSame){ NSMutableString *paramsString=[NSMutableString string]; NSArray *allkeys=[params allKeys]; NSLog(@"parms : %@ \r\n",params); for (int i=0; i<params.count; i++) { NSString *key=[allkeys objectAtIndex:i]; id value=[params objectForKey:key]; [paramsString appendFormat:@"%@=%@",key,value]; if (i<params.count-1) { [paramsString appendFormat:@"&"]; } NSLog(@"paramsString : %@ ",paramsString); } if (paramsString.length>0) { urlstring=[urlstring stringByAppendingFormat:@"&%@",paramsString]; } } NSURL *url=[NSURL URLWithString:urlstring]; NSLog(@"URL : %@ ",url); //定义block __block ASIFormDataRequest *request=[ASIFormDataRequest requestWithURL:url]; //设置请求超出时间 [request setTimeOutSeconds:60]; //设置请求方式 [request setRequestMethod:httpMethod]; //处理POST请求方式的参数 NSComparisonResult comparRet2=[httpMethod caseInsensitiveCompare:@"POST"]; if (comparRet2==NSOrderedSame) { NSArray *allkeys=[params allKeys]; for (int i=0; i<params.count; i++) { NSString *key=[allkeys objectAtIndex:i]; id value=[params objectForKey:key]; //判断是否文件上传 if ([value isKindOfClass:[NSData class]]) { [request addData:value forKey:key]; }else{ [request addPostValue:value forKey:key]; } } } //设置请求完成的block [request setCompletionBlock:^{ NSData *data = request.responseData; float version = [[[UIDevice currentDevice] systemVersion] floatValue]; id result = nil; //解析json数据集 //判断系统是否5.0或以上版本 if (version >= 5.0) { //系统版本是5.0或以上版本执行此段代码 //这种是ios5.0时,apple新加的一个功能 result = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil]; }else{ //第三方json解析方法 result=[data objectFromJSONData]; } if (block!=nil) { block(result); } }]; //开始异步请求 异步 startAsynchronous 同步 startSynchronous [request startAsynchronous]; return request; } @end
大家就可以运用这个封装好的网络请求,来做一些小的测试,把数据nslog出来;
如果觉得有用的话,别忘了推荐一下哦,共同学习,共同进步!
专注技术