目录结构
-
NSURLSession
这个目录是封装了http请求需要的代码,其中AFURLSessionManager类主要处理http请求,AFHTTPSessionManager类是对其进行封装留给用户调用的上层接口。比如我们平时的get,post请求就要用到该类,也是本文要分析的重点。 -
Reachability
这个目录是判断网络状态的 -
Security
https请求 -
Serialization
http请求和相应的配置 -
UIKit
分类
post请求过程
第一步:用户创建单例
+ (instancetype)shareManager{
static dispatch_once_t token;
static HttpClientManager *instance = nil;
_dispatch_once(&token, ^{
instance = [[self alloc] init];
[instance initSession];
});
return instance;
}
- (void)initSession{
_sessionManger = [AFHTTPSessionManager manager];
_sessionManger.requestSerializer = [AFJSONRequestSerializer serializer];//请求配置
AFJSONResponseSerializer *response = [AFJSONResponseSerializer serializer];//相应配置
response.removesKeysWithNullValues = YES;//当出现null值时候移除该键值对
_sessionManger.responseSerializer = response;
_sessionManger.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",@"text/json", @"text/plain", @"text/html", nil];//相应配置
_baseUrl = @"http:xxxxx/";//协议+域名+端口号(请求前缀)
}
[AFHTTPSessionManager manager]查看源代码发现接下来调用一下代码
//1.(AFHTTPSessionManager类)
+ (instancetype)manager {
return [[[self class] alloc] initWithBaseURL:nil];
}
//2.(AFHTTPSessionManager类)
- (instancetype)initWithBaseURL:(NSURL *)url {
return [self initWithBaseURL:url sessionConfiguration:nil];
}
//3.(AFHTTPSessionManager类)
- (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;
}
//4.(AFURLSessionManager类)
- (instancetype)initWithSessionConfiguration:(NSURLSessionConfiguration *)configuration {
self = [super init];
if (!self) {
return nil;
}
if (!configuration) {
configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
}
self.sessionConfiguration = configuration;
self.operationQueue = [[NSOperationQueue alloc] init];
self.operationQueue.maxConcurrentOperationCount = 1;
self.session = [NSURLSession sessionWithConfiguration:self.sessionConfiguration delegate:self delegateQueue:self.operationQueue];//注意delegate = self,也就是说网络请求的结果在AFURLSession