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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏码生

Reveal Swift3.0使用

1202
来自专栏技术总结

DWIntrosPage 简单定制引导页

下面摘取部分代码 DWIntrosPageContentViewController

1385
来自专栏iOS122-移动混合开发研究院

RDVTabBarController--可自由定制的iOS底部导航控件

RDVTabBarController:一个十分完善的tabBarController,可以自定义角标个数,爽的停不下来。 RDVTabBarControlle...

22310
来自专栏iOS122-移动混合开发研究院

实现iOS图片等资源文件的热更新化(四): 一个最小化的补丁更新逻辑

简介 ? 以前写过一个补丁更新的文章,此处会做一个更精简的最小化实现,以便于集成.为了使逻辑具有通用性,将剥离对AFNetworking和ReativeCoco...

2095
来自专栏岑志军的专栏

简单的计步器实现

1753
来自专栏Gaussic

从文件中截取字段并转换为MD5值 原

1571
来自专栏雨尘分享

ReactiveCocoa 入门知识——归总篇

2264
来自专栏学海无涯

iOS开发之UIView与UIViewController的生命周期总结

iOS开发中,创建View常见的两种方式一个是纯代码,一个是借助于XIB;创建ViewController常见的也有两种方式一个是纯代码,一个是借助于Story...

31610
来自专栏陈满iOS

iOS网络请求之上传图片:从示例到源码解析 -- 以上传Face++SDK回调的图片为例(HYNetworking,AFNetworking,XMNetworking)

本文一开始上传图片以调用HYNetworking的API为例,这个网络框架是以AFNetworking为基础进行的封装。HYNetworking内部实现上传图片...

2532
来自专栏LeeCen

AFNetworking的使用

AFNetworking是一个轻量级的iOS网络通信类库。它建立在NSURLConnection和NSOperation等类库的基础上,让很多网络通信功能的实现...

1211

扫码关注云+社区

领取腾讯云代金券