移动开发在路上-- 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:

ios5apple增加了解析JSONapi——NSJSONSerialization。网上已经有人做过测试,NSJSONSerialization在效率上完胜SBJSONTouchJSONYAJLJSONKitNextiveJson。既然apple为我们提供了这么良好的工具,我们没理由不用吧。

            

NSJSONSerialization提供了将JSON数据转换为Foundation对象(一般都是NSDictionaryNSArray)和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 : %@ 
",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

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

原文地址:https://www.cnblogs.com/zhangwenjian/p/3737853.html