博客> OC-网络封装Session(对各种错误说不)
OC-网络封装Session(对各种错误说不)
2017-12-11 20:13 评论:0 阅读:375 小李aa
session HTTP网络封装

前言

算是一些经验总结吧,网络类的封装一定一定千万千万小心封装,把各种可能罗列出来,包括可能预见的错误以及经常出现的错误,而且要考虑到方便使用,本文使用的是NSUrlSession(用原生还是第三方不重要,重要的是逻辑要清晰)。

HTTP相关

Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。这些不做详解,我们平时主要用到的就是GET和POST,顾名思义,一个获取一个上传,但是并非get只能做获取,post只能上传,这些不做详解。

封装核心

request创建包括url字符串中文转换

NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:[NSURL URLWithString: [urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]]];

请求头设置,可设置多个,跟后端商量好对应即可

[request setValue:@"application/json; charset=utf-8" forHTTPHeaderField:@"Content-Type"]

请求方法设置 GET POST

request.HTTPMethod = @"GET";

超时时长设置

request.timeoutInterval = 10;

post参数字典转为json格式,并放入请求体,get不用

NSData jsonData = [NSJSONSerialization dataWithJSONObject:parameterDic options:NSJSONWritingPrettyPrinted error:nil]; NSMutableData tempJsonData = [NSMutableData dataWithData:jsonData]; request.HTTPBody = tempJsonData;

创建session对象 datatask任务并开始任务

NSURLSession urlsession = [NSURLSession sharedSession]; NSURLSessionDataTask dataTask = [urlsession dataTaskWithRequest:request completionHandler:^(NSData _Nullable data, NSURLResponse _Nullable response, NSError * _Nullable error) { //主要内容 }]; [dataTask resume];

主要内容部分

这里一共返回了三个参数

data 二进制json数据 response 网络响应的一些内容 包含url等等 如何获取url在下方 error 返回的错误

response处理

NSHTTPURLResponse httpResponse = (NSHTTPURLResponse)response; httpResponse.url获取到请求的地址

网络错误和服务器错误的判断以及区分

在这里要明白一点 网络错误是没有和服务器对接成功,返回的就是上面的error 服务器错误,就是和服务器对接成功,但是服务器回馈给你的错误,比如参数错误这些。明白这一点下面继续

数据处理

声明相关使用类 id returnError;//错误收集

1.判断error是否为空

if (error) {

//网络错误 returnError = error;

}else{

2.如果error为nil,判断返回数据是否为nil或nsnull类型 这一步可以简化 声明NSObject的延展,自己实践啦

if(data!=nil &&![data isKindOfClass:[NSNull class]] ){

//json数据转化为字典接收

NSError *jsonToStrError;

NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&jsonToStrError];

3.判断json转化是否成功,如果不成功就查看jsonToStrError

if (dic) {

4.判断是否和服务器交互成功,一般服务器会给个成功值比如叫result= 200 错误的话返回个error

NSInteger result = [dic[@"result"] integerValue];

if(result==200){

//成功返回数据

}else{

returnError = dic[@"error"];

}

}else{

returnError = @"json解析失败";

}

}else{

returnError = @"后台返回无数据";

}

}

总结

if([returnError isKindOfClass:[NSError class]]){ //网络错误

}else if([returnError isKindOfClss:[NSString class]]){ //服务器错误或解析错误

}else{ //成功回调

}

收藏
1
sina weixin mail 回到顶部