移动开发在路上-- IOS移动开发 五 网络请求封装
2014-05-20 23:15
405 查看
接着上次的讲,这次我们讲 网络请求的封装 打开创建的项目,让我们一起来继续完成他,
上次我们说到GET请求地址的拼接;
我们接着上次的继续完善;
下边我们要定义的是
block
请求超出时间
POST请求参数的处理
POST里边涉及到的知识点,在GET上边已经提到,在这里就不做赘述;
把这段这个代码贴出来看一下:
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的解析方法:
总的来说,JSONKit对
NSArray
NSString
NSData
NSDictionary
都进行了序列化和反序列化的扩展,可以把这些对象与JSON对象之间相互转换。
由于JSONKit没有使用ARC,所以使用时不要忘了在build phases -》compile sources 选择文件后面加-fno-objc-arc参数。
在这里还要注明一下:在创建的arc项目中如果用到了非arc的类库或者是插件,都要添加-fno-objc-arc参数。
到这里 网络请求的封装就完了
这里我这个把代码贴一下出来
大家就可以运用这个封装好的网络请求,来做一些小的测试,把数据nslog出来;
如果觉得有用的话,别忘了推荐一下哦,共同学习,共同进步!
专注技术
作者:zhangwenjian
上次我们说到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出来;
如果觉得有用的话,别忘了推荐一下哦,共同学习,共同进步!
专注技术
作者:zhangwenjian
出处:http://www.cnblogs.com/zhangwenjian
转移:http://www.zhangwj.com
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
相关文章推荐
- 移动开发在路上-- IOS移动开发系列 网络交互四(1)
- iOS开发—封装网络请求工具类
- IOS 开发 AFNetworking 网络工具-网络请求的三次封装 OC版
- IOS开发之—— 在AFN基础上进行的网络请求的封装
- iOS开发——post异步网络请求封装
- iOS开发——POST异步网络请求自行封装
- iOS开发——post异步网络请求封装
- iOS 开发 AFNetworking3.0源码解析(一:结构图/网络请求三次封装/上传下载/网络监测)
- iOS开发之网络请求(基于AFNetworking的再封装)
- iOS开发之网络请求(基于AFNetworking的再封装)
- IOS 开发 AFNetworking 网络工具-网络请求的三次封装 Swift版
- iOS开发总结之block回调以AFN为基础封装的网络请求操作类
- iOS开发-网络-合理封装请求接口
- iOS开发之网络请求(基于AFNetworking的再封装)
- iOS开发--Swift 基于AFNetworking 3.0的网络请求封装
- iOS开发:GET与POST接口网络请求以及对AFNetworking的二次封装
- iOS开发 封装网络请求 ——实例
- iOS开发-网络-合理封装请求接口
- IOS开发之自动布局显示网络请求内容
- ios网络学习------8 xml格式数据的请求处理 用代码块封装