BaseRequest.m 7.74 KB
//
//  BaseRequest.m
//  IM_ios_client
//
//  Created by 顾俊生 on 16/1/4.
//  Copyright © 2016年 xiniu. All rights reserved.
//

#import "BaseRequest.h"
#import <CommonCrypto/CommonDigest.h>

@implementation BaseRequest

@synthesize fields;
@synthesize locale;
@synthesize format;
@synthesize v;
@synthesize sign_method;

// fields项目名常量定义
static NSString * const  f_method = @"method";
static NSString * const  f_locale = @"locale";
static NSString * const  f_session = @"session";
static NSString * const  f_identityId = @"identityId";
static NSString * const  f_timestamp = @"timestamp";
static NSString * const  f_format = @"format";
static NSString * const  f_app_key = @"app_key";
static NSString * const  f_v = @"v";
static NSString * const  f_sign = @"sign";
static NSString * const  f_sign_method = @"sign_method";
static NSString * const  f_secret = @"secret";
static NSString * const  f_apiTenantId = @"apiTenantId";

// 常量值
static NSString * const  LOCALE = @"zh_CN";
static NSString * const  FORMAT = @"json";
static NSString * const  V = @"1.0";
static NSString * const  SIGN_METHOD = @"md5";

- (instancetype)init
{
    self = [super init];
    if (self) {
        fields = [[NSMutableDictionary alloc]init];
        self.locale = LOCALE;
        self.format = FORMAT;
        self.v = V;
        self.sign_method = SIGN_METHOD;
        self.timestamp = @"";
    }
    return self;
}

#pragma getter/setter
-(NSString *)secret
{
    return (NSString *)[fields objectForKey:f_secret];
}

-(void)setSecret:(NSString *)secret
{
    [fields setObject:secret forKey:f_secret];
}

-(NSString *)method
{
    return (NSString *)[fields objectForKey:f_method];
}

-(void)setMethod:(NSString *)method
{
    [fields setObject:method forKey:f_method];
}

-(NSString *)locale
{
    return LOCALE;
}

-(void)setLocale:(NSString *)locale
{
    [fields setObject:LOCALE forKey:f_locale];
}

-(NSString *)session
{
    return (NSString *)[fields objectForKey:f_session];
}

-(void)setSession:(NSString *)session
{
    [fields setObject:session forKey:f_session];
}

-(NSString *)identityId
{
    return (NSString *)[fields objectForKey:f_identityId];
}

-(void)setIdentityId:(NSString *)identityId
{
    [fields setObject:identityId forKey:f_identityId];
}

-(NSString *)apiTenantId
{
    return (NSString *)[fields objectForKey:f_apiTenantId];
}

-(void)setApiTenantId:(NSString *)apiTenantId
{
    [fields setObject:apiTenantId forKey:f_apiTenantId];
}

-(NSString *)timestamp
{
    return (NSString *)[fields objectForKey:f_timestamp];
}

-(void)setTimestamp:(NSString *)timestamp
{
    NSDate* dat = [NSDate dateWithTimeIntervalSinceNow:0];
    NSTimeInterval a=[dat timeIntervalSince1970]*1000;
    
    [fields setObject:[NSString stringWithFormat:@"%.0f", a] forKey:f_timestamp];
}

-(NSString *)format
{
    return [fields objectForKey:f_format];
}

-(void)setFormat:(NSString *)format
{
    [fields setObject:FORMAT forKey:f_format];
}

-(NSString *)app_key
{
    return [fields objectForKey:f_app_key];
}

-(void)setApp_key:(NSString *)app_key
{
    [fields setObject:app_key forKey:f_app_key];
}

-(NSString *)v
{
    return [fields objectForKey:f_v];
}

-(void)setV:(NSString *)v
{
    [fields setObject:V forKey:f_v];
}

-(NSString *)sign
{
    return [fields objectForKey:f_sign];
}

-(void)setSign:(NSString *)sign
{
    [fields setObject:sign forKey:f_sign];
}

-(NSString *)sign_method
{
    return [fields objectForKey:f_sign_method];
}

-(void)setSign_method:(NSString *)sign_method
{
    [fields setObject:SIGN_METHOD forKey:f_sign_method];
}


// 排序生成签名
-(NSString *)createSign
{
    // 排序签名
    NSMutableString *mu_temp = [[NSMutableString alloc]init];
    // NSLog(@"%lu",(unsigned long)self.fields.count);
    NSArray *keys = [fields allKeys];
    NSArray *sortedArray = [keys sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
        return [obj1 compare:obj2 options:NSNumericSearch];
    }];
    for (NSString *categoryId in sortedArray) {
        
        [mu_temp appendString:categoryId];
        if ([[fields objectForKey:categoryId] isKindOfClass:[NSArray class]]) {
            [mu_temp appendString:[self event_toJSONString:[fields objectForKey:categoryId]]];
        }else if([[fields objectForKey:categoryId] isKindOfClass:[NSNumber class]]){
            [mu_temp appendString:[NSString stringWithFormat:@"%@",[fields objectForKey:categoryId]]];
        }else{
            [mu_temp appendString:[NSString stringWithFormat:@"%@",[fields objectForKey:categoryId]]];
        }
        //[mu_temp appendString:[baseRequest.fields objectForKey:categoryId]];
        
        //NSLog(@"[dict objectForKey:%@] === %@",categoryId,[baseRequest.fields objectForKey:categoryId]);
    }
    
    return [self md5_32:mu_temp bool_isUpper:YES];
}

// 生成URL
-(NSString *)createUrl
{
    // 生成签名
    self.sign = [self createSign];
    
    NSArray *keys = [fields allKeys];
    
    NSMutableString *mu_temp = [[NSMutableString alloc]init];
    
    for (int i = 0; i < keys.count; i++) {
        [mu_temp appendString:[keys objectAtIndex:i]];
        [mu_temp appendString:@"="];
        if ([[fields objectForKey:[keys objectAtIndex:i]] isKindOfClass:[NSNumber class]]) {
            [mu_temp appendString:[NSString stringWithFormat:@"%@",[fields objectForKey:[keys objectAtIndex:i]]]];
        }else{
            [mu_temp appendString:[fields objectForKey:[keys objectAtIndex:i]]];
        }
        if (i < keys.count - 1) {
            [mu_temp appendString:@"&"];
        }
    }
    //NSLog(@"mu_temp = %@",mu_temp);
    return mu_temp;
}

// MD5 32位加密
-(NSString *)md5_32:(NSString *)str bool_isUpper:(BOOL)bool_isUpper
{
    NSString *nss_temp = [NSString stringWithFormat:@"%@%@%@",self.secret,str,self.secret];
    const char *cStr = [nss_temp UTF8String];
    unsigned char result[32];
    CC_MD5(cStr, (CC_LONG)strlen(cStr), result);
    NSMutableString *hash = [NSMutableString string];
    for (int i = 0; i < 16; i++)
    {
        [hash appendFormat:@"%02X", result[i]];
    }
    if (bool_isUpper) {
        return [hash uppercaseString];
    }else{
        return [hash lowercaseString];
    }
}

#pragma mark - 共同的设置Domain元素的方法
/*
 itemObj:元素值
 itemKey:元素的值在元素所属Domain的字典中对应的Key
 selfFields:元素所属Domain的字典
 selfKey:元素所属Domain的字典在WKBaseDomain中的Key
 */
-(void)setItemObj:(id)itemObj itemKey:(id<NSCopying>)itemKey selfFields:(NSMutableDictionary *)selfFields selfKey:(id<NSCopying>)selfKey
{
    [selfFields setObject:itemObj forKey:itemKey];
    
    [fields setObject:selfFields forKey:selfKey];
}

#pragma mark - 根据Domain的字典在WKBaseDomain中的Key获得Domain的字典
-(NSMutableDictionary *)getDomainDicByKey:(NSString *)domainKey
{
    NSMutableDictionary *dic_self = [[NSMutableDictionary alloc]init];
    if ([fields objectForKey:domainKey]) {
        dic_self = [NSMutableDictionary dictionaryWithDictionary:[fields objectForKey:domainKey]];
    }
    return dic_self;
}

#pragma mark - 判读字典中是否存在某个key
-(BOOL)keyExistInDictionary:(NSMutableDictionary *)dic key:(NSString *)key
{
    if (![dic isKindOfClass:[NSNull class]] && dic.allKeys.count > 0 && [[dic allKeys] containsObject:key]) {
        return YES;
    }
    return NO;
}

- (NSString *)event_toJSONString:(id)theData
{
    
    if(theData)
    {
        NSData *jsonData = [NSJSONSerialization dataWithJSONObject:theData
                                                           options:NSJSONWritingPrettyPrinted
                                                             error:nil];
        
        NSString *jsonString = [[NSString alloc] initWithData:jsonData
                                                     encoding:NSUTF8StringEncoding];
        
        return jsonString;
    }
    return nil;
}

@end