搬搬砖头而已!
iOS 基于AF的HTTP请求类
OKHTTPRequestManager.h
//
// OKHTTPRequestManager.h
// LL
//
// Created by Morris_ on 2020/9/22.
// Copyright © 2020 LL Technologies. All rights reserved.
//
#import <Foundation/Foundation.h>
#ifndef okDispatch_queue_async_safe
#define okDispatch_queue_async_safe(queue, block)\
if (dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL) == dispatch_queue_get_label(queue)) {\
block();\
} else {\
dispatch_async(queue, block);\
}
#endif
#ifndef okDispatch_main_async_safe
#define okDispatch_main_async_safe(block) okDispatch_queue_async_safe(dispatch_get_main_queue(), block)
#endif
NS_ASSUME_NONNULL_BEGIN
/// Ues this class to send the http request and manager the request task.
@interface OKHTTPRequestManager : NSObject
// Init
- (instancetype)init NS_UNAVAILABLE;
+ (instancetype)manager;
// GET.
- (void)GETWithRequestTag:(NSInteger)requestTag
URLString:(NSString *)URLString
parameters:(nullable id)parameters
progress:(nullable void (^)(NSProgress *progress))progressCallback
success:(nullable void (^)(NSURLSessionDataTask * _Nullable task, id result))successCallback
failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failureCallback;
// POST.
- (void)POSTWithRequestTag:(NSInteger)requestTag
URLString:(NSString *)URLString
parameters:(nullable id)parameters
progress:(nullable void (^)(NSProgress *progress))progressCallback
success:(nullable void (^)(NSURLSessionDataTask * _Nullable task, id result))successCallback
failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failureCallback;
// the requesting task set.
@property (nonatomic, strong, readonly, nullable) NSHashTable *dataTaskSet;
// Get task with requestTag
- (nullable NSURLSessionDataTask *)taskWithRequestTag:(NSInteger)requestTag;
// cancel a request, cancel the request when dismiss before controller.
- (void)cancelTask:(NSInteger)requestTag;
// Set User-Agent
- (void)setUserAgent:(NSString *)userAgent;
@end
NS_ASSUME_NONNULL_END
OKHTTPRequestManager.m
//
// OKHTTPRequestManager.m
// LL
//
// Created by Morris_ on 2020/9/22.
// Copyright © 2020 LL Technologies. All rights reserved.
//
#import "OKHTTPRequestManager.h"
#import "AFHTTPSessionManager.h"
@interface OKHTTPRequestManager ()
@property (nonatomic, strong) AFHTTPSessionManager *httpSessionManager;
@property (nonatomic, strong, readwrite, nullable) NSHashTable *taskSet;
@end
@implementation OKHTTPRequestManager
- (AFHTTPSessionManager *)httpSessionManager {
if (_httpSessionManager == nil) {
// httpSessionManager
_httpSessionManager = [[AFHTTPSessionManager alloc] init];
// request out time set
_httpSessionManager.requestSerializer.timeoutInterval = 30.f;
// response serializer set
AFHTTPResponseSerializer *responseSerializer = [AFHTTPResponseSerializer serializer];
responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/html", @"text/xml", @"text/plain", nil];
_httpSessionManager.responseSerializer = responseSerializer;
// none securityPolicy
_httpSessionManager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
// HTTP redirection
[_httpSessionManager setTaskWillPerformHTTPRedirectionBlock:^NSURLRequest * _Nonnull(NSURLSession * _Nonnull session, NSURLSessionTask * _Nonnull task, NSURLResponse * _Nonnull response, NSURLRequest * _Nonnull request) {
return request ? request : nil;
}];
}
return _httpSessionManager;
}
- (NSHashTable *)taskSet {
if (!_taskSet) {
_taskSet = [NSHashTable weakObjectsHashTable];
}
return _taskSet;
}
+ (instancetype)manager {
static OKHTTPRequestManager *_manager;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_manager = [[OKHTTPRequestManager alloc] init];
[_manager httpSessionManager];
});
return _manager;
}
- (void)GETWithRequestTag:(NSInteger)requestTag
URLString:(NSString *)URLString
parameters:(nullable id)parameters
progress:(nullable void (^)(NSProgress *progress))progressCallback
success:(nullable void (^)(NSURLSessionDataTask * _Nullable task, id result))successCallback
failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failureCallback
{
__weak typeof(self)weakSelf = self;
NSURLSessionDataTask *task = [self.httpSessionManager GET:URLString parameters:parameters headers:nil progress:^(NSProgress * _Nonnull uploadProgress){
if (progressCallback) {
progressCallback(uploadProgress);
}
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSString *jsonString = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
NSError *err;
id response = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&err];
if (err) {
response = jsonString;
}
okDispatch_main_async_safe(^{
[weakSelf removeTask:task];
});
if (successCallback) {
successCallback(task,response);
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
okDispatch_main_async_safe(^{
[weakSelf removeTask:task];
});
if (failureCallback) {
failureCallback(task,error);
}
}];
[task resume];
NSString *taskDescription = [self getTaskDescription:requestTag];
if (taskDescription) {
task.taskDescription = taskDescription;
[weakSelf.taskSet addObject:task];
}
}
- (void)POSTWithRequestTag:(NSInteger)requestTag
URLString:(NSString *)URLString
parameters:(nullable id)parameters
progress:(nullable void (^)(NSProgress *progress))progressCallback
success:(nullable void (^)(NSURLSessionDataTask * _Nullable task, id result))successCallback
failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failureCallback
{
__weak typeof(self)weakSelf = self;
NSURLSessionDataTask *task = [self.httpSessionManager POST:URLString parameters:parameters headers:nil progress:^(NSProgress * _Nonnull uploadProgress) {
if (progressCallback) {
progressCallback(uploadProgress);
}
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSString *jsonString = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
NSError *err;
id response = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&err];
if (err) {
response = jsonString;
}
okDispatch_main_async_safe(^{
[weakSelf removeTask:task];
});
if (successCallback) {
successCallback(task,response);
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
okDispatch_main_async_safe(^{
[weakSelf removeTask:task];
});
if (failureCallback) {
failureCallback(task,error);
}
}];
[task resume];
NSString *taskDescription = [self getTaskDescription:requestTag];
if (taskDescription) {
task.taskDescription = taskDescription;
[weakSelf.taskSet addObject:task];
}
}
#pragma mark - task manager
- (nullable NSURLSessionDataTask *)taskWithRequestTag:(NSInteger)requestTag
{
NSString *taskDescription = [self getTaskDescription:requestTag];
if (taskDescription && taskDescription.length) {
for (NSURLSessionDataTask *task in self.taskSet) {
if ([task.taskDescription isEqualToString:taskDescription]) {
return task;
}
}
}
return nil;
}
- (void)cancelTask:(NSInteger)requestTag
{
NSString *taskDescription = [self getTaskDescription:requestTag];
for (NSURLSessionTask *task in self.taskSet) {
if ([task.taskDescription isEqualToString:taskDescription]) {
if (task.state < NSURLSessionTaskStateCanceling) {
[task cancel];
}
[self.taskSet removeObject:task];
}
}
}
- (void)removeTask:(NSURLSessionTask *)task
{
if ([self.taskSet containsObject:task]) {
[self.taskSet removeObject:task];
[task cancel];
task = nil;
}
}
- (void)addTask:(NSURLSessionTask *)task
{
[self.taskSet addObject:task];
}
- (NSString *)getTaskDescription:(NSInteger)requestTag
{
return [NSString stringWithFormat:@"OKHTTPRequest: %ld",(long)requestTag];
}
- (void)setUserAgent:(NSString *)userAgent
{
NSString *value = [NSString stringWithFormat:@"%@ %@ %@", userAgent, [[NSBundle mainBundle] infoDictionary][@"CFBundleShortVersionString"] ?: [[NSBundle mainBundle] infoDictionary][(__bridge NSString *)kCFBundleVersionKey], [[UIDevice currentDevice] model]];
[self.httpSessionManager.requestSerializer setValue:value forHTTPHeaderField:@"User-Agent"];
}
@end