AFNetworking 框架小结 四 (AFHTTPSessi

2019-06-06  本文已影响0人  Claudlit

原创作者: 那夜的星空分外清澈
版权声明: 本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011374318/article/details/79302085

在 AFNetworking 框架中创建网络请求任务时,除了使用 AFURLSessionManager 中的方法外,还可以直接使用其子类 AFHTTPSessionManager 创建 HTTP 请求任务。

在使用该类创建网络任务时,与使用父类 AFURLSessionManager 创建任务,需要提供 NSURLRequest 请求报文参数不同的是,AFHTTPSessionManager 的属性中有请求报文构造器,可以根据传入的参数构造 NSURLRequest 对象。

AFHTTPSessionManager 的属性

@property (readonly, nonatomic, strong, nullable) NSURL *baseURL;
在构造 NSURLRequest 对象时使用的路径,设置该路径后,之后创建任务时,传入的路径参数都会拼接到该路径后。

@property (nonatomic, strong) AFHTTPRequestSerializer <AFURLRequestSerialization> * requestSerializer;
构造请求报文的构造器,默认为 AFHTTPRequestSerializer 实例对象。

@property (nonatomic, strong) AFHTTPResponseSerializer <AFURLResponseSerialization> * responseSerializer;
返回报文解析器,默认为 AFJSONResponseSerializer 实例对象。

@property (nonatomic, strong) AFSecurityPolicy *securityPolicy;
创建会话时,用来校验服务器的安全策略,如果对于非安全的连接使用了安全策略,则会抛出异常。

AFHTTPSessionManager 的方法

创建实例对象的类方法

+ (instancetype)manager {
    return [[[self class] alloc] initWithBaseURL:nil];
}

该类方法创建一个 baseURL 属性为 nil 的实例对象。

初始化方法

- (instancetype)init {
    return [self initWithBaseURL:nil];
}
- (instancetype)initWithBaseURL:(NSURL *)url {
    return [self initWithBaseURL:url sessionConfiguration:nil];
}

- (instancetype)initWithSessionConfiguration:(NSURLSessionConfiguration *)configuration {
    return [self initWithBaseURL:nil sessionConfiguration:configuration];
}

上述的这些方法始终绕不过下面这个方法,要么只提供 baseURL 参数,要么只提供创建会话时使用的配置信息。

- (instancetype)initWithBaseURL:(NSURL *)url
           sessionConfiguration:(NSURLSessionConfiguration *)configuration
{
    self = [super initWithSessionConfiguration:configuration];
    if (!self) {
        return nil;
    }
    //这里会判断参数 url 是否是以 “/” 符号结尾,如果不是,则调用方法使其符合预期
    if ([[url path] length] > 0 && ![[url absoluteString] hasSuffix:@"/"]) {
        url = [url URLByAppendingPathComponent:@""];
    }
    self.baseURL = url;
    self.requestSerializer = [AFHTTPRequestSerializer serializer];
    self.responseSerializer = [AFJSONResponseSerializer serializer];
    return self;
}

在这个方法中,还初始化了请求报文构造器和响应报文解析器。

创建任务方法

AFHTTPSessionManager 类中提供了创建任务的方法,其支持的请求方式为:GET、HEAD、POST、PUT、PATCH、DELETE,相关方法的名称都以这几个方式名称开始。

创建任务的方法都很类似,主要是下面的方法,注意这个方法不能被外部调用。

- (NSURLSessionDataTask *)dataTaskWithHTTPMethod:(NSString *)method
                                       URLString:(NSString *)URLString
                                      parameters:(id)parameters
                                  uploadProgress:(nullable void (^)(NSProgress *uploadProgress)) uploadProgress
                                downloadProgress:(nullable void (^)(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) {
            dispatch_async(self.completionQueue ?: dispatch_get_main_queue(), ^{
                failure(nil, serializationError);
            });
        }
        return nil;
    }
    __block NSURLSessionDataTask *dataTask = nil;
    dataTask = [self dataTaskWithRequest:request
                          uploadProgress:uploadProgress
                        downloadProgress:downloadProgress
                       completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) {
        if (error) {
            if (failure) {
                failure(dataTask, error);
            }
        } else {
            if (success) {
                success(dataTask, responseObject);
            }
        }
    }];
    return dataTask;
}

在这个方法中先使用传入的请求方式、地址、参数和会话管理器的 requestSerializer 属性创建一个 NSMutableURLRequest 实例对象,然后调用下面的方法创建 NSURLSessionDataTask 任务。

- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request
                               uploadProgress:(nullable void (^)(NSProgress *uploadProgress)) uploadProgressBlock
                             downloadProgress:(nullable void (^)(NSProgress *downloadProgress)) downloadProgressBlock
                            completionHandler:(nullable void (^)(NSURLResponse *response, id _Nullable responseObject,  NSError * _Nullable error))completionHandler;

其实这个方法是在父类中声明和实现的,另外,还可以使用下面的方法,构造一个含有报文体数据的报文请求。

- (NSURLSessionDataTask *)POST:(NSString *)URLString
                    parameters:(id)parameters
     constructingBodyWithBlock:(void (^)(id <AFMultipartFormData> formData))block
                      progress:(nullable void (^)(NSProgress * _Nonnull))uploadProgress
                       success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
                       failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure
{
    NSError *serializationError = nil;
    NSMutableURLRequest *request = [self.requestSerializer multipartFormRequestWithMethod:@"POST" URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters constructingBodyWithBlock:block error:&serializationError];
    if (serializationError) {
        if (failure) {
            dispatch_async(self.completionQueue ?: dispatch_get_main_queue(), ^{
                failure(nil, serializationError);
            });
        }
        return nil;
    }
    __block NSURLSessionDataTask *task = [self uploadTaskWithStreamedRequest:request progress:uploadProgress completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) {
        if (error) {
            if (failure) {
                failure(task, error);
            }
        } else {
            if (success) {
                success(task, responseObject);
            }
        }
    }];
    [task resume];
    return task;
}

该方法也是先使用 requestSerializer 属性创建 NSMutableURLRequest 实例,而后调用父类中声明的方法创建一个任务。


作者:那夜的星空分外清澈
来源:CSDN
原文:https://blog.csdn.net/u011374318/article/details/79333270
版权声明:本文为博主原创文章,转载请附上博文链接!

上一篇下一篇

猜你喜欢

热点阅读