AFNetWorking源码详解(二)
来源:互联网 发布:李淼 知乎 编辑:程序博客网 时间:2024/06/12 10:10
AFHTTPSessionManager继承于AFURLSessionManager,提供了更方便的HTTP请求方法,包括了GET、POST、PUT、PATCH、DELETE这五种方式,并且AF鼓励我们在AFHTTPSessionManager再进行一次封装来满足我们自己的业务需求
在开始的地方,AF一直提醒到一个属性baseURL,这个变量你可以在进一步封装的时候,将baseURL写成你自己的HTTP请求原始地址,比如
+(NSURL*)baseURL{
return[NSURL URLWithString:kBaseURLString];
}
在对baseURL进行拼接的时候,也需要注意一下几点,防止出现请求的URL出现问题
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/
在初始化的方法里面,我们看到这个方法
-(instancetype)initWithBaseURL:(nullableNSURL*)url;
-(instancetype)initWithBaseURL:(nullableNSURL*)url
sessionConfiguration:(nullableNSURLSessionConfiguration*)configurationNS_DESIGNATED_INITIALIZER;
NS_DESIGNATED_INITIALIZER的作用是什么呢?
指定的构造器通过发送初始化消息到父类来保证object被完全初始化,指定构造器有以下几个规则:
1.指定构造器必须调用父类的指定构造器
2.任何一个便利构造器必须调用最终指向指定构造器的其他构造器
3.具有指定构造器的类必须实现父类的所有指定构造器
-(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){
returnnil;
}
// baseURL赋值,AFHTTPRequestSerializer和AFJSONResponseSerializer序列化
returnself;
}
DEPRECATED_ATTRIBUTE这个相信大家见得比较多了,字面意思就是这个API不建议开发者再使用了,再使用时,会出现编译警告
-(nullableNSURLSessionDataTask*)GET:(NSString*)URLString
parameters:(nullableid)parameters
success:(nullablevoid(^)(NSURLSessionDataTask*task,id_NullableresponseObject))success
failure:(nullablevoid(^)(NSURLSessionDataTask * _Nullabletask,NSError*error))failureDEPRECATED_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指的就是请求的类型
-(NSURLSessionDataTask*)dataTaskWithHTTPMethod:(NSString*)method
URLString:(NSString*)URLString
parameters:(id)parameters
uploadProgress:(nullablevoid(^)(NSProgress*uploadProgress))uploadProgress
downloadProgress:(nullablevoid(^)(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
}
returnnil;
}
__blockNSURLSessionDataTask*dataTask = nil;
dataTask = [self dataTaskWithRequest:request
uploadProgress:uploadProgress
downloadProgress:downloadProgress
completionHandler:^(NSURLResponse * __unusedresponse,idresponseObject,NSError*error){
// 失败成功处理
}];
returndataTask;
}
- AFNetWorking源码详解(二)
- AFNetworking 源码解析(二)
- 转载AFNetworking源码解析(二)
- AFNetworking 3.0 源码阅读笔记(二)
- iOS AFNetWorking源码详解(一)
- AFNetWorking(3.0)源码分析(二)——AFURLSessionManager
- AFNetworking 3.0 源码解读(二)之 AFSecurityPolicy
- AFNetworking 3.0 源码解读(二)之 AFSecurityPolicy
- AFNetworking 3.0 使用详解和源码剖析
- AFNetworking源码解析(一)
- AFNetworking源码解析(一)
- AFNetworking源码分析(一)
- udhcp源码详解(二)
- udhcp源码详解(二)
- 简单封装AFNetworking(二)
- AFNetworking 详解
- AFNetWorking详解
- AFNetWorking详解
- 设置二级域名邮箱(一切为了好玩)
- Android子线程中更新UI的3种方法
- PHP MYSQL 数据库结构同步脚本
- Android面试题(二)——IPC机制
- 弄明白Android 接口回调机制
- AFNetWorking源码详解(二)
- org.apache.ibatis.builder.xml.IncompleteStatementException: Could not find result map java.util.Map
- 区间相交问题(贪心入门)
- Xcode -Target , PROJECT 区别 - Xcode
- iOS 设置UITabBar,背景颜色,默认图片,文字颜色,和选中颜色.
- poj 1321 棋盘问题
- 行业问题
- 常用的第三方视频播放工程
- 中国还在“互联网+”,美国已悄悄进入“新硬件时代”