上一篇文章中我们对AF进行了介绍,并且分析了AFURLSessionManager部分(https://mp.csdn.net/console/editor/html/107465152)。那今天我们就来看下AFHTTPSessionManager部分。
AFHTTPSessionManager是继承于AFURLSessionManager,提供了几个更方便的http请求的方法,GET、POST、PUT、PATCH、DELETE。在这里我们可以看到他有一个readOnly修饰的baseURL属性,我们可以在二次封装的时候设置成我们项目中要使用的地址(一般我们使用AF的时候都会进行二次封装,这样更方便来满足我们的需求)。
这里我们可以看到下面这几个初始化方法,主要是设置baseURL、requestSerializer和responseSerializer,requestSerializer和responseSerializer我们在接下来的几篇文章里会介绍。
+ (instancetype)manager {
return [[[self class] alloc] initWithBaseURL: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];
}
- (instancetype)initWithBaseURL:(NSURL *)url
sessionConfiguration:(NSURLSessionConfiguration *)configuration
{
self = [super initWithSessionConfiguration:configuration];
if (!self) {
return nil;
}
// Ensure terminal slash for baseURL path, so that NSURL +URLWithString:relativeToURL: works as expected
if ([[url path] length] > 0 && ![[url absoluteString] hasSuffix:@"/"]) {
url = [url URLByAppendingPathComponent:@""];
}
self.baseURL = url;
self.requestSerializer = [AFHTTPRequestSerializer serializer];
self.responseSerializer = [AFJSONResponseSerializer serializer];
return self;
}
然后下面我们可以看到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推荐用于更新的。
这几个方法的实现其实都是下面那个[dataTaskWithHTTPMethod:URLString:parameters:uploadProgress:downloadProgress:success:failure]。传参的内容基本都是和上一层方法一样,method
指的就是请求的类型,返回的是NSURLSessionDataTask类型的对象。
- (NSURLSessionDataTask *)dataTaskWithHTTPMethod:(NSString *)method
URLString:(NSString *)URLString
parameters:(nullable id)parameters
headers:(nullable NSDictionary <NSString *, NSString *> *)headers
uploadProgress:(nullable void (^)(NSProgress *uploadProgress)) uploadProgress
downloadProgress:(nullable void (^)(NSProgress *downloadProgress)) downloadProgress
success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure
{
NSError *serializationError = nil;
NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:method URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters error:&serializationError];
for (NSString *headerField in headers.keyEnumerator) {
[request setValue:headers[headerField] forHTTPHeaderField:headerField];
}
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;
}