datetime的URL参数编码为+和:符号



我正在使用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];

相关内容

  • 没有找到相关文章

最新更新