封裝AFNetworking網絡工具類(Objective-C)

            AFNetworking是一款在OS X和iOS下都使人喜好的網絡庫。爲了迎合iOS新版本的升級, AFNetworking在3.0版本中刪除了基於 NSURLConnection API的全部支持。若是你的項目之前使用過這些API,建議您當即升級到基於 NSURLSession 的API的AFNetworking的版本。javascript

NSURLConnection的API已廢棄html

AFNetworking 1.0創建在NSURLConnection的基礎API之上 ,AFNetworking 2.0開始使用NSURLConnection的基礎API ,以及較新基於NSURLSession的API的選項。 AFNetworking 3.0現已徹底基於NSURLSession的API,這下降了維護的負擔,同時支持蘋果加強關於NSURLSession提供的任何額外功能。因爲Xcode 7中,NSURLConnection的API已經正式被蘋果棄用。雖然該API將繼續運行,但將沒有新功能將被添加,而且蘋果已經通知全部基於網絡的功能,以充分使NSURLSession向前發展。java

//  ViewController.m
//  網絡工具類
//
//  Created by mac on 15/12/7.
//  Copyright © 2015年 mac. All rights reserved.

#import "ViewController.h"
#import <AFNetworking/AFNetworking.h>
#import "NetWorkTools.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
 
    [[NetWorkTools shareTools]request:POST urlString:@"post" parameters:@{@"name":@"zhangsan",@"age":@13} finished:^(id responseObject, NSError *error) {
        
        if (error != nil) {
            NSLog(@"%@",error);
            return;
        }
        
       NSLog(@"%@",responseObject);
    }]; 
}
@end
//  NetWorkTools.h
//  網絡工具類
#import <AFNetworking/AFNetworking.h>

typedef enum : NSUInteger {
    GET,
    POST,
} TKRequestMethod;

@interface NetWorkTools : AFHTTPSessionManager

+(instancetype)shareTools;

-(void)request:(TKRequestMethod)method urlString:(NSString *)urlString parameters:(id)parameters finished:(void (^)(id responseObject,NSError *error))finished;

@end


作網絡框架開發人員測試網絡請求GET、POST的測試網址: json

http://httpbin.org



//  NetWorkTools.mapi

//
//  NetWorkTools.m
//  網絡工具類
//  Created by mac on 15/12/7.
//  Copyright © 2015年 mac. All rights reserved.
//
#import "NetWorkTools.h"

@implementation NetWorkTools

+(instancetype)shareTools{

    static NetWorkTools *tools;
    
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        
        //注意: 末尾須要包含 ‘/’
        //一個App一般訪問的服務器是固定的
        NSURL *url =[NSURL URLWithString:@"http://httpbin.org/"];
        
        tools =[[self alloc]initWithBaseURL:url];
        
        tools.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html", nil];
        
    });

    return tools;
}


-(void)request:(TKRequestMethod)method urlString:(NSString *)urlString parameters:(id)parameters finished:(void (^)(id responseObject,NSError *error))finished;{
    //
    //普通的 比較low的寫法
    
    if (method ==GET) {
        [self GET:urlString parameters:parameters success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {
            
            finished(responseObject,nil);
            
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            
            finished(nil,error);
        }];
        
    }else{
    
        [self POST:urlString parameters:parameters success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {
            
            finished(responseObject,nil);
            
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            
            finished(nil,error);
        }];
    
    
    }

}

@end


關於上面單例建立中  initWithBaseURL  的問題安全



/**服務器

 AFN 最多見的網絡請求錯誤網絡

 

 1. 不支持的內容 status code == 200,須要修改反序列化的 NSSet   app

 2. status code == 405,對應的 URL 不支持 HTTP 請求方法框架

 */




而後繼續,在GET 和POST 方法中,點進去發現,除了傳入的字符串不一樣,其餘的沒什麼區別



可是 dataTaskWithHTTPMethod 這個方法是定義在 .m文件中的一個使用方法,那咱們應該怎樣才能拿到它使用?在保證不修改框架自己的前提下,咱們嘗試另外一種方法,僅在OC中有效

利用協議調用AFN底層網絡方法封裝框架

//  NetWorkTools.m
//  網絡工具類
//
//  Created by mac on 15/12/7.
//  Copyright © 2015年 mac. All rights reserved.
//

#import "NetWorkTools.h"

@protocol NetWorkToolsProtk <NSObject>

/// 網絡請求方法
///
/// @param method      HTTP請求方法
/// @param URLString  URLString
/// @param parameters 參數字典
/// @param success    成功回調
/// @param failure    失敗回調
///
/// @return NSURLSessionDataTask
@optional   //忽略警告
- (NSURLSessionDataTask *)dataTaskWithHTTPMethod:(NSString *)method
                                       URLString:(NSString *)URLString
                                      parameters:(id)parameters
                                         success:(void (^)(NSURLSessionDataTask *, id))success
                                         failure:(void (^)(NSURLSessionDataTask *, NSError *))failure;

@end

//遵照網絡協議 --意味着智能提示有了
/// 遵照網絡協議 - 爲了可以欺騙 Xcode 給一個智能提示,以及編譯經過!!!
@interface NetWorkTools () <NetWorkToolsProtk>

@end

@implementation NetWorkTools

+(instancetype)shareTools{

    static NetWorkTools *tools;
    
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        
        //注意: 末尾須要包含 ‘/’
        //一個App一般訪問的服務器是固定的
        NSURL *url =[NSURL URLWithString:@"http://httpbin.org/"];
        
        tools =[[self alloc]initWithBaseURL:url];
        
        tools.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html", nil];
        
    });

    return tools;
}


-(void)request:(TKRequestMethod)method urlString:(NSString *)urlString parameters:(id)parameters finished:(void (^)(id responseObject,NSError *error))finished{
   
    NSString *methodName = (method ==GET)? @"GET":@"POST";
    
     // dataTaskWithHTTPMethod本類沒有實現方法,可是父類實現了
    // 在調用方法的時候,若是本類沒有提供,直接調用父類的方法,AFN 內部已經實現!
    [[self dataTaskWithHTTPMethod:methodName URLString:urlString parameters:parameters success:^(NSURLSessionDataTask *task, id responseObject) {
        finished(responseObject,nil);
    } failure:^(NSURLSessionDataTask *task, NSError *error) {
        
        finished(nil,error);
    }]resume];
    
//    if (method ==GET) {
//        [self GET:urlString parameters:parameters success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {
//            
//            finished(responseObject,nil);
//            
//        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
//            
//            finished(nil,error);
//        }];
//        
//    }else{
//    
//        [self POST:urlString parameters:parameters success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {
//            
//            finished(responseObject,nil);
//            
//        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
//            
//            finished(nil,error);
//        }];
//    

}

@end

封裝的時候利用了OC的特色,或者是說漏洞,能夠體會一下Objective-C語言的嚴謹性,也是OC不安全性的一個表現。AFN內部私有的一個方法,咱們經過協議的方式,將它的定義拿出來,這樣咱們就好像能夠隨心所欲了...可是你若是調用apple的api,它不會讓你上架... 固然,在Swift中這樣確定不行。

相關文章
相關標籤/搜索