2016-07-04 67 views
2

我正在使用AFNetworking的iOS,我想发送请求与查询参数有一个日期时间作为值。想要的行为应该是:AFNetworking URL参数编码的日期时间与+和:标志

Original: 2016-07-04T14:30:21+0200 
Encoded: 2016-07-04T14%3A30%3A21%2B0200 
Example: .../?datetime=2016-07-04T14%3A30%3A21%2B0200 

AFNetworking确实本身字符串编码不包含特殊字符,如+/& :,还有一些人(Wikipedia: Percent-encoding),因为它们是保留这是罚款。 所以我必须编码我的日期时间的值另一种方式来逃避加号和冒号。但是,当我在AFNetworking之前手动编码值时,它显然会跳出%两次。所以它把每个%

2016-07-04T14%253A30%253A21%252B0200 

我想AFNetworking使用编码%的查询与像允许的字符一个%25

query.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLPathAllowedCharacterSet()) 

我没有找到一个解决方案来改变或禁用编码由AFNetworking完全手动完成。你有什么建议吗?

回答

2

经过多一点研究后,我发现了一个注入我想要的编码的地方。这是它没有工作方式:

编码不工作

初始化的requestOperationManager

self.requestOperationManager = [[AFHTTPRequestOperationManager alloc] init]; 
self.requestOperationManager.requestSerializer = [AFJSONRequestSerializer serializer]; 

使用requestOperationManager来初始化操作

NSURLRequest *request = [NSURLRequest alloc] initWithURL:url]; // The problem is here 
AFHTTPRequestOperation *operation = [self.requestOperationManager HTTPRequestOperationWithRequest:urlRequest success:^(AFHTTPRequestOperation *operation, id responseObject) { 
    // Success 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    // Failure 
}]; 
[self.requestOperationManager.operationQueue addOperation:operation]; 
[operation start]; 

方式有更多的控制

AFHTTPRequestSerializer也可以创建请求,您可以使用自己的序列化。

初始化的requestOperationManager并添加查询字符串序列化区块:

self.requestOperationManager = [[AFHTTPRequestOperationManager alloc] init]; 
self.requestOperationManager.requestSerializer = [AFJSONRequestSerializer serializer]; 
[self.requestOperationManager.requestSerializer setQueryStringSerializationWithBlock:^NSString * _Nonnull(NSURLRequest * _Nonnull request, id _Nonnull parameters, NSError * _Nullable __autoreleasing * _Nullable error) { 
    if ([parameters isKindOfClass:[NSString class]]) { 
     NSString *yourEncodedParameterString = // What every you want to do with it. 
     return yourEncodedParameterString; 
    } 
    return parameters; 
}]; 

现在改变你如何创建NSURLRequest

NSString *method = @"GET"; 
NSString *urlStringWithoutQuery = @"http://example.com/"; 
NSString *query = @"datetime=2016-07-06T12:15:42+0200" 
NSMutableURLRequest *urlRequest = [self.requestOperationManager.requestSerializer requestWithMethod:method URLString:urlStringWithoutQuery parameters:query error:nil]; 

这是重要,你拆你的网址。使用url而不用查询URLString参数,只查询parameters参数。通过使用requestWithMethod:URLString:parameters:error它将调用上面提供的查询字符串序列化块,并根据需要对参数进行编码。

AFHTTPRequestOperation *operation = [self.requestOperationManager HTTPRequestOperationWithRequest:urlRequest success:^(AFHTTPRequestOperation *operation, id responseObject) { 
    // Success 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    // Failure 
}]; 
[self.requestOperationManager.operationQueue addOperation:operation]; 
[operation start];