基于AF的HTTP

搬搬砖头而已!

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Morris_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值