封装AFNetworking网络工具类(Objective-C)--oschina

博客原文:http://my.oschina.net/TaciturnKnightYQ/blog/540661


AFNetworking是一款在OS X和iOS下都令人喜爱的网络库。为了迎合iOS新版本的升级, AFNetworking在3.0版本中删除了基于 NSURLConnection API的所有支持。如果你的项目以前使用过这些API,建议您立即升级到基于 NSURLSession 的API的AFNetworking的版本。




NSURLConnection的API已废弃

AFNetworking 1.0建立在NSURLConnection的基础API之上 ,AFNetworking 2.0开始使用NSURLConnection的基础API ,以及较新基于NSURLSession的API的选项。 AFNetworking 3.0现已完全基于NSURLSession的API,这降低了维护的负担,同时支持苹果增强关于NSURLSession提供的任何额外功能。由于Xcode 7中,NSURLConnection的API已经正式被苹果弃用。虽然该API将继续运行,但将没有新功能将被添加,并且苹果已经通知所有基于网络的功能,以充分使NSURLSession向前发展。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

//  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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

//  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的测试网址:

?

1

http://httpbin.org



//  NetWorkTools.m

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

//

//  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  的问题


封装AFNetworking网络工具类(Objective-C)--oschina_第1张图片


/**

 AFN 最常见的网络请求错误

 

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

 2. status code == 405,对应的 URL 不支持 HTTP 请求方法

 */





然后继续,在GET 和POST 方法中,点进去发现,除了传入的字符串不同,其他的没什么区别


封装AFNetworking网络工具类(Objective-C)--oschina_第2张图片




但是 dataTaskWithHTTPMethod 这个方法是定义在 .m文件中的一个使用方法,那我们应该怎样才能拿到它使用?在保证不修改框架本身的前提下,我们尝试另一种方法,仅在OC中有效

利用协议调用AFN底层网络方法封装框架

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

//  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中这样肯定不行。

你可能感兴趣的:(ios,AFNetworking封装)