AFHTTPSessionManager
继承于AFURLSessionManager
,提供了更方便的HTTP请求方法,包括了GET、POST、PUT、PATCH、DELETE这五种方式,并且AF鼓励我们在AFHTTPSessionManager
再进行一次封装来满足我们自己的业务需求
在开始的地方,AF一直提醒到一个属性baseURL
,这个变量你可以在进一步封装的时候,将baseURL
写成你自己的HTTP请求原始地址,比如
1 2 3
| + (NSURL *)baseURL { return [NSURL URLWithString:kBaseURLString]; }
|
在对baseURL
进行拼接的时候,也需要注意一下几点,防止出现请求的URL出现问题
1 2 3 4 5 6 7
| 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/
|
在初始化的方法里面,我们看到这个方法
1 2 3
| - (instancetype)initWithBaseURL:(nullable NSURL *)url; - (instancetype)initWithBaseURL:(nullable NSURL *)url sessionConfiguration:(nullable NSURLSessionConfiguration *)configuration NS_DESIGNATED_INITIALIZER;
|
NS_DESIGNATED_INITIALIZER
的作用是什么呢?
指定的构造器通过发送初始化消息到父类来保证object被完全初始化,指定构造器有以下几个规则:
1.指定构造器必须调用父类的指定构造器
2.任何一个便利构造器必须调用最终指向指定构造器的其他构造器
3.具有指定构造器的类必须实现父类的所有指定构造器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| - (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) { return nil; }
// baseURL赋值,AFHTTPRequestSerializer和AFJSONResponseSerializer序列化 return self; }
|
DEPRECATED_ATTRIBUTE
这个相信大家见得比较多了,字面意思就是这个API不建议开发者再使用了,再使用时,会出现编译警告
1 2 3 4
| - (nullable NSURLSessionDataTask *)GET:(NSString *)URLString parameters:(nullable id)parameters success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure DEPRECATED_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
指的就是请求的类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| - (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) { #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wgnu" dispatch_async(self.completionQueue ?: dispatch_get_main_queue(), ^{ failure(nil, serializationError); }); #pragma clang diagnostic pop }
return nil; }
__block NSURLSessionDataTask *dataTask = nil; dataTask = [self dataTaskWithRequest:request uploadProgress:uploadProgress downloadProgress:downloadProgress completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) { // 失败成功处理 }];
return dataTask; }
|