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

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

  • 相关阅读:
    Dockerfile-ADD命令-转载
    华为云上上传镜像到在线镜像仓库
    什么是4D(DRG、DLG、DOM、DEM)数据
    视频对接资料
    OpenLayer改变切片地图的样式-滤镜效果
    Docker-挂载宿主机目录到容器
    RTSP在线视频环境搭建2-海康摄像头
    配置自己风格的Clang-Format-Xcode
    GCDAsyncUdpSocket的使用
    react-native component function
  • 原文地址:https://www.cnblogs.com/zhangwenjian/p/3737853.html
Copyright © 2020-2023  润新知