首先把我封装的session请求献上
1.BaseRequest.h
//网络请求的基类
// POST 、 GET 、 DELETE、PUT、HEADER、TRACE、 OPTION
@interface BaseRequest : NSObject
//POST请求方法
+(void)postWithURL:(NSString *)url para:(NSDictionary *)para callBack: (void (^)(NSData* data, NSError* error))callBack;
// 提示名: (参数类型)参数名
+(void)getWithURL: (NSString *)url para:(NSDictionary *)para callBack: (void (^)(NSData* data, NSError* error))callBack;
//DELETE 类似于GET PUT类似于POST
@end
BaseRequest.m
+(void)postWithURL:(NSString *)url para:(NSDictionary *)para callBack:(void (^)(NSData *, NSError *))callBack {
//拼接url的IP地址,资源路径、资源参数
NSMutableString *urlStr = [[NSMutableString alloc]initWithString:url];
[urlStr appendString: [self paraToString:para]];
NSURL *URL = [NSURL URLWithString:urlStr];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL];
request.HTTPMethod = @"POST";
//当请求的资源参数数据过大,不能放在资源参数部分时,或者为了不暴露接口的API将相关的请求参数放到请求体中。
request.HTTPBody = [NSJSONSerialization dataWithJSONObject:para options:NSJSONWritingPrettyPrinted error:nil]; //返回值为NSData
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//请求响应的回调 block
if (!error) {
callBack(data,error);
// NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
}
}];
[task resume];
}
+(void)getWithURL:(NSString *)url para:(NSDictionary *)para callBack:(void (^)(NSData *, NSError *))callBack {
//拼接url的IP地址,资源路径、资源参数
NSMutableString *urlStr = [[NSMutableString alloc]initWithString:url];
[urlStr appendString: [self paraToString:para]];
NSURL *URL = [NSURL URLWithString:urlStr];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL];
request.HTTPMethod = @"GET";
//当请求的资源参数数据过大,不能放在资源参数部分时,或者为了不暴露接口的API将相关的请求参数放到请求体中。
request.HTTPBody = [NSJSONSerialization dataWithJSONObject:para options:NSJSONWritingPrettyPrinted error:nil]; //返回值为NSData
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//请求响应的回调 block
if (!error) {
callBack(data,error);
// NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
}
}];
[task resume];
}
//将para字典拼接为资源参数部分
+(NSString *)paraToString: (NSDictionary *)para {
NSMutableString *str = [NSMutableString stringWithString:@"?"];
for (NSString *key in para.allKeys) {
[str appendFormat:@"%@=%@&",key,para[key]];
}
if ([str hasSuffix:@"&"]){
//删除多余的& 连接符
[str deleteCharactersInRange:NSMakeRange(str.length - 1, 1)];
}
//如果资源中含有中文或其他等特殊字符时进行Unicode编码
NSString *paraStr = [str stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]];
return paraStr;
}
@end
str的打印结果 是这样,并经过json转化
{
“result”: {
“areaid”: “410611”,
“email”: “nytyg@qq.com”,
“id”: 35,
“loginflag”: “1”,
“mobile”: “”,
“name”: “互动体验中心”,
“phone”: “”,
“photo”: “http://biot.365960.cn/image/user/35/1483577527069.png“,
“remarks”: “”,
“roleid”: “9”,
“usertype”: “2”
},
“code”: 0,
“message”: “登录成功”,
“error”: false
}
打印的经过NSJSONSerialization 解析的 为 NSDictionary对象类型
{
code = 0;
error = 0;
message = “\U767b\U5f55\U6210\U529f”;
result = {
areaid = 410611;
email = “nytyg@qq.com”;
id = 35;
loginflag = 1;
mobile = “”;
name = “\U4e92\U52a8\U4f53\U9a8c\U4e2d\U5fc3”;
phone = “”;
photo = “http://biot.365960.cn/image/user/35/1483577527069.png“;
remarks = “”;
roleid = 9;
usertype = 2;
};
}
不同之处在于 后者的非数字型键值没有双引号,不能进行json转化
通过AFN来获取数据
在这里我们打印的 AFN返回的数据responseObject,打印结果
{
code = 0;
error = 0;
message = “\U767b\U5f55\U6210\U529f”;
result = {
areaid = 410611;
email = “nytyg@qq.com”;
id = 35;
loginflag = 1;
mobile = “”;
name = “\U4e92\U52a8\U4f53\U9a8c\U4e2d\U5fc3”;
phone = “”;
photo = “http://biot.365960.cn/image/user/35/1483577527069.png“;
remarks = “”;
roleid = 9;
usertype = 2;
};
}
那么这边同上边打印NSDictionary的结果,所以
1.AFN网络请求方法中返回的responseObject 为 已经转化成为NSDictionary 或 NSArray的对象, 省了 一步将请求下来的data转化为NSDictionary 或 NSArray!