iOS 自己封装的网络请求,json解析的类

基本上所有的APP都会涉及网络这块,不管是用AFNetWorking还是自己写的http请求,整个网络框架的搭建很重要。

楼主封装的网络请求类,包括自己写的http请求和AFNetWorking的请求,代码简单,主要是框架搭建。简单来说,就是一个请求类,一个解析类,还有若干数据类。

以下代码以公开的天气查询api为例:

1.网络请求类

我把常用的网络请求方法都封装好了,你只需要写自己的接口,传递apiName,params等参数就可以。

#pragma mark ios请求方式
//ios自带的get请求方式
-(void)getddByUrlPath:(NSString *)path andParams:(NSString *)params andCallBack:(CallBack)callback{

    if (params) {
        [path stringByAppendingString:[NSString stringWithFormat:@"?%@",params]];
    }

    NSString*  pathStr = [path  stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSLog(@"url:%@",pathStr);
    NSURL *url = [NSURL URLWithString:pathStr];

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        dispatch_async(dispatch_get_main_queue(), ^{

            id jsonData = [NSJSONSerialization JSONObjectWithData:data options:0 error:Nil];
            NSLog(@"%@",jsonData);

            if ([jsonData  isKindOfClass:[NSArray  class]]) {
                NSDictionary*  dic = jsonData[0];

                callback(dic);

            }else{
                callback(jsonData);
            }

        });

    }];
    //开始请求
    [task resume];
}
//ios自带的post请求方式
-(void)postddByByUrlPath:(NSString *)path andParams:(NSDictionary*)params andCallBack:(CallBack)callback{

    NSURL *url = [NSURL URLWithString:path];

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setHTTPMethod:@"POST"];
    NSError*  error;

    if ([NSJSONSerialization isValidJSONObject:params]) {
        NSData *jsonData = [NSJSONSerialization dataWithJSONObject:params options:NSJSONWritingPrettyPrinted error:&error];
        [request  setHTTPBody:jsonData];

        NSURLSession *session = [NSURLSession sharedSession];
        NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
            dispatch_async(dispatch_get_main_queue(), ^{
                NSString*  str = [[NSString   alloc]initWithData:data encoding:NSUTF8StringEncoding];
                NSLog(@"..........%@",str);
                id  jsonData = [NSJSONSerialization JSONObjectWithData:data options:0 error:Nil];
                if ([jsonData  isKindOfClass:[NSArray  class]]) {
                    NSDictionary*  dic = jsonData[0];

                    callback(dic);

                }else{
                    callback(jsonData);
                }
            });

        }];
        //开始请求
        [task resume];

    }
}

#pragma mark 第三方请求方式
//第三方的get请求方式
-(void)getByApiName:(NSString *)apiName andParams:(id)params andCallBack:(CallBack)callback{
    [self.manager GET:apiName parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {

        callback(responseObject);

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {

        callback(nil);

    }];

}
//第三方的post请求方式
-(void)postByApiName:(NSString *)apiName andParams:(id)params andCallBack:(CallBack)callback{

    [self.manager POST:apiName parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {

        callback(responseObject);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {

        callback(nil);

    }];

}
//第三方的post上传图片请求方式
-(void)postImageByApiName:(NSString *)apiName andParams:(id)params  andImagesArray:(NSArray*)images andBack:(CallBack)callback{
    [self.manager POST:apiName parameters:params constructingBodyWithBlock:^(id formData) {

        for (int i = 0; i<images.count; i++) {

            NSData*  imageData = UIImageJPEGRepresentation(images[i], 0.8);
            NSString*  name =nil;
            if (images.count == 1) {
                name = @"imageFile";
            }else{
                name = [NSString   stringWithFormat:@"file%d",i+1];
            }
            [formData appendPartWithFileData:imageData name:name fileName:[NSString stringWithFormat:@"image.jpg"] mimeType:@"image/jpeg"];
        }

    } success:^(AFHTTPRequestOperation *operation, id responseObject) {

        callback(responseObject);

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        callback(nil);

    }];
}

-(void)postImageByApiName:(NSString *)apiName  andImageName:(NSString*)imageName  andParams:(id)params  andImage:(UIImage*)image andBack:(CallBack)callback{
    NSData*  imageData = UIImageJPEGRepresentation(image, 0.8);

    [self.manager POST:apiName parameters:params constructingBodyWithBlock:^(id formData) {
        [formData appendPartWithFileData:imageData name:imageName fileName:[NSString stringWithFormat:@"image.jpg"] mimeType:@"image/jpeg"];
    } success:^(AFHTTPRequestOperation *operation, id responseObject) {
        callback(responseObject);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {

        callback(nil);

    }];
}

以天气查询为例,自己写个接口,选择请求方式:

-(void)getWeatherCallBack:(CallBack)callback{

    //选择需要的请求方式,我们采用非第三方的get请求,具体情况选择不同的请求方式,都是异步请求

    [self getddByUrlPath:@"http://m.weather.com.cn/data/101190101.html" andParams:nil andCallBack:^(id obj) {

        //json解析
        weather* weatherInfo = [WTParseWeather parseWeatherByWeatherDic:obj];
        //返回解析后的数据
        callback(weatherInfo);

    }];

}

2 解析类,这个不同的数据要不同的解析类,自己写,这个是天气的例子:

+(weather *)parseWeatherByWeatherDic:(NSDictionary *)Dic{

    NSDictionary* weatherInfoDic = [Dic objectForKey:@"weatherinfo"];

    weather* weaInfo = [[weather alloc]init];

    weaInfo.city = [weatherInfoDic objectForKey:@"city"];
    weaInfo.date = [weatherInfoDic objectForKey:@"date_y"];
    weaInfo.week = [weatherInfoDic objectForKey:@"week"];
    weaInfo.wind = [weatherInfoDic objectForKey:@"wind1"];
    weaInfo.weather = [weatherInfoDic objectForKey:@"weather1"];
    weaInfo.tip = [weatherInfoDic objectForKey:@"index"];

    return weaInfo;
}

3 在请求网络的地方请求

- (void)getNetData{

    [[WTNetWorkingManager shareWTNetWorkingManager]getWeatherCallBack:^(id obj) {

        weather* weaInfo = obj;

        self.weatherInfo = weaInfo;

        [self giveValue];
    }];
}

- (void)giveValue{

    self.city.text = self.weatherInfo.city;
    self.date.text = self.weatherInfo.date;
    self.week.text = self.weatherInfo.week;
    self.wind.text = self.weatherInfo.wind;
    self.weather.text = self.weatherInfo.weather;
    self.tips.text = self.weatherInfo.tip;
    self.tips.userInteractionEnabled=NO;
}

我封装的类可以去我github拿:https://github.com/wangdachui

时间: 2024-10-12 18:50:38

iOS 自己封装的网络请求,json解析的类的相关文章

swift 网络请求&amp;json解析

做实际项目总是离不开这两步,大多数情况下都是采用第三方框架来辅助完成,swift也不例外,由于swift并不成熟,用swift语言写的第三方框架很不稳定(苹果更新太快了),所幸swift和oc可以混编,所以本次使用的框架都是oc里面常用的.网络请求使用AFNetworking,json解析使用MJExtension. 下面开始正文: 1. swift中使用oc框架 其原理很简单,需要一个.h头文件,里面导入我们需要使用的oc框架的头文件,把这个.h文件配置到项目设置中即可 1).我们采取一个不容

IOS SWIFT 网络请求JSON解析 基础一

前言:移动互联网时代,网络通信已经是手机端必不可少的功能.应用中也必不可少地使用了网络通信,增强客户端与服务器交互.使用NSURLConnection实现HTTP的通信.NSURLConnection 提供了异步请求和同步请求两种通信方式.同步请求数据会造成主线程阻塞,通常在请求大数据或网络不通畅时不建议使用. 不管同步请求还是异步请求,建立通信的步骤是一样的: 1 创建NSURL 2 创建NSURLRequest 3 创建NSURLConnection 当NSURLConnection 创建成

Android 网络请求json数据,解析json数据,生成对应的java bean类一步到位,快速开发

Android 网络请求一般都涉及到图片和JSON数据,怎样快速的请求网络JSON数据,解析JSON数据,并且一步生成自己想要的Java bean实体类?这个涉及到Android 开发效率的问题.由于接触Android 网络这方面比较多,自然就找到一些好的方法来快速开发Android 网络模块的相关内容,接下来就为大家揭晓 一步快速请求,解析JSON 数据生成对应的Java bean实体类的方法. 注:我们先把思路讲解下吧: 1.网络请求JSON数据代码可以自己写,当然我还是推荐使用网络上开源的

ios 解决数据请求json解析字典后,由于java某些类库转换json字符串后出现键值为&lt;null&gt;无法保存在userDefault的问题

解决数据请求json解析字典后,由于java某些类库转换json字符串后出现键值为<null>无法保存在userDefault. 打印下得到的字典数据: “username”=<null> 此时如果将字典保存到userDefault中会报错 所以需要遍历字典将其替换 for (NSString*s in [Dict1 allKeys]) { if ([Dict1[s] isEqual:[NSNull null]]) { [Dict1 setObject:@""

iOS开发中的网络请求

今天来说说关于iOS开发过程中的网络请求. 关于网络请求的重要性我想不用多说了吧.对于移动客户端来说,网络的重要性不言而喻.常见的网络请求有同步GET, 同步POST, 异步GET, 异步POST.今天来看一下四种网络请求的实现方式. 一.同步GET // 1.将网址初始化成一个OC字符串对象 NSString *urlStr = [NSString stringWithFormat:@"%@?query=%@&region=%@&output=json&ak=6E823

文件与网络、JSON解析

文件与网络.JSON解析   分类: OC语言基础 同步.异步.JSON解析.XML解析 NSData 字节数据存储,二进制存储,苹果中认为字符型和字节型都可以存,即计算机中所有类型的数据,主要用于网络传输数据的缓冲存储 GET请求,只支持255个字符 ,安全性较差,将请求信息附加在超链接上,较方便  POST请求,上传没有大小限制,请求信息在请求体内,在超链接上不能看到,安全性强,缺点:不方便 同步连接:UI “冻结” 异步连接:UI “不冻结” 异步连接,用代理:下载容易造成UI冻结,耗时,

iOS NSURLConnection和异步网络请求

在日常应用中,我们往往使用AFNetworking等第三方库来实现网络请求部分.这篇文章会简要地介绍一下如何使用NSURLConnection来进行异步的网络请求. 我们先看一个小demo - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. NSString *urlStr = @"http://www.baidu.c

iOS 开发 把握AFNet网络请求完成的正确时机

前言 对于iOS开发中的网络请求模块,AFNet的使用应该是最熟悉不过了,但你是否把握了网络请求正确的完成时机?本篇文章涉及线程同步.线程依赖.线程组等专用名词的含义,若对上述名词认识模糊,可先进行查阅理解后阅读本文.如果你也纠结于文中所述问题,可进行阅读希望对你有所帮助.大神无视勿喷. 在真实开发中,我们通常会遇到如下问题: 一.某界面存在多个请求,希望所有请求均结束才进行某操作. 对于这一问题的解决方案很容易想到通过线程组进行实现.代码如下: 1 2 3 4 5 6 7 8 9 10 11

block传值以及利用block封装一个网络请求类

1.block在俩个UIViewController间传值 最近刚学了几招block 的高级用法,其实就是利用block语法在俩个UIViewController之间传值,在这里分享给初学者,同时也方便我自己理解.我们知道UINavigationController类管理UIViewController的时候,利用的是"栈"的思想,在这里不做过多解释,切入正题,假设我们现在有俩个UIViewController,viewC1和viewC2,viewC1比viewC2先进入到UINavi