美文网首页
自用AFNetworking网络请求工具

自用AFNetworking网络请求工具

作者: EASXAI | 来源:发表于2017-05-24 18:00 被阅读27次

简介:AFNetworking与MJExtension相结合封装的网络请求工具(使用前需要使用cocoapods或手动导入这两个三方库)
主要完成网络的get、post请求,图片的单张上传以及多张上传。
使用串行队列实现合并多个get网络请求。
网络请求参数可以传入一个字典,也可以传入一个Model对象(使用对象转换字典的方式,实际上最终传入的还是一个字典,这个主要针对项目中请求参数太多进行统一管理。例如:商品列表多条件联动查询)。

AFHttpTool.h文件

//
//  AFHttpTool.h
//  VictorOC
//
//  Created by WebUser on 17/2/28.
//  Copyright © 2017年 tcbwork. All rights reserved.
//

#import <Foundation/Foundation.h>
//数据解析
#import <MJExtension.h>
//网络请求
#import <AFNetworking.h>

#ifdef DEBUG // 调试状态
#define BaseURL          @"http://gank.io/api/data/"
#else // 发布状态
#define BaseURL          @"http://gank.io/api/data/"
#endif


// 获取当前进度使用 double类型数据接收  uploadProgress.fractionCompleted
typedef void(^Progress_Block)(NSProgress *uploadProgress);
// 获取返回值判断是否为字典,从字典中取值
typedef void(^Success_Block)(id result);
typedef void(^Failure_Block)(NSError *error);

typedef void(^Successs_Block)(NSArray *resultArray);
typedef void(^Failures_Block)(NSArray *errorArray);


@interface AFHttpTool : NSObject


// GET请求
+ (void)getWithURLString:(NSString *)spliceUrl
          parameters:(id)parameters
         resultClass:(Class)resultClass
             success:(Success_Block)success
             failure:(Failure_Block)failure;


// POST请求
+ (void)postWithURLString:(NSString *)spliceUrl
           parameters:(id)parameters
              resultClass:(Class)resultClass
              success:(Success_Block)success
              failure:(Failure_Block)failure;

//get合并网络请求
+ (void)loadWithURLArray:(NSArray *)urlArray
      parameterArray:(NSArray *)parameterArray
    resultClassArray:(NSArray *)resultClassArray
             success:(Successs_Block)success
             failure:(Failures_Block)failure;

// 上传图片
+ (void)uploadImageWithURLString:(NSString *)spliceUrl
                  parameters:(id)parameters
                  uploadData:(NSData *)uploadData
                  uploadName:(NSString *)uploadName
                 resultClass:(Class)resultClass
                    progress:(Progress_Block)progress
                     success:(Success_Block)success
                     failure:(Failure_Block)failure;

// 上传多张图片
+ (void)uploadImagesWithURLString:(NSString *)spliceUrl
                   parameters:(id)parameters
                  uploadDatas:(NSMutableArray *)uploadDatas
                   uploadName:(NSString *)uploadName
                  resultClass:(Class)resultClass
                     progress:(Progress_Block)progress
                      success:(Success_Block)success
                      failure:(Failure_Block)failure;

@end

AFHttpTool.m文件

//
//  AFHttpTool.m
//  VictorOC
//
//  Created by WebUser on 17/2/28.
//  Copyright © 2017年 tcbwork. All rights reserved.
//

#import "AFHttpTool.h"

@implementation AFHttpTool

// GET请求
+ (void)getWithURLString:(NSString *)spliceUrl
          parameters:(id)parameters
         resultClass:(Class)resultClass
             success:(Success_Block)success
             failure:(Failure_Block)failure {
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.requestSerializer.timeoutInterval = 10;
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",@"text/json", @"text/plain", @"text/html", nil];
    NSString *url = [NSString stringWithFormat:@"%@%@",BaseURL,spliceUrl];
    id _parameters = [self getObjectData:parameters];
    [manager GET:url parameters:_parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        kNSLog(@"\n 请求url %@\n 请求参数 %@\n 结果 %@\n",url,_parameters,responseObject);
        id keyValues = [responseObject mj_JSONObject];
        if (resultClass!=nil) {
           id resultObject = [resultClass mj_objectWithKeyValues:keyValues];
            if (success) {
                success(resultObject);
            }
        }else{
            if (success) {
                success(responseObject);
            }
        }
    
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        kNSLog(@"\n 请求url %@\n 请求参数 %@\n failure %@\n",url,parameters,error);
        if (failure) {
            failure(error);
        }
    }];
}


// POST请求
+ (void)postWithURLString:(NSString *)spliceUrl
           parameters:(id)parameters
          resultClass:(Class)resultClass
              success:(Success_Block)success
              failure:(Failure_Block)failure {
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.requestSerializer.timeoutInterval = 10;
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",@"text/json", @"text/plain", @"text/html", nil];
    NSString *url = [NSString stringWithFormat:@"%@%@",BaseURL,spliceUrl];
    id _parameters = [self getObjectData:parameters];
    [manager POST:url parameters:_parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        kNSLog(@"\n 请求url %@\n 请求参数 %@\n 结果 %@\n",url,_parameters,responseObject);
        id keyValues = [responseObject mj_JSONObject];
        if (resultClass!=nil) {
            id resultObject = [resultClass mj_objectWithKeyValues:keyValues];
            if (success) {
                success(resultObject);
            }
        }else{
            if (success) {
                success(responseObject);
            }
        }
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        kNSLog(@"\n 请求url %@\n 请求参数 %@\n failure %@\n",url,parameters,error);
        if (failure) {
            failure(error);
        }
    }];
}
//get合并网络请求
+ (void)loadWithURLArray:(NSArray *)urlArray
      parameterArray:(NSArray *)parameterArray
    resultClassArray:(NSArray *)resultClassArray
             success:(Successs_Block)success
             failure:(Failures_Block)failure {
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.requestSerializer.timeoutInterval = 10;
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",@"text/json", @"text/plain", @"text/html", nil];
    //串行队列
    dispatch_queue_t queue = dispatch_queue_create("TCB", DISPATCH_QUEUE_SERIAL);
    dispatch_set_target_queue(queue, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0));
    NSMutableArray *successArray = [NSMutableArray array];
    NSMutableArray *errorArray = [NSMutableArray array];
    for (int i=0;i<urlArray.count;i++) {
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
            NSString *url = [NSString stringWithFormat:@"%@%@",BaseURL,urlArray[i]];
            id _parameters = [self getObjectData:parameterArray[i]];
            [manager GET:url parameters:[self getObjectData:parameterArray[i]] progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
                kNSLog(@"\n 处理第%d个 请求url %@\n 请求参数 %@\n 结果 %@\n",i+1,url,_parameters,responseObject);
                id keyValues = [responseObject mj_JSONObject];
                if (resultClassArray[i]!=nil) {
                    id resultObject = [resultClassArray[i] mj_objectWithKeyValues:keyValues];
                    [successArray addObject:resultObject];
                }else{
                    [successArray addObject:responseObject];
                }
                if (i==urlArray.count-1&&success) {
                    success(successArray);
                }
            } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
                kNSLog(@"\n 处理第%d个 请求url %@\n 请求参数 %@\n failure %@\n",i+1,url,parameterArray[i],error);
                [errorArray addObject:error];
                if (i==urlArray.count-1&&failure) {
                    failure(errorArray);
                }
            }];
        });
    }
}

#pragma mark -- 上传单张图片 --
+ (void)uploadImageWithURLString:(NSString *)spliceUrl
                  parameters:(id)parameters
                  uploadData:(NSData *)uploadData
                  uploadName:(NSString *)uploadName
                 resultClass:(Class)resultClass
                    progress:(Progress_Block)progress
                     success:(Success_Block)success
                     failure:(Failure_Block)failure {
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",@"text/json", @"text/plain", @"text/html", nil];
    NSString *url = [NSString stringWithFormat:@"%@%@",BaseURL,spliceUrl];
    id _parameters = [self getObjectData:parameters];
    [manager POST:url parameters:_parameters constructingBodyWithBlock:^(id< AFMultipartFormData >  _Nonnull formData) {
        [formData appendPartWithFileData:uploadData name:uploadName fileName:[NSString stringWithFormat:@"%@.png",uploadName] mimeType:@"image/png"];
    } progress:^(NSProgress * _Nonnull uploadProgress) {
        if (progress) {
            progress(uploadProgress);
        }
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        kNSLog(@"\n 请求url %@\n 请求参数 %@\n 结果 %@\n",url,_parameters,responseObject);
        id keyValues = [responseObject mj_JSONObject];
        if (resultClass!=nil) {
            id resultObject = [resultClass mj_objectWithKeyValues:keyValues];
            if (success) {
                success(resultObject);
            }
        }else{
            if (success) {
                success(responseObject);
            }
        }
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        kNSLog(@"\n 请求url %@\n 请求参数 %@\n failure %@\n",url,parameters,error);
        if (failure) {
            failure(error);
        }
    }];
}

#pragma mark -- 上传多张图片 --
+ (void)uploadImagesWithURLString:(NSString *)spliceUrl
                   parameters:(id)parameters
                  uploadDatas:(NSMutableArray *)uploadDatas
                   uploadName:(NSString *)uploadName
                  resultClass:(Class)resultClass
                     progress:(Progress_Block)progress
                      success:(Success_Block)success
                      failure:(Failure_Block)failure {
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",@"text/json", @"text/plain", @"text/html", nil];
    NSString *url = [NSString stringWithFormat:@"%@%@",BaseURL,spliceUrl];
    id _parameters = [self getObjectData:parameters];
    [manager POST:url parameters:_parameters constructingBodyWithBlock:^(id< AFMultipartFormData >  _Nonnull formData) {
        for (int i=0; i<uploadDatas.count; i++) {
            NSString *imageName = [NSString stringWithFormat:@"%@[%d]", uploadName, i];
            [formData appendPartWithFileData:uploadDatas[i] name:imageName fileName:[NSString stringWithFormat:@"%@%d.JPEG",uploadName,i] mimeType:@"image/JPEG"];
        }
    } progress:^(NSProgress * _Nonnull uploadProgress) {
        if (progress) {
            progress(uploadProgress);
        }
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        kNSLog(@"\n 请求url %@\n 请求参数 %@\n 结果 %@\n",url,_parameters,responseObject);
        id keyValues = [responseObject mj_JSONObject];
        if (resultClass!=nil) {
            id resultObject = [resultClass mj_objectWithKeyValues:keyValues];
            if (success) {
                success(resultObject);
            }
        }else{
            if (success) {
                success(responseObject);
            }
        }
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        kNSLog(@"\n 请求url %@\n 请求参数 %@\n failure %@\n",url,parameters,error);
        if (failure) {
            failure(error);
        }
    }];
}

/**
 *  对象转换为字典
 *
 *  @param obj 需要转化的对象
 *
 *  @return 转换后的字典
 */
+ (NSDictionary*)getObjectData:(id)obj {
    if (obj==nil||[obj isKindOfClass:[NSDictionary class]]) {
        return obj;
    }
    NSMutableDictionary *dic = [NSMutableDictionary dictionary];
    unsigned int propsCount;
    objc_property_t *props = class_copyPropertyList([obj class], &propsCount);
    for(int i = 0;i < propsCount; i++) {
        objc_property_t prop = props[i];
        NSString *propName = [NSString stringWithUTF8String:property_getName(prop)];
        id value = [obj valueForKey:propName];
        if(value == nil) {
            value = [NSNull null];
        } else {
            value = [self getObjectInternal:value];
        }
        [dic setObject:value forKey:propName];
    }
    return dic;
}
+ (id)getObjectInternal:(id)obj {
    if([obj isKindOfClass:[NSString class]]
       ||
       [obj isKindOfClass:[NSNumber class]]
       ||
       [obj isKindOfClass:[NSNull class]]) {
        return obj;
    }
    if([obj isKindOfClass:[NSArray class]]) {
        NSArray *objarr = obj;
        NSMutableArray *arr = [NSMutableArray arrayWithCapacity:objarr.count];
        for(int i = 0; i < objarr.count; i++) {
            [arr setObject:[self getObjectInternal:[objarr objectAtIndex:i]] atIndexedSubscript:i];
        }
        return arr;
    }
    if([obj isKindOfClass:[NSDictionary class]]) {
        NSDictionary *objdic = obj;
        NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithCapacity:[objdic count]];
        for(NSString *key in objdic.allKeys) {
                [dic setObject:[self getObjectInternal:[objdic objectForKey:key]] forKey:key];
            }
            return dic;
        }
        return [self getObjectData:obj];
    }

@end 

相关文章

网友评论

      本文标题:自用AFNetworking网络请求工具

      本文链接:https://www.haomeiwen.com/subject/pouoxxtx.html