原创作者: 那夜的星空分外清澈
版权声明: 本文为博主原创文章,未经博主允许不得转载。 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
版权声明:本文为博主原创文章,转载请附上博文链接!