IOS开发牛叉的demoiOS备忘录

使用AFNetWorking 实现参数加密请求

2016-08-11  本文已影响3170人  Touchs

用过AFN的都知道,虽说上传参数是id类型的,但是这个id类型只能是字典/数组/集合.... 但是一般对参数加密上传的是NSString类型的啊......

屏幕快照 2016-08-11 11.47.58.png

怎么将你的NSDictionry/NSArry的参数加密后的字符串通过AFN 上传呢?

两种方法.

方法一:
只要在AFN里修改几行代码即可..
在AFURLRequestSerialization.m里
找到- (NSURLRequest *)requestBySerializingRequest:(NSURLRequest )request withParameters:(id)parameters error:(NSError__autoreleasing *)error 这个方法

6148B827-9DD7-4E12-8F66-B91C7C704777.png

图中红色方框中的代码是新加的...
被替换的是 [mutableRequest setHTTPBody:[NSJSONSerialization dataWithJSONObject:parameters options:self.writingOptions error:error]];

原理很简单 就是NSMutableUrlRequest 设置请求提的时候,将原本只处理字典和数组的代码 加上判断去处理字符串. 这样后台就能收到你的加密字符串了...

//对字符串/数组/字典的加密 ----以上修改之后可直接上传返回的字符串
- (NSString*)encodedSendingBody:(id)params{
    NSString * dataStr;
    if ([params isKindOfClass:[NSString class]]) {
        dataStr = params;
    }else{
        NSError*error;
        NSData * data =  [NSJSONSerialization dataWithJSONObject:params
                                                         options:0
                                                           error:&error];
        dataStr = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
    }
    
//加密操作.
    return  requestBodyStr;
}

方法二:
构建请求参数.直接操作request

 NSMutableURLRequest *request =
    [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:url]];
    [request setHTTPMethod:@"POST"];
    
    //requestManager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
    //[request setValue:@"application/json; charset=utf-8" forHTTPHeaderField:@"Content-Type"];

// 此处设置请求体 (即将参数加密后的字符串,转为data)  
一般是参数字典转json字符串,再将json字符串加密,最后将加密后的字符串转为data 设置为请求体

 [request setHTTPBody: [data dataUsingEncoding:NSUTF8StringEncoding]];

发起请求:

 requestManager = [AFHTTPSessionManager manager];
 requestManager.requestSerializer = [AFJSONRequestSerializer serializer];    requestManager.responseSerializer = [AFHTTPResponseSerializer serializer];

 NSURLSessionDataTask * tesk = [requestManager dataTaskWithRequest:request uploadProgress:nil downloadProgress:nil completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
        
        if (error) {
            
            failure(error);
            
        }else{
            
            success(responseObject);
        }
    }];
    [tesk resume];
上一篇下一篇

猜你喜欢

热点阅读