POST请求中的&符号造成严重破坏

时间:2011-07-05 16:03:35

标签: iphone ios post

我有一个简单的POST来自我的iPhone应用程序。它的工作正常,除了通过一个&符号导致后端中断 - 这几乎就像它将它视为GET请求(&符号分隔变量名称)。我需要先进行某种编码吗?这是代码:

NSString *content = [[NSString alloc] initWithFormat:@"data=%@&email=%@", str, emailAddress.text];

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.myurl.com/myscript.php"]];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:[content dataUsingEncoding:NSISOLatin1StringEncoding]];

// generates an autoreleased NSURLConnection
[NSURLConnection connectionWithRequest:request delegate:self];

4 个答案:

答案 0 :(得分:7)

我在iOS7中遇到过这个问题,并且接受的答案根本不起作用(实际上,这是我向后端发送数据时的标准)。 &符号在后端打破了,所以我不得不更换& %26。后端是在python中完成的,代码是遗留的,并且正在使用ASI。

基本上我做了以下事情:

NSString *dataContent =  [NSString stringWithFormat:@"text=%@", 
    [json stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

dataContent = [dataContent stringByReplacingOccurrencesOfString:@"&" 
                                                     withString:@"%26"];

答案 1 :(得分:1)

ByAddingPercent .......将无法正常工作是一个有效的URL字符。

我需要发送带有&的JSON。在其中,它是相同的想法;

NSString *post = [NSString stringWithFormat:@"JSON=%@", (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)jsonString, NULL, CFSTR(":/?#[]@!$&’()*+,;="), kCFStringEncodingUTF8))];

“jsonString”到底是转换的。

答案 2 :(得分:0)

编辑:由于stringByAddingPercentEscapesUsingEncoding:应该用于编码查询的部分而不是整个部分,所以您应该使用其他方法。

不幸的是,Foundation没有提供这样的方法,因此您需要访问CoreFoundation:

- (NSString *)stringByURLEncodingString:(NSString *)string {
    return (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(
        kCFAllocatorDefault,
        (__bridge CFStringRef)string,
        NULL, // or (__bridge CFStringRef)(@"[].")
        (__bridge CFStringRef)(@":/?&=;+!@#$()',*"),
        kCFStringEncodingUTF8
    );
}

您可以使用

- stringByAddingPercentEscapesUsingEncoding:

在您的情况下,它将如下所示:

NSString * content = [[NSString alloc] initWithFormat:@"data=%@&email=%@", [str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding], [emailAddress.text  stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

你也可以这样做:

NSString *dataStr = [str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *emailStr = [emailAddress.text  stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

NSString *content = [[NSString alloc] initWithFormat:@"data=%@&email=%@", dataStr, emailStr];

答案 3 :(得分:0)

我不确定这是否适用于您的情况,但您可以尝试使用%38来尝试对&符号进行编码。