iOS 之AFN封装(四)常用

本文介绍了一个基于AFNetworking库的网络请求封装方案,包括HTTP请求的配置、多种请求方式(GET、POST、PUT等)的实现及响应处理,特别关注于iOS应用开发中的网络通信实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

+++++++++++++++++AFN++HTTP常用设置+++++++++++++++++++++++++

////http常用设置
//-(AFHTTPSessionManager *)httpNormalConfig{
//    //待超时时间
//    NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
//    config.timeoutIntervalForRequest =20.0;
//
//    AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithSessionConfiguration:config];
//    manager.requestSerializer=[AFHTTPRequestSerializer serializer];
//    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
//    manager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];//安全策略   AFSSLPinningModeCertificate(校验证书)
//    manager.securityPolicy.allowInvalidCertificates = YES;//客户端是否信任非法证书
//    manager.securityPolicy.validatesDomainName = NO;//不验证证书的域名
//    manager.responseSerializer.acceptableContentTypes=[NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html",@"text/xml", @"text/plain; charset=utf-8", nil];
//    [manager.requestSerializer setValue:@"text/html;charset=utf-8"
//                     forHTTPHeaderField:@"Content-Type"];  //请求的URL所用的编码类型;如果不设置,默认的是json,客户端发送的数据类型
//    [manager.requestSerializer
//     setValue:@"application/json" forHTTPHeaderField:@"Accept"];//客户端或浏览器可以接受的数据类型
 [manager.requestSerializer setAuthorizationHeaderFieldWithUsername:@"username" password:@"password"];//带用户验证
//
//
//    /*
//
//     //下列请求头参数根据你自己的后台接口要求来设置
//     [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
//     [manager.requestSerializer setValue:@"application/json;charset=UTF-8" forHTTPHeaderField:@"Content-Type"];
//     [manager.requestSerializer setValue:@"keep-alive" forHTTPHeaderField:@"Connection"];
//     [manager.requestSerializer setValue:@"zh-cn" forHTTPHeaderField:@"language"];
//     //如果报接受类型不一致请替换一致text/html或别的
//     manager.responseSerializer.acceptableContentTypes = nil;
//     设置向请求内容的类型
//     [manager.requestSerializer setValue:@"application/json;charset=utf-8"forHTTPHeaderField:@"Content-Type"];//这个和
//     设置请求内容的长度
//     [manager.requestSerializer setValue:[NSStringstringWithFormat:@"%ld", (unsignedlong)[jsonStr length]] forHTTPHeaderField:@"Content-Length"];
//     设置请求的编码类型
//     [manager.requestSerializer setValue:@"gzip"forHTTPHeaderField:@"Content-Encoding"];
//     */
//
//
//    return manager;
//}

一般请求封装:

HTTPmanager设置

#import "AFHTTPSessionManager.h"

NS_ASSUME_NONNULL_BEGIN

@interface QMWNHttpM : AFHTTPSessionManager
+(AFHTTPSessionManager *)sharehttpsessionmanager;
@end

NS_ASSUME_NONNULL_END


#import "QMWNHttpM.h"

@implementation QMWNHttpM
+(AFHTTPSessionManager *)sharehttpsessionmanager{
    static QMWNHttpM *httpsessionmanager=nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        httpsessionmanager=[[QMWNHttpM alloc]init];
        httpsessionmanager.requestSerializer.timeoutInterval=20.0;
        httpsessionmanager.requestSerializer=[AFHTTPRequestSerializer serializer];
        httpsessionmanager.responseSerializer = [AFHTTPResponseSerializer serializer];
        //    manager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];//安全策略   AFSSLPinningModeCertificate(校验证书)
        httpsessionmanager.securityPolicy.allowInvalidCertificates = YES;//客户端是否信任非法证书
        httpsessionmanager.securityPolicy.validatesDomainName = NO;//不验证证书的域名
        
        httpsessionmanager.responseSerializer.acceptableContentTypes=[NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html",@"text/xml",@"text/css", @"text/plain;charset=utf-8", nil];
        [httpsessionmanager.requestSerializer setValue:@"application/json"
                         forHTTPHeaderField:@"Content-Type"];//;charset=utf-8
//        [httpsessionmanager.requestSerializer setValue:@"application/x-www-form-urlencoded"
//                         forHTTPHeaderField:@"Content-Type"];
        [httpsessionmanager.requestSerializer
         setValue:@"application/json" forHTTPHeaderField:@"Accept"];
//        [httpsessionmanager.requestSerializer setAuthorizationHeaderFieldWithUsername:@"13913002628" password:@"111111a"];
//        [httpsessionmanager.requestSerializer setAuthorizationHeaderFieldWithUsername:@"15850692168" password:@"111111a"];
        [httpsessionmanager.requestSerializer setAuthorizationHeaderFieldWithUsername:[HximCommanManager sharedCommonManager].username password:[HximCommanManager sharedCommonManager].password];
        SLog(@"shifoudengu-用户名-%@",[HximCommanManager sharedCommonManager].username);
    });
    return httpsessionmanager;
}
@end




--------------

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN
typedef void(^ProgressBlock) (NSProgress* progress);
typedef void(^SuccessBlock) (NSURLSessionDataTask *task, id responseObject);
typedef void(^FailureBlock) (NSURLSessionDataTask *task, NSError *error);

@interface QMWNHttpRequestManager : NSObject
+(instancetype)sharedManager;


//1.put 把请求的参数放到body中,自己用原生的封装
-(void)putjsonpostRequestWithUrl:(NSString *)url
                      params:(NSDictionary *)params
                successBlock:(SuccessBlock)successBlock
                    failureBlock:(FailureBlock)failureBlock;
//2.1.把请求的参数放到body中,自己用原生的封装
-(void)getjsonpostRequestWithUrl:(NSString *)url
                      params:(NSDictionary *)params
                successBlock:(SuccessBlock)successBlock
                    failureBlock:(FailureBlock)failureBlock;

//2.把请求的参数放到body中,自己用原生的封装
-(void)jsonpostRequestWithUrl:(NSString *)url
                 params:(NSDictionary *)params
           successBlock:(SuccessBlock)successBlock
                 failureBlock:(FailureBlock)failureBlock;
//3.put修改数据
-(void)putnormaldownloadWithUrl:(NSString *)url
                      params:(NSDictionary *)params
                successBlock:(SuccessBlock)successBlock
                   failureBlock:(FailureBlock)failureBlock;
//4.get请求数据
-(void)normaldownloadWithUrl:(NSString *)url
                      params:(NSDictionary *)params
                successBlock:(SuccessBlock)successBlock
                failureBlock:(FailureBlock)failureBlock;

//5.post 请求数据
-(void)lyRequestWithUrl:(NSString *)url
                 params:(NSDictionary *)params
           successBlock:(SuccessBlock)successBlock
           failureBlock:(FailureBlock)failureBlock;

//6.普通的原生请求
-(void)nativeRequestWithUrl:(NSString *)url
                     params:(NSDictionary *)params
               successBlock:(SuccessBlock)successBlock
               failureBlock:(FailureBlock)failureBlock;
@end

NS_ASSUME_NONNULL_END



#import "QMWNHttpRequestManager.h"
#import "AFNetworking.h"
#import "QMWNHttpM.h"
@interface QMWNHttpRequestManager()
@property(nonatomic,strong) NSURLSessionDownloadTask *downloadTask;
@property(nonatomic,strong)AFURLSessionManager *manager;
@property(nonatomic,strong)NSData *resumeData;
@end
@implementation QMWNHttpRequestManager
+(instancetype)sharedManager{
    static QMWNHttpRequestManager *httpRequestManager;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        httpRequestManager=[[QMWNHttpRequestManager alloc]init];
    });
    return httpRequestManager;
}

//http常用设置,
-(AFHTTPSessionManager *)httpNormalConfig{
    //待超时时间
    NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
    config.timeoutIntervalForRequest =20.0;
    AFHTTPSessionManager *httpsessionmanager = [[AFHTTPSessionManager alloc] initWithSessionConfiguration:config];
    httpsessionmanager.requestSerializer=[AFHTTPRequestSerializer serializer];
    httpsessionmanager.responseSerializer = [AFHTTPResponseSerializer serializer];
    //    manager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];//安全策略   AFSSLPinningModeCertificate(校验证书)
    httpsessionmanager.securityPolicy.allowInvalidCertificates = YES;//客户端是否信任非法证书
    httpsessionmanager.securityPolicy.validatesDomainName = NO;//不验证证书的域名
    
    httpsessionmanager.responseSerializer.acceptableContentTypes=[NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html",@"text/xml",@"text/css", @"text/plain;charset=utf-8", nil];
    [httpsessionmanager.requestSerializer setValue:@"application/json"
                     forHTTPHeaderField:@"Content-Type"];//;charset=utf-8
//        [httpsessionmanager.requestSerializer setValue:@"application/x-www-form-urlencoded"
//                         forHTTPHeaderField:@"Content-Type"];
    [httpsessionmanager.requestSerializer
     setValue:@"application/json" forHTTPHeaderField:@"Accept"];
//        [httpsessionmanager.requestSerializer setAuthorizationHeaderFieldWithUsername:@"13913002628" password:@"111111a"];
//        [httpsessionmanager.requestSerializer setAuthorizationHeaderFieldWithUsername:@"15850692168" password:@"111111a"];
    [httpsessionmanager.requestSerializer setAuthorizationHeaderFieldWithUsername:[HximCommanManager sharedCommonManager].username password:[HximCommanManager sharedCommonManager].password];
    SLog(@"shifoudengu-用户名-%@",[HximCommanManager sharedCommonManager].username);
   
    return httpsessionmanager;
}

//1.put 把请求的参数放到body中,自己用原生的封装
-(void)putjsonpostRequestWithUrl:(NSString *)url
                      params:(NSDictionary *)params
                successBlock:(SuccessBlock)successBlock
                failureBlock:(FailureBlock)failureBlock{

    AFHTTPSessionManager *manager = [QMWNHttpM sharehttpsessionmanager];
    manager.requestSerializer=[AFJSONRequestSerializer serializer];
    manager.responseSerializer = [AFJSONResponseSerializer serializer];
    //    manager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];//安全策略   AFSSLPinningModeCertificate(校验证书)
    manager.securityPolicy.allowInvalidCertificates = YES;//客户端是否信任非法证书
    manager.securityPolicy.validatesDomainName =NO;//不验证证书的域名
    manager.responseSerializer.acceptableContentTypes=[NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html",@"text/xml",@"text/css", @"text/plain;charset=utf-8", nil];
    [manager.requestSerializer setValue:@"application/json;charset=utf-8"
                     forHTTPHeaderField:@"Content-Type"];

    [manager.requestSerializer
     setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    NSMutableURLRequest *request = [[AFJSONRequestSerializer serializer] requestWithMethod:@"PUT" URLString:url parameters:nil error:nil];
[request addValue:@"application/json"forHTTPHeaderField:@"Content-Type"];
    NSData *body= [NSJSONSerialization dataWithJSONObject:params options:NSJSONWritingPrettyPrinted error:nil];
[request setHTTPBody:body];
    NSLog(@"参数---%@",params);
    [[manager dataTaskWithRequest:request uploadProgress:^(NSProgress * _Nonnull uploadProgress) {
                
            } downloadProgress:^(NSProgress * _Nonnull downloadProgress) {
                
            } completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
//      NSDictionary * dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
                SLog(@"responseobject---%@",responseObject);
                if(responseObject!=nil){
                NSData *data = [NSJSONSerialization dataWithJSONObject:responseObject
                                                               options:0 error:NULL];
               NSDictionary *dict= [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
//                SLog(@"---%@",dict);
                if(dict){
                    if(successBlock){
                        successBlock([[NSURLSessionDataTask alloc]init],dict);
                    }
                }
                    
                }else {
                    SLog(@"无数据");
                    if(successBlock){
                        successBlock([[NSURLSessionDataTask alloc]init],@{@"backdata":@"无数据"});
                    }
                }
            }]resume];
}

//2.1.把请求的参数放到body中,自己用原生的封装
-(void)getjsonpostRequestWithUrl:(NSString *)url
                      params:(NSDictionary *)params
                successBlock:(SuccessBlock)successBlock
                failureBlock:(FailureBlock)failureBlock{

    AFHTTPSessionManager *manager = [QMWNHttpM sharehttpsessionmanager];
    manager.requestSerializer=[AFJSONRequestSerializer serializer];
    manager.responseSerializer = [AFJSONResponseSerializer serializer];
    //    manager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];//安全策略   AFSSLPinningModeCertificate(校验证书)
    manager.securityPolicy.allowInvalidCertificates = YES;//客户端是否信任非法证书
    manager.securityPolicy.validatesDomainName =NO;//不验证证书的域名
    manager.responseSerializer.acceptableContentTypes=[NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html",@"text/xml",@"text/css", @"text/plain;charset=utf-8", nil];
    [manager.requestSerializer setValue:@"application/json;charset=utf-8"
                     forHTTPHeaderField:@"Content-Type"];

    [manager.requestSerializer
     setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    NSMutableURLRequest *request = [[AFJSONRequestSerializer serializer] requestWithMethod:@"GET" URLString:url parameters:nil error:nil];
[request addValue:@"application/json"forHTTPHeaderField:@"Content-Type"];
    NSData *body= [NSJSONSerialization dataWithJSONObject:params options:NSJSONWritingPrettyPrinted error:nil];
[request setHTTPBody:body];
    NSLog(@"参数---%@",params);
    [[manager dataTaskWithRequest:request uploadProgress:^(NSProgress * _Nonnull uploadProgress) {
                
            } downloadProgress:^(NSProgress * _Nonnull downloadProgress) {
                
            } completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
//      NSDictionary * dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
                NSData *data = [NSJSONSerialization dataWithJSONObject:responseObject
                                                               options:0 error:NULL];
               NSDictionary *dict= [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
//                SLog(@"---%@",dict);
                if(dict){
                    if(successBlock){
                        successBlock([[NSURLSessionDataTask alloc]init],dict);
                    }
                }
            }]resume];
}
//2.把请求的参数放到body中,自己用原生的封装
-(void)jsonpostRequestWithUrl:(NSString *)url
                      params:(NSDictionary *)params
                successBlock:(SuccessBlock)successBlock
                failureBlock:(FailureBlock)failureBlock{

    AFHTTPSessionManager *manager = [QMWNHttpM sharehttpsessionmanager];
    manager.requestSerializer=[AFJSONRequestSerializer serializer];
    manager.responseSerializer = [AFJSONResponseSerializer serializer];
    //    manager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];//安全策略   AFSSLPinningModeCertificate(校验证书)
    manager.securityPolicy.allowInvalidCertificates = YES;//客户端是否信任非法证书
    manager.securityPolicy.validatesDomainName =NO;//不验证证书的域名
    manager.responseSerializer.acceptableContentTypes=[NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html",@"text/xml",@"text/css", @"text/plain;charset=utf-8", nil];
    [manager.requestSerializer setValue:@"application/json;charset=utf-8"
                     forHTTPHeaderField:@"Content-Type"];

    [manager.requestSerializer
     setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    NSMutableURLRequest *request = [[AFJSONRequestSerializer serializer] requestWithMethod:@"POST" URLString:url parameters:nil error:nil];
[request addValue:@"application/json"forHTTPHeaderField:@"Content-Type"];
    NSData *body= [NSJSONSerialization dataWithJSONObject:params options:NSJSONWritingPrettyPrinted error:nil];
[request setHTTPBody:body];
    NSLog(@"参数---%@",params);
    [[manager dataTaskWithRequest:request uploadProgress:^(NSProgress * _Nonnull uploadProgress) {
                
            } downloadProgress:^(NSProgress * _Nonnull downloadProgress) {
                
            } completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
//      NSDictionary * dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
                NSData *data = [NSJSONSerialization dataWithJSONObject:responseObject
                                                               options:0 error:NULL];
               NSDictionary *dict= [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
//                SLog(@"---%@",dict);
                if(dict){
                    if(successBlock){
                        successBlock([[NSURLSessionDataTask alloc]init],dict);
                    }
                }
            }]resume];
}

//3.put修改数据
-(void)putnormaldownloadWithUrl:(NSString *)url
                      params:(NSDictionary *)params
                successBlock:(SuccessBlock)successBlock
                failureBlock:(FailureBlock)failureBlock{
    AFHTTPSessionManager *manager = [QMWNHttpM sharehttpsessionmanager];
//     __weak typeof(manager) weak_manager = manager;
    NSLog(@"参数---%@",params);
    [manager PUT:url parameters:params headers:@{} success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSString *str=[[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding];//网页二进制数据转换成字符串
              NSData *data=[str dataUsingEncoding:NSUTF8StringEncoding];
              NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:data
                                                                 options:NSJSONReadingMutableLeaves error:nil];
//       SLog(@"dict--%@",dict);
              if(dict){
                  if(successBlock){
                      successBlock(task,dict);
                  }
              }
    
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        failureBlock(task,error);
    }];
    
    
}

//4.get请求数据
-(void)normaldownloadWithUrl:(NSString *)url
                      params:(NSDictionary *)params
                successBlock:(SuccessBlock)successBlock
                failureBlock:(FailureBlock)failureBlock{
//    AFHTTPSessionManager *manager = [QMWNHttpM sharehttpsessionmanager];
    AFHTTPSessionManager *manager = [self httpNormalConfig];
//     __weak typeof(manager) weak_manager = manager;
    NSLog(@"参数---%@",params);
    [manager GET:url parameters:params headers:@{} progress:^(NSProgress * _Nonnull downloadProgress) {
        
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
         NSString *str=[[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding];//网页二进制数据转换成字符串
               NSData *data=[str dataUsingEncoding:NSUTF8StringEncoding];
               NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:data
                                                                  options:NSJSONReadingMutableLeaves error:nil];
//        SLog(@"dict--%@",dict);
               if(dict){
                   if(successBlock){
                       successBlock(task,dict);
                   }
               }
     
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
         failureBlock(task,error);
        //  [weak_manager invalidateSessionCancelingTasks:YES];
    }];
   
}

//5.post 请求数据
-(void)lyRequestWithUrl:(NSString *)url
                 params:(NSDictionary *)params
           successBlock:(SuccessBlock)successBlock
           failureBlock:(FailureBlock)failureBlock{
 AFHTTPSessionManager *manager = [QMWNHttpM sharehttpsessionmanager];
//    AFHTTPSessionManager *manager = [self httpNormalConfig];
//     __weak typeof(manager) weak_manager = manager;
//     NSLog(@"---manger--%@",manager);
    NSLog(@"参数---%@",params);
    [manager POST:url parameters:params headers:@{} progress:^(NSProgress * _Nonnull uploadProgress) {
        
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
                NSString *str=[[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding];//网页二进制数据转换成字符串
        NSData *data=[str dataUsingEncoding:NSUTF8StringEncoding];
        NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:data
                                                           options:NSJSONReadingMutableLeaves error:nil];
//        SLog(@"数据--%@",str);
        if(dict){
            if(successBlock){
                successBlock(task,dict);
            }
        }

    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
         failureBlock(task,error);
        //        [weak_manager invalidateSessionCancelingTasks:YES];
    }];
   
}

//6.普通的原生请求,AFN参数会有问题
-(void)nativeRequestWithUrl:(NSString *)url
                     params:(NSDictionary *)params
               successBlock:(SuccessBlock)successBlock
               failureBlock:(FailureBlock)failureBlock{
    
    NSString *jsonstr = [[NSString alloc] initWithData:[NSJSONSerialization dataWithJSONObject:params options:0 error:nil] encoding:NSUTF8StringEncoding];
    AFURLSessionManager *manager=[[AFURLSessionManager alloc]initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
    NSMutableURLRequest *request=[[AFJSONRequestSerializer serializer]requestWithMethod:@"POST" URLString:url parameters:nil error:nil];
    request.timeoutInterval=20;
    [request setValue:@"application/json;charset=utf-8"
   forHTTPHeaderField:@"Content-Type"];
    [request setValue:@"application/json;charset=utf-8"
   forHTTPHeaderField:@"Accept"];
    //设置body
    [request setHTTPBody:[jsonstr dataUsingEncoding:NSUTF8StringEncoding]];
    
    [[manager dataTaskWithRequest:request uploadProgress:^(NSProgress * _Nonnull uploadProgress) {

    } downloadProgress:^(NSProgress * _Nonnull downloadProgress) {

    } completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
        NSString *str=[[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding];//网页二进制数据转换成字符串
NSData *data=[str dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:data
                                                   options:NSJSONReadingMutableLeaves error:nil];
SLog(@"数据--%@",str);

    }]resume];
    
}
@end
#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN
typedef void(^ProgressBlock) (NSProgress* progress);
typedef void(^SuccessBlock) (NSURLSessionDataTask *task, id responseObject);
typedef void(^FailureBlock) (NSURLSessionDataTask *task, NSError *error);

@interface QMWNHttpRequestManager : NSObject
+(instancetype)sharedManager;



//把请求的参数放到body中,自己用原生的封装
-(void)jsonpostRequestWithUrl:(NSString *)url
                 params:(NSDictionary *)params
           successBlock:(SuccessBlock)successBlock
                 failureBlock:(FailureBlock)failureBlock;

//3.put修改数据
-(void)putnormaldownloadWithUrl:(NSString *)url
                      params:(NSDictionary *)params
                successBlock:(SuccessBlock)successBlock
                failureBlock:(FailureBlock)failureBlock;
//4.get请求数据
-(void)normaldownloadWithUrl:(NSString *)url
                      params:(NSDictionary *)params
                successBlock:(SuccessBlock)successBlock
                failureBlock:(FailureBlock)failureBlock;

//5.post 请求数据
-(void)lyRequestWithUrl:(NSString *)url
                 params:(NSDictionary *)params
           successBlock:(SuccessBlock)successBlock
           failureBlock:(FailureBlock)failureBlock;

//6.普通的原生请求
-(void)nativeRequestWithUrl:(NSString *)url
                     params:(NSDictionary *)params
               successBlock:(SuccessBlock)successBlock
               failureBlock:(FailureBlock)failureBlock;
@end

NS_ASSUME_NONNULL_END



#import "QMWNHttpRequestManager.h"
#import "AFNetworking.h"
#import "QMWNHttpM.h"
@interface QMWNHttpRequestManager()
@property(nonatomic,strong) NSURLSessionDownloadTask *downloadTask;
@property(nonatomic,strong)AFURLSessionManager *manager;
@property(nonatomic,strong)NSData *resumeData;
@end
@implementation QMWNHttpRequestManager
+(instancetype)sharedManager{
    static QMWNHttpRequestManager *httpRequestManager;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        httpRequestManager=[[QMWNHttpRequestManager alloc]init];
    });
    return httpRequestManager;
}

//http常用设置,
-(AFHTTPSessionManager *)httpNormalConfig{
    //待超时时间
    NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
    config.timeoutIntervalForRequest =20.0;
    AFHTTPSessionManager *httpsessionmanager = [[AFHTTPSessionManager alloc] initWithSessionConfiguration:config];
    httpsessionmanager.requestSerializer=[AFHTTPRequestSerializer serializer];
    httpsessionmanager.responseSerializer = [AFHTTPResponseSerializer serializer];
    //    manager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];//安全策略   AFSSLPinningModeCertificate(校验证书)
    httpsessionmanager.securityPolicy.allowInvalidCertificates = YES;//客户端是否信任非法证书
    httpsessionmanager.securityPolicy.validatesDomainName = NO;//不验证证书的域名
    
    httpsessionmanager.responseSerializer.acceptableContentTypes=[NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html",@"text/xml",@"text/css", @"text/plain;charset=utf-8", nil];
    [httpsessionmanager.requestSerializer setValue:@"application/json"
                     forHTTPHeaderField:@"Content-Type"];//;charset=utf-8
//        [httpsessionmanager.requestSerializer setValue:@"application/x-www-form-urlencoded"
//                         forHTTPHeaderField:@"Content-Type"];
    [httpsessionmanager.requestSerializer
     setValue:@"application/json" forHTTPHeaderField:@"Accept"];
//        [httpsessionmanager.requestSerializer setAuthorizationHeaderFieldWithUsername:@"13913002628" password:@"111111a"];
//        [httpsessionmanager.requestSerializer setAuthorizationHeaderFieldWithUsername:@"15850692168" password:@"111111a"];
    [httpsessionmanager.requestSerializer setAuthorizationHeaderFieldWithUsername:[HximCommanManager sharedCommonManager].username password:[HximCommanManager sharedCommonManager].password];
    SLog(@"shifoudengu-用户名-%@",[HximCommanManager sharedCommonManager].username);
   
    return httpsessionmanager;
}

//1.put 把请求的参数放到body中,自己用原生的封装PUT
-(void)putjsonpostRequestWithUrl:(NSString *)url
                      params:(NSDictionary *)params
                successBlock:(SuccessBlock)successBlock
                failureBlock:(FailureBlock)failureBlock{

    AFHTTPSessionManager *manager = [QMWNHttpM sharehttpsessionmanager];
    manager.requestSerializer=[AFJSONRequestSerializer serializer];
    manager.responseSerializer = [AFJSONResponseSerializer serializer];
    //    manager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];//安全策略   AFSSLPinningModeCertificate(校验证书)
    manager.securityPolicy.allowInvalidCertificates = YES;//客户端是否信任非法证书
    manager.securityPolicy.validatesDomainName =NO;//不验证证书的域名
    manager.responseSerializer.acceptableContentTypes=[NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html",@"text/xml",@"text/css", @"text/plain;charset=utf-8", nil];
    [manager.requestSerializer setValue:@"application/json;charset=utf-8"
                     forHTTPHeaderField:@"Content-Type"];

    [manager.requestSerializer
     setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    NSMutableURLRequest *request = [[AFJSONRequestSerializer serializer] requestWithMethod:@"PUT" URLString:url parameters:nil error:nil];
[request addValue:@"application/json"forHTTPHeaderField:@"Content-Type"];
    NSData *body= [NSJSONSerialization dataWithJSONObject:params options:NSJSONWritingPrettyPrinted error:nil];
[request setHTTPBody:body];
    NSLog(@"参数---%@",params);
    [[manager dataTaskWithRequest:request uploadProgress:^(NSProgress * _Nonnull uploadProgress) {
                
            } downloadProgress:^(NSProgress * _Nonnull downloadProgress) {
                
            } completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
//      NSDictionary * dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
                SLog(@"responseobject---%@",responseObject);
                if(responseObject!=nil){
                NSData *data = [NSJSONSerialization dataWithJSONObject:responseObject
                                                               options:0 error:NULL];
               NSDictionary *dict= [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
//                SLog(@"---%@",dict);
                if(dict){
                    if(successBlock){
                        successBlock([[NSURLSessionDataTask alloc]init],dict);
                    }
                }
                    
                }else {
                    SLog(@"无数据");
                    if(successBlock){
                        successBlock([[NSURLSessionDataTask alloc]init],@{@"backdata":@"无数据"});
                    }
                }
            }]resume];
}

//2.1.把请求的参数放到body中,自己用原生的封装
-(void)getjsonpostRequestWithUrl:(NSString *)url
                      params:(NSDictionary *)params
                successBlock:(SuccessBlock)successBlock
                failureBlock:(FailureBlock)failureBlock{

    AFHTTPSessionManager *manager = [QMWNHttpM sharehttpsessionmanager];
    manager.requestSerializer=[AFJSONRequestSerializer serializer];
    manager.responseSerializer = [AFJSONResponseSerializer serializer];
    //    manager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];//安全策略   AFSSLPinningModeCertificate(校验证书)
    manager.securityPolicy.allowInvalidCertificates = YES;//客户端是否信任非法证书
    manager.securityPolicy.validatesDomainName =NO;//不验证证书的域名
    manager.responseSerializer.acceptableContentTypes=[NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html",@"text/xml",@"text/css", @"text/plain;charset=utf-8", nil];
    [manager.requestSerializer setValue:@"application/json;charset=utf-8"
                     forHTTPHeaderField:@"Content-Type"];

    [manager.requestSerializer
     setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    NSMutableURLRequest *request = [[AFJSONRequestSerializer serializer] requestWithMethod:@"GET" URLString:url parameters:nil error:nil];
[request addValue:@"application/json"forHTTPHeaderField:@"Content-Type"];
    NSData *body= [NSJSONSerialization dataWithJSONObject:params options:NSJSONWritingPrettyPrinted error:nil];
[request setHTTPBody:body];
    NSLog(@"参数---%@",params);
    [[manager dataTaskWithRequest:request uploadProgress:^(NSProgress * _Nonnull uploadProgress) {
                
            } downloadProgress:^(NSProgress * _Nonnull downloadProgress) {
                
            } completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
//      NSDictionary * dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
                NSData *data = [NSJSONSerialization dataWithJSONObject:responseObject
                                                               options:0 error:NULL];
               NSDictionary *dict= [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
//                SLog(@"---%@",dict);
                if(dict){
                    if(successBlock){
                        successBlock([[NSURLSessionDataTask alloc]init],dict);
                    }
                }
            }]resume];
}


//把请求的参数放到body中,自己用原生的封装
-(void)jsonpostRequestWithUrl:(NSString *)url
                      params:(NSDictionary *)params
                successBlock:(SuccessBlock)successBlock
                failureBlock:(FailureBlock)failureBlock{

    AFHTTPSessionManager *manager = [self httpNormalConfig];
    manager.requestSerializer=[AFJSONRequestSerializer serializer];
    manager.responseSerializer = [AFJSONResponseSerializer serializer];
    //    manager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];//安全策略   AFSSLPinningModeCertificate(校验证书)
    manager.securityPolicy.allowInvalidCertificates = YES;//客户端是否信任非法证书
    manager.securityPolicy.validatesDomainName =NO;//不验证证书的域名
    manager.responseSerializer.acceptableContentTypes=[NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html",@"text/xml",@"text/css", @"text/plain;charset=utf-8", nil];
    [manager.requestSerializer setValue:@"application/json;charset=utf-8"
                     forHTTPHeaderField:@"Content-Type"];

    [manager.requestSerializer
     setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    NSMutableURLRequest *request = [[AFJSONRequestSerializer serializer] requestWithMethod:@"POST" URLString:url parameters:nil error:nil];
[request addValue:@"application/json"forHTTPHeaderField:@"Content-Type"];
    NSData *body= [NSJSONSerialization dataWithJSONObject:params options:NSJSONWritingPrettyPrinted error:nil];
[request setHTTPBody:body];

    [[manager dataTaskWithRequest:request uploadProgress:^(NSProgress * _Nonnull uploadProgress) {
                
            } downloadProgress:^(NSProgress * _Nonnull downloadProgress) {
                
            } completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
//      NSDictionary * dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
                NSData *data = [NSJSONSerialization dataWithJSONObject:responseObject
                                                               options:0 error:NULL];
               NSDictionary *dict= [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
                SLog(@"---%@",dict);
                if(dict){
                    if(successBlock){
                        successBlock([[NSURLSessionDataTask alloc]init],dict);
                    }
                }
            }]resume];
}


//3.put修改数据
-(void)putnormaldownloadWithUrl:(NSString *)url
                      params:(NSDictionary *)params
                successBlock:(SuccessBlock)successBlock
                failureBlock:(FailureBlock)failureBlock{
    AFHTTPSessionManager *manager = [QMWNHttpM sharehttpsessionmanager];
//     __weak typeof(manager) weak_manager = manager;
    [manager PUT:url parameters:params headers:@{} success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSString *str=[[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding];//网页二进制数据转换成字符串
              NSData *data=[str dataUsingEncoding:NSUTF8StringEncoding];
              NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:data
                                                                 options:NSJSONReadingMutableLeaves error:nil];
       SLog(@"dict--%@",dict);
              if(dict){
                  if(successBlock){
                      successBlock(task,dict);
                  }
              }
    
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        failureBlock(task,error);
    }];
    
    
}
//4.get请求数据
-(void)normaldownloadWithUrl:(NSString *)url
                      params:(NSDictionary *)params
                successBlock:(SuccessBlock)successBlock
                failureBlock:(FailureBlock)failureBlock{
    AFHTTPSessionManager *manager = [QMWNHttpM sharehttpsessionmanager];
//     __weak typeof(manager) weak_manager = manager;
    
    [manager GET:url parameters:params headers:@{} progress:^(NSProgress * _Nonnull downloadProgress) {
        
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
         NSString *str=[[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding];//网页二进制数据转换成字符串
               NSData *data=[str dataUsingEncoding:NSUTF8StringEncoding];
               NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:data
                                                                  options:NSJSONReadingMutableLeaves error:nil];
        SLog(@"dict--%@",dict);
               if(dict){
                   if(successBlock){
                       successBlock(task,dict);
                   }
               }
     
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
         failureBlock(task,error);
        //  [weak_manager invalidateSessionCancelingTasks:YES];
    }];
   
}

//5.post 请求数据
-(void)lyRequestWithUrl:(NSString *)url
                 params:(NSDictionary *)params
           successBlock:(SuccessBlock)successBlock
           failureBlock:(FailureBlock)failureBlock{
 AFHTTPSessionManager *manager = [QMWNHttpM sharehttpsessionmanager];
//    AFHTTPSessionManager *manager = [self httpNormalConfig];
//     __weak typeof(manager) weak_manager = manager;
//     NSLog(@"---manger--%@",manager);
    NSLog(@"参数---%@",params);
    [manager POST:url parameters:params headers:@{} progress:^(NSProgress * _Nonnull uploadProgress) {
        
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
                NSString *str=[[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding];//网页二进制数据转换成字符串
        NSData *data=[str dataUsingEncoding:NSUTF8StringEncoding];
        NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:data
                                                           options:NSJSONReadingMutableLeaves error:nil];
        SLog(@"数据--%@",str);
        if(dict){
            if(successBlock){
                successBlock(task,dict);
            }
        }

    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
         failureBlock(task,error);
        //        [weak_manager invalidateSessionCancelingTasks:YES];
    }];
   
}

//6.普通的原生请求,AFN参数会有问题
-(void)nativeRequestWithUrl:(NSString *)url
                     params:(NSDictionary *)params
               successBlock:(SuccessBlock)successBlock
               failureBlock:(FailureBlock)failureBlock{
    
    NSString *jsonstr = [[NSString alloc] initWithData:[NSJSONSerialization dataWithJSONObject:params options:0 error:nil] encoding:NSUTF8StringEncoding];
    AFURLSessionManager *manager=[[AFURLSessionManager alloc]initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
    NSMutableURLRequest *request=[[AFJSONRequestSerializer serializer]requestWithMethod:@"POST" URLString:url parameters:nil error:nil];
    request.timeoutInterval=20;
    [request setValue:@"application/json;charset=utf-8"
   forHTTPHeaderField:@"Content-Type"];
    [request setValue:@"application/json;charset=utf-8"
   forHTTPHeaderField:@"Accept"];
    //设置body
    [request setHTTPBody:[jsonstr dataUsingEncoding:NSUTF8StringEncoding]];
    
    [[manager dataTaskWithRequest:request uploadProgress:^(NSProgress * _Nonnull uploadProgress) {

    } downloadProgress:^(NSProgress * _Nonnull downloadProgress) {

    } completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
        NSString *str=[[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding];//网页二进制数据转换成字符串
NSData *data=[str dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:data
                                                   options:NSJSONReadingMutableLeaves error:nil];
SLog(@"数据--%@",str);

    }]resume];
    
}
@end

***取消已经发送的请求

if ([manager.tasks count] > 0) {
               
                [manager.tasks makeObjectsPerformSelector:@selector(cancel)];
                SLog(@"tasks = %@",manager.tasks);
            }

manager里面的tasks装的就是正在执行的网络请求。执行cancel后,tasks就会清空,网络请求会进入失败的状态,然后响应failure block,得到一个error的信息,表示请求已经成功取消了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值