您的位置:首页 > 移动开发 > IOS开发

CodingNet - Learning - 6

2016-06-03 10:30 447 查看
上一篇讲到了注册页面的UI实现

这里通过注册的请求来剖析下CodingNet的网络请求的封装,网络层从这个类出发:CodingNetAPIClient

这里先学习下简单的一些请求:Get Post Put Delete 以后后续学习如何下载,上传图片等等操作

@interface CodingNetAPIClient : AFHTTPRequestOperationManager

是继承至于AFHTTPRequestOperationManager
关于这几个的相关使用可以参看我之前写的一些博客:
http://blog.csdn.net/u013743777/article/category/5884035
单例实现baseUrl:

+ (CodingNetAPIClient *)sharedJsonClient {
dispatch_once(&onceToken, ^{
_sharedClient = [[CodingNetAPIClient alloc] initWithBaseURL:[NSURL URLWithString:[NSObject baseURLStr]]];
});
return _sharedClient;
}

+ (id)changeJsonClient{
_sharedClient = [[CodingNetAPIClient alloc] initWithBaseURL:[NSURL URLWithString:[NSObject baseURLStr]]];
return _sharedClient;
}

在NSObject+Common
#pragma mark BaseURL
+ (NSString *)baseURLStr{
NSString *baseURLStr;
if ([self baseURLStrIsTest]) {
//staging
baseURLStr = kBaseUrlStr_Test;
}else{
//生产
baseURLStr = @"https://coding.net/";
}

return baseURLStr;
}

一些基本的设置:
- (id)initWithBaseURL:(NSURL *)url {
self = [super initWithBaseURL:url];
if (!self) {
return nil;
}
self.responseSerializer = [AFJSONResponseSerializer serializer];
self.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/plain", @"text/javascript", @"text/json", @"text/html", nil];

[self.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[self.requestSerializer setValue:url.absoluteString forHTTPHeaderField:@"Referer"];

self.securityPolicy.allowInvalidCertificates = YES;

return self;
}

我们主要看两个Get Post的实现思想:
Get:

case Get:{
//所有 Get 请求,增加缓存机制
NSMutableString *localPath = [aPath mutableCopy];
if (params) {
[localPath appendString:params.description];
}
[self GET:aPath parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
DebugLog(@"\n===========response===========\n%@:\n%@", aPath, responseObject);

id error = [self handleResponse:responseObject autoShowError:autoShowError];
// 如果错误,则寻找缓存,如果缓存有的话,就返回一个之前存的数据.
if (error) {
responseObject = [NSObject loadResponseWithPath:localPath];
block(responseObject, error);

}else{
if ([responseObject isKindOfClass:[NSDictionary class]]) {
//判断数据是否符合预期,给出提示
if ([responseObject[@"data"] isKindOfClass:[NSDictionary class]]) {
if (responseObject[@"data"][@"too_many_files"]) {
if (autoShowError) {
[NSObject showHudTipStr:@"文件太多,不能正常显示"];
}
}
}
[NSObject saveResponseData:responseObject toPath:localPath];
}
block(responseObject, nil);
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
DebugLog(@"\n===========response===========\n%@:\n%@", aPath, error);
!autoShowError || [NSObject showError:error];
id responseObject = [NSObject loadResponseWithPath:localPath];
block(responseObject, error);
}];
break;}如果请求错误或者返回,则寻找缓存,如果缓存有的话,就返回一个之前存的数据.

如果请求成功,每次请求都存(刷新)缓存的内容

Post:
case Post:{
[self POST:aPath parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
DebugLog(@"\n===========response===========\n%@:\n%@", aPath, responseObject);
id error = [self handleResponse:responseObject autoShowError:autoShowError];

// 并不是所有的Error都是索取之前的来实现,如果是post的话,就不能直接block执行结果。

if (error) {
block(nil, error);
}else{
block(responseObject, nil);
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
DebugLog(@"\n===========response===========\n%@:\n%@", aPath, error);
!autoShowError || [NSObject showError:error];
block(nil, error);
}];
break;}Post则不能像Get索取缓存内容,而是请求成功后才执行需要的操作

至于外层的工具调度类:Coding_NetAPIManager 就不详述了,只是封装一个单例调度工具了

这里我先抛开了数据结构(工程所用的Model数据)来解析,而离开数据结构和服务器的数据规范来分析都是不好,以后会单独讲述Model层的时候会讲到和服务器的交互
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  iOS CodingNet