CNLiveNetworkManager.m 8.63 KB
//
//  CNLiveNetworkManager.m
//  CNLiveHttpRequestDemo
//
//  Created by Android on 16/7/26.
//  Copyright © 2016年 Android. All rights reserved.
//

#import "CNLiveNetworkManager.h"
#import "CNLiveURLRequestSerialization.h"

#define boundary @"cnlive"

/**
 *  网络超时时间 默认 60
 */
static  NSTimeInterval TimeoutInterval = 30.0 ;
/**
 *  缓存策略
 *  NSURLRequestUseProtocolCachePolicy // 默认的缓存策略(取决于协议)
 *  NSURLRequestReloadIgnoringLocalCacheData // 忽略缓存,重新请求
 *  NSURLRequestReloadIgnoringLocalAndRemoteCacheData // 未实现
 *  NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData // 忽略缓存,重新请求
 *  NSURLRequestReturnCacheDataElseLoad// 有缓存就用缓存,忽略过期时间!没有缓存就重新请求
 *  NSURLRequestReturnCacheDataDontLoad// 有缓存就用缓存,没有缓存就不发请求,当做请求出错处理(用于离线模式)
 *  NSURLRequestReloadRevalidatingCacheData // 未实现
 */
static NSURLRequestCachePolicy CachePolicy = NSURLRequestUseProtocolCachePolicy;

@implementation CNLiveNetworkManager

+ (CNLiveNetworkManager *)manager
{
    static CNLiveNetworkManager *manager = nil;
    
    static dispatch_once_t predicate;
    
    dispatch_once(&predicate, ^{
        
        manager = [[CNLiveNetworkManager alloc] init];
        
    });
    
    manager.cachePolicy = CachePolicy;
    
    manager.timeoutInterval = TimeoutInterval;
    
    return manager;
}

-(void)requestGetURL:(NSString *)URL
          parameters:(NSDictionary *)parameters
             success:(void (^)(NSURLResponse * _Nullable, id _Nullable))success
             failure:(void (^)(NSURLResponse * _Nullable, NSError * _Nullable))failure
{
    NSURLSessionDataTask *task = [self dataTaskWithRequestMethod:@"GET" URLString:URL parameters:parameters imageData:nil success:success failure:failure];
    [task resume];
}

- (void)requestPostURL:(NSString *)URL
            parameters:(NSDictionary *)parameters
               success:(void (^)(NSURLResponse * _Nullable, id _Nullable))success
               failure:(void (^)(NSURLResponse * _Nullable, NSError * _Nullable))failure
{
    NSURLSessionDataTask *task = [self dataTaskWithRequestMethod:@"POST" URLString:URL parameters:parameters imageData:nil success:success failure:failure];
    [task resume];
}

- (void)uploadImageWithURL:(NSString *)URL parameters:(NSDictionary *)parameters imageData:(NSData *)data success:(void (^)(NSURLResponse * _Nullable, id _Nullable))success failure:(void (^)(NSURLResponse * _Nullable, NSError * _Nullable))failure
{
    NSURLSessionDataTask *task = [self dataTaskWithRequestMethod:@"POST" URLString:URL parameters:parameters imageData:data success:success failure:failure];
    [task resume];
}

- (NSURLSessionDataTask *)dataTaskWithRequestMethod:(NSString *)method
                                          URLString:(NSString *)URLString
                                         parameters:(NSDictionary *)parameters
                                              imageData:(NSData *)data
                                            success:(void (^)(NSURLResponse * _Nullable, id _Nullable))success
                                            failure:(void (^)(NSURLResponse * _Nullable, NSError * _Nullable))failure
{
    
    if (![URLString isKindOfClass:[NSString class]]) {
        NSError *error = [NSError errorWithDomain:NSURLErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey : @"please enter a valid url"}];
        failure(nil, error);
        return nil;
    }
    
    NSString *newURLString;
    if ([method isEqualToString:@"GET"]) {
        if (parameters) {
            newURLString = [[URLString stringByAppendingString:@"?"] stringByAppendingString:[CNLiveURLRequestSerialization CNQueryStringFromParameters:parameters]];
        }else{
            newURLString = URLString;
        }
    }else{
        newURLString = URLString;
    }
    
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:newURLString] cachePolicy:self.cachePolicy timeoutInterval:self.timeoutInterval];
    
    request.HTTPMethod = method;
    
    if([method isEqual:@"POST"]){
        if (!data) {
            [request addValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
            request.HTTPBody =[[CNLiveURLRequestSerialization CNQueryStringFromParameters:parameters] dataUsingEncoding:NSUTF8StringEncoding];
        } else {
            //设置HTTPHeader中Content-Type的值
            NSString *content=[[NSString alloc]initWithFormat:@"multipart/form-data; boundary=%@",boundary];
            //设置HTTPHeader
            [request setValue:content forHTTPHeaderField:@"Content-Type"];
            
            //设置Content-Length
            NSData *requestData = [self setBodyData:data parameters:parameters];
            [request setValue:[NSString stringWithFormat:@"%lu", (unsigned long)[requestData length]] forHTTPHeaderField:@"Content-Length"];

            //设置http body
            [request setHTTPBody:requestData];
            [request setHTTPMethod:@"POST"];

        }
    }
    
    NSURLSessionDataTask *task = [self dataTaskWithRequest:request success:success failure:failure];
    
    return task;
}

- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request
                                      success:(void (^)(NSURLResponse * _Nullable, id _Nullable))success
                                      failure:(void (^)(NSURLResponse * _Nullable, NSError * _Nullable))failure
{
    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        
        dispatch_async(dispatch_get_main_queue(), ^{
            if (error) {
                failure(response,error);
            }else{
                if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
                    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
                    if (httpResponse.statusCode < 400) {
                        id jsonObj = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
                        success(httpResponse,jsonObj);
                    } else {
                         NSError *failureError = [NSError errorWithDomain:NSURLErrorDomain code:httpResponse.statusCode userInfo:httpResponse.allHeaderFields];
                        failure(httpResponse,failureError);
                    }
                } else {
                    failure(response,error);
                }
            }
        });
    }];
    
    return task;
}

- (NSData *)setBodyData:(NSData *)data parameters:(NSDictionary *)parameters
{
    //分界线
    NSString *MPBoundary = [[NSString alloc] initWithFormat:@"--%@",boundary];
    //结束符
    NSString *endMPBoundary = [[NSString alloc] initWithFormat:@"%@--",MPBoundary];
    
    NSMutableString *body = [[NSMutableString alloc] init];
    
    if (parameters) {
        
        NSArray *keys = [parameters allKeys];
        
        for (int i = 0; i < [keys count]; i ++) {
            NSString *key = [keys objectAtIndex:i];
            
            //添加分界线,换行
            [body appendFormat:@"%@\r\n",MPBoundary];
            
            //添加字段名称,换2行
            [body appendFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n",key];
            //添加字段的值
            [body appendFormat:@"%@\r\n",[parameters objectForKey:key]];
            
        }
    }
    
    [body appendFormat:@"%@\r\n",MPBoundary];
    
    //声明pic字段,文件名为boris.png
    [body appendFormat:@"Content-Disposition: form-data; name=\"face\"; filename=\"image\"\r\n"];
    //声明上传文件的格式
    [body appendFormat:@"Content-Type: image/jpge,image/gif, image/jpeg, image/pjpeg, image/pjpeg\r\n\r\n"];
    
    //声明结束符:--AaB03x--
    NSString *end=[[NSString alloc]initWithFormat:@"\r\n%@",endMPBoundary];
    //声明myRequestData,用来放入http body
    NSMutableData *myRequestData=[NSMutableData data];
    
    //将body字符串转化为UTF8格式的二进制
    [myRequestData appendData:[body dataUsingEncoding:NSUTF8StringEncoding]];
    [myRequestData appendData:data];
    //加入结束符--AaB03x--
    [myRequestData appendData:[end dataUsingEncoding:NSUTF8StringEncoding]];
    return myRequestData;
}

- (NSURL *)formatURLString:(NSString *)url
{
    NSURL *urlString = [NSURL URLWithString:[url stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]];
    return urlString;
}

@end