我正在使用AFNetworking for iOS,我想发送一个带有查询参数的请求,该参数具有日期时间作为值。需要的行为应该是:
Original: 2016-07-04T14:30:21+0200
Encoded: 2016-07-04T14%3A30%3A21%2B0200
Example: .../?datetime=2016-07-04T14%3A30%3A21%2B0200
AFNetworking自己进行字符串编码,不包括特殊字符,如+ / & :
和其他一些(维基百科:百分比编码),这是好的,因为它们是保留的。所以我必须对datetime的值进行编码,以另一种方式转义加号和冒号。但是,当我在AFNetworking之前手动编码该值时,它显然会转义%
两次。每个%
对应一个%25
2016-07-04T14%253A30%253A21%252B0200
我希望AFNetworking使用百分比编码的查询与允许的字符,如:
query.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLPathAllowedCharacterSet())
我没有找到一个解决方案来改变或禁用编码由AFNetworking完全手动完成。你有什么建议吗?
经过更多的研究,我找到了一个地方注入我想要的编码。这是行不通的方式:
ENCODING NOT WORKING
Init the 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
参数的url,只查询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];