iOS 自己封装的网络请求,json解析的类
时间:2022-05-16
本文章向大家介绍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
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 抖音短视频系统开发,日期加减
- Android开发之InetAddress基础入门简介与源码实例
- Android实现通讯录功能
- 教你用CentOS7下使用mktorrent制作PT种子
- 让 Python 的高阶函数支持链式调用[实用库/轮子]
- 解决了一个 Python Type Hints 的问题,分享一下
- Elasticsearch:flattened 数据类型 (7.3 发行版新功能)
- Android开发准确获取手机IP地址的两种方式
- Android网络请求-sign参数的设置方式
- Android使用自定义View实现横行时间轴效果
- Android Studio debug.keystore位置介绍
- Android 实现长按弹出PopupMenu 菜单栏
- Android开发获取手机Mac地址适配所有Android版本
- Android AIDL实现与服务相互调用方式
- Android获取超级管理员权限的实现