8

我正在使用以下代码,

NSString *jsonD = [NSString stringWithFormat:@"rawJson=%@",[fbUserInfo jsonUTF8String]];
NSData *myRequestData = [jsonD dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url
                                                           cachePolicy:policy timeoutInterval:20.0];

[ request setHTTPMethod: @"POST" ];
[request setValue:[NSString stringWithFormat:@"%d", [myRequestData length]] forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[ request setHTTPBody: myRequestData ];

在这段代码中,我有日期2013-06-29T18:33:17+0000。问题是我的服务器接收日期为 2013-06-29T18:33:17 0000. 见空间。我不知道为什么会这样。

4

4 回答 4

5

仅仅因为您指定了编码标头并不意味着NSURLRequest将实际执行所述编码。

CFURLCreateStringByAddingPercentEscapes函数可以为您对字符串进行 URL 编码。

如果您不关心编码并且只想发送简单的字符串,我建议您完全跳过编码并使用“text/plain”内容类型。

另一种选择是使用 JSON 而不是表单编码(“application/json”)。JSON 在服务器端和客户端都更容易使用。Cocoa 内置了对 JSON 的支持。

编辑:现在我再次阅读了您的代码,我看到您为变量命名,表明数据已经是 JSON。如果是这样,解决方案是使用"application/json"内容类型并确保服务器正确理解和解码。

于 2013-07-03T10:00:48.097 回答
2

如果你需要' '->'+'替换,你需要自己做。

请参阅:Objective-c iPhone 百分比编码字符串?用于进行转换的代码。


更新

好的,根据您的评论,这里有一些附加信息。基于查询字符串的旧处理,'+'字符被转换为' '字符。

它被载入旧的 JavaScript、CGI 和 PHP 处理 URL。

微软甚至有一个错误的例子来展示它。

您可以通过始终转换'+''%2B'' '来避免该问题'%20'

于 2013-07-03T10:03:09.233 回答
1

AFNetworking库就这样解决了这个问题:

static NSString * AFPercentEscapedQueryStringPairMemberFromStringWithEncoding(NSString *string, NSStringEncoding encoding) {
    static NSString * const kAFCharactersToBeEscaped = @":/?&=;+!@#$()~',*";
    static NSString * const kAFCharactersToLeaveUnescaped = @"[].";

    return (__bridge_transfer  NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (__bridge CFStringRef)string, (__bridge CFStringRef)kAFCharactersToLeaveUnescaped, (__bridge CFStringRef)kAFCharactersToBeEscaped, CFStringConvertNSStringEncodingToEncoding(encoding));
}
于 2013-07-03T10:04:01.733 回答
1

正如@Krumelur 建议的那样,该CFURLCreateStringByAddingPercentEscapes函数可以为您的字符串进行 URL 编码。这是代码。

static NSString * CTPercentEscapedQueryStringValueFromStringWithEncoding(NSString *string, NSStringEncoding encoding) {
    return (__bridge_transfer  NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (__bridge CFStringRef)string, NULL, (__bridge CFStringRef)kCharactersToBeEscapedInQueryString, CFStringConvertNSStringEncodingToEncoding(encoding));
}

和完整的解决方案 :要从参数中获取编码的 url,请使用以下代码。

/**
 get parameterized url from url and query parameters.
 */
+(NSString *)getParameterizedUrl:(NSString *)url withParameters:(NSDictionary *)queryDictionary
{
    NSMutableArray *mutablePairs = [NSMutableArray array];
    for (NSString *key in queryDictionary) {
        [mutablePairs addObject:[NSString stringWithFormat:@"%@=%@", CTPercentEscapedQueryStringKeyFromStringWithEncoding(key, NSUTF8StringEncoding), CTPercentEscapedQueryStringValueFromStringWithEncoding(queryDictionary[key], NSUTF8StringEncoding)]];
    }

    return [[NSString alloc]initWithFormat:@"%@?%@",url,[mutablePairs componentsJoinedByString:@"&"]];
}

static NSString * const kCharactersToBeEscapedInQueryString = @":/?&=;+!@#$()',*";

static NSString * CTPercentEscapedQueryStringKeyFromStringWithEncoding(NSString *string, NSStringEncoding encoding) {
    static NSString * const kCharactersToLeaveUnescapedInQueryStringPairKey = @"[].";

    return (__bridge_transfer  NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (__bridge CFStringRef)string, (__bridge CFStringRef)kCharactersToLeaveUnescapedInQueryStringPairKey, (__bridge CFStringRef)kCharactersToBeEscapedInQueryString, CFStringConvertNSStringEncodingToEncoding(encoding));
}

static NSString * CTPercentEscapedQueryStringValueFromStringWithEncoding(NSString *string, NSStringEncoding encoding) {
    return (__bridge_transfer  NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (__bridge CFStringRef)string, NULL, (__bridge CFStringRef)kCharactersToBeEscapedInQueryString, CFStringConvertNSStringEncodingToEncoding(encoding));
}

并在您的代码中使用

NSString *url = [self getParameterizedUrl:@"http://www.example.com" withParameters:self.params];

注意:这里的参数是字典。

于 2015-06-29T10:33:55.260 回答