AFNetWorking源码详解(二)

来源:互联网 发布:李淼 知乎 编辑:程序博客网 时间:2024/06/12 10:10

AFHTTPSessionManager继承于AFURLSessionManager,提供了更方便的HTTP请求方法,包括了GET、POST、PUT、PATCH、DELETE这五种方式,并且AF鼓励我们在AFHTTPSessionManager再进行一次封装来满足我们自己的业务需求




在开始的地方,AF一直提醒到一个属性baseURL,这个变量你可以在进一步封装的时候,将baseURL写成你自己的HTTP请求原始地址,比如


+(NSURL*)baseURL{

    return[NSURL URLWithString:kBaseURLString];

}


在对baseURL进行拼接的时候,也需要注意一下几点,防止出现请求的URL出现问题


NSURL*baseURL = [NSURL URLWithString:@"http://example.com/v1/"];

    [NSURL URLWithString:@"foo" relativeToURL:baseURL];                  // http://example.com/v1/foo

    [NSURL URLWithString:@"foo?bar=baz" relativeToURL:baseURL];          // http://example.com/v1/foo?bar=baz

    [NSURL URLWithString:@"/foo" relativeToURL:baseURL];                // http://example.com/foo

    [NSURL URLWithString:@"foo/" relativeToURL:baseURL];                // http://example.com/v1/foo

    [NSURL URLWithString:@"/foo/" relativeToURL:baseURL];                // http://example.com/foo/

    [NSURL URLWithString:@"http://example2.com/" relativeToURL:baseURL];// http://example2.com/


在初始化的方法里面,我们看到这个方法


-(instancetype)initWithBaseURL:(nullableNSURL*)url;

-(instancetype)initWithBaseURL:(nullableNSURL*)url

           sessionConfiguration:(nullableNSURLSessionConfiguration*)configurationNS_DESIGNATED_INITIALIZER;


NS_DESIGNATED_INITIALIZER的作用是什么呢?


指定的构造器通过发送初始化消息到父类来保证object被完全初始化,指定构造器有以下几个规则:


1.指定构造器必须调用父类的指定构造器


2.任何一个便利构造器必须调用最终指向指定构造器的其他构造器


3.具有指定构造器的类必须实现父类的所有指定构造器


-(instancetype)init{

    // 指向- [initWithBaseURL:]

  return[self initWithBaseURL:nil];

}

 

-(instancetype)initWithBaseURL:(NSURL*)url{

    // 指向- [initWithBaseURL:sessionConfiguration:]

    return[self initWithBaseURL:url sessionConfiguration:nil];

}

 

-(instancetype)initWithSessionConfiguration:(NSURLSessionConfiguration*)configuration{

    // 指向- [initWithBaseURL:sessionConfiguration:]

    return[self initWithBaseURL:nil sessionConfiguration:configuration];

}

 

-(instancetype)initWithBaseURL:(NSURL*)url

           sessionConfiguration:(NSURLSessionConfiguration*)configuration

{

    // 调用父类的- [initWithSessionConfiguration:]

    self = [super initWithSessionConfiguration:configuration];

    if(!self){

        returnnil;

    }

 

    // baseURL赋值,AFHTTPRequestSerializer和AFJSONResponseSerializer序列化

    

    returnself;

}


DEPRECATED_ATTRIBUTE这个相信大家见得比较多了,字面意思就是这个API不建议开发者再使用了,再使用时,会出现编译警告


-(nullableNSURLSessionDataTask*)GET:(NSString*)URLString

                   parameters:(nullableid)parameters

                      success:(nullablevoid(^)(NSURLSessionDataTask*task,id_NullableresponseObject))success

                      failure:(nullablevoid(^)(NSURLSessionDataTask * _Nullabletask,NSError*error))failureDEPRECATED_ATTRIBUTE;




下面POST、GET、PUT、PATCH、DELETE方法传参基本都是大同小异


URLString表示请求的URL,parameters表示客户端请求内容的存储器,progress表示请求的进度,constructingBodyWithBlock里面只有一个formData用来拼接到HTTP的请求体,success表示请求成功后的block回调,failure表示请求失败的block回调


那么这几个请求有什么区别呢?


1、POST请求是向服务端发送数据的,用来更新资源信息,它可以改变数据的种类等资源


2、GET请求是向服务端发起请求数据,用来获取或查询资源信息


3、PUT请求和POST请求很像,都是发送数据的,但是PUT请求不能改变数据的种类等资源,它只能修改内容


4、DELETE请求就是用来删除某个资源的


5、PATCH请求和PUT请求一样,也是用来进行数据更新的,它是HTTP verb推荐用于更新的


在实际开发过程中,我们还是使用POST和GET请求是最多的




在请求实现的部分,都是调用了-[dataTaskWithHTTPMethod:URLString:parameters:uploadProgress:downloadProgress:success:failure]方法创建NSURLSessionDataTask对象


传参的内容基本都是和上一层方法一样,method指的就是请求的类型


-(NSURLSessionDataTask*)dataTaskWithHTTPMethod:(NSString*)method

                                       URLString:(NSString*)URLString

                                      parameters:(id)parameters

                                  uploadProgress:(nullablevoid(^)(NSProgress*uploadProgress))uploadProgress

                                downloadProgress:(nullablevoid(^)(NSProgress*downloadProgress))downloadProgress

                                         success:(void(^)(NSURLSessionDataTask *,id))success

                                         failure:(void(^)(NSURLSessionDataTask *,NSError*))failure

{

 

    NSError*serializationError = nil;

    NSMutableURLRequest*request = [self.requestSerializer requestWithMethod:method URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters error:&serializationError];

    if(serializationError){

        if(failure){

#pragma clang diagnostic push

#pragma clang diagnostic ignored "-Wgnu"

            dispatch_async(self.completionQueue?: dispatch_get_main_queue(), ^{

                failure(nil,serializationError);

            });

#pragma clang diagnostic pop

        }

 

        returnnil;

    }

 

    __blockNSURLSessionDataTask*dataTask = nil;

    dataTask = [self dataTaskWithRequest:request

                          uploadProgress:uploadProgress

                        downloadProgress:downloadProgress

                       completionHandler:^(NSURLResponse * __unusedresponse,idresponseObject,NSError*error){

        // 失败成功处理

    }];

 

    returndataTask;

}

0 0
原创粉丝点击