使用AFNetWorking 实现参数加密请求

用过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];
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.在开发的时候可以创建一个工具类,继承自我们的AFN中的请求管理者,再控制器中真正发请求的代码使用自己封装的工具...
    红楼那一场梦阅读 3,533评论 2 3
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,891评论 18 139
  • AFN什么是AFN全称是AFNetworking,是对NSURLConnection、NSURLSession的一...
    醉叶惜秋阅读 1,245评论 0 0
  • 1.自定义控件 a.继承某个控件 b.重写initWithFrame方法可以设置一些它的属性 c.在layouts...
    圍繞的城阅读 3,463评论 2 4
  • 访问网络的基本流程:5点 HTTP协议 2.通信过程 --------------请求的方法-----get 和 ...
    光明程辉阅读 1,015评论 0 2