CodingNet - Learning - 6

上一篇讲到了注册页面的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层的时候会讲到和服务器的交互

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值