基本上所有的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