当前位置: 首页 > 工具软件 > Slash for iOS > 使用案例 >

iOS-AFNetworking源码解析(二)

堵远航
2023-12-01

上一篇文章中我们对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;
}

 

 类似资料: