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层的时候会讲到和服务器的交互
这里通过注册的请求来剖析下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层的时候会讲到和服务器的交互
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 讲解iOS开发中基本的定位功能实现
- iOS中定位当前位置坐标及转换为火星坐标的方法
- js判断客户端是iOS还是Android等移动终端的方法
- iOS应用开发中AFNetworking库的常用HTTP操作方法小结
- iOS应用中UISearchDisplayController搜索效果的用法
- IOS开发环境windows化攻略
- iOS应用中UITableView左滑自定义选项及批量删除的实现
- iOS中UIAlertView警告框组件的使用教程
- 浅析iOS应用开发中线程间的通信与线程安全问题
- 检测iOS设备是否越狱的方法
- .net平台推送ios消息的实现方法
- 探讨Android与iOS,我们将何去何从?
- Android、iOS和Windows Phone中的推送技术详解