您的位置:首页 > 理论基础 > 计算机网络

移动开发在路上-- IOS移动开发 五 网络请求封装

2014-05-20 23:15 405 查看
接着上次的讲,这次我们讲 网络请求的封装 打开创建的项目,让我们一起来继续完成他,

上次我们说到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

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: