iOS 使用AFNetworking传输字符串

通常网络请求使用AFNetworking我们都会将字典作为参数传给服务端,如果应用对数据的安全级别要求较高,这时肯定会将参数加密后再传输,那么上传的参数就变成一串看不懂的字符串,我们只需要设置AFHTTPSessionManager中几个类型即可直接上传字符。

配置参数请求和接收类型

+ (AFHTTPSessionManager *)getRequstManager {
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.requestSerializer.timeoutInterval = 30;
    manager.requestSerializer.stringEncoding = NSUTF8StringEncoding;
    manager.requestSerializer = [AFHTTPRequestSerializer serializer];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    [manager.requestSerializer setValue:@"text/html" forHTTPHeaderField:@"Accept"];
    [manager.requestSerializer setValue:@"text/html" forHTTPHeaderField:@"Content-Type"];
    return manager;
}

配置完成后发送请求,可能会发现服务端接收的字符串前面莫名的多出'='符号,查看源码发现AFURLRequestSerialization文件中下面的方法引起的

- (NSString *)URLEncodedStringValue {
    if (!self.value || [self.value isEqual:[NSNull null]]) {
        return AFPercentEscapedStringFromString([self.field description]);
    } else {
        return [NSString stringWithFormat:@"%@=%@", AFPercentEscapedStringFromString([self.field description]), AFPercentEscapedStringFromString([self.value description])];
    }
}

顺藤摸瓜发现AFQueryStringFromParameters函数中使用到了- URLEncodedStringValue方法。发现如下代码使用到了AFQueryStringFromParameters函数,如果实现self.queryStringSerialization属性就可以解决'='问题。

if (self.queryStringSerialization) {
    NSError *serializationError;
    query = self.queryStringSerialization(request, parameters, &serializationError);
    
    if (serializationError) {
        if (error) {
            *error = serializationError;
        }
        
        return nil;
    }
} else {
    switch (self.queryStringSerializationStyle) {
        case AFHTTPRequestQueryStringDefaultStyle:
            query = AFQueryStringFromParameters(parameters);
            break;
    }
}

解决'='方法

AFHTTPSessionManager *manager = [self sessionManager];
[manager.requestSerializer setQueryStringSerializationWithBlock:^NSString *(NSURLRequest *request, NSDictionary *parameters, NSError *__autoreleasing *error) {
    return paramsStr;
}];
[manager POST:urlStr parameters:paramsStr progress:^(NSProgress * _Nonnull uploadProgress) {
    
} success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
    
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    
}];

总结

  • 不建议修改直接源码达到去掉'='目的,通常可能因为源码版本更新而遗忘。
  • 如果使用原生网络请求可以直接通过[request setHTTPBody:data]来实现字符串或其他数据传输。

你可能感兴趣的:(iOS 使用AFNetworking传输字符串)