iOS到Web服务器通过POST - 字符串被切断?

时间:2013-01-13 15:23:56

标签: ios json post

我正在尝试从我的iOS应用程序向Web服务器发送序列化对象,通常一切正常。我已经尝试发送一个巨大的字符串,它在服务器上出来就好了。但是当我将序列化对象发送到服务器时,字符串会被切断。我已经从我的应用程序中记录了字符串 - 它就在那里。我尝试将相同的字符串写入我的Web服务器上的文件,并以最奇怪的方式切断它。

可能是什么原因?我怀疑这与编码有关。以下是我将数据发送到服务器的方法:

+ (void)postRequestWithData:(id)data toURL:(NSURL *)url {
    // Prepare data
    NSData *postData = [NSJSONSerialization dataWithJSONObject:data options:NSJSONWritingPrettyPrinted error:nil];
    NSString *postDataString = [[NSString alloc] initWithData:postData encoding:NSUTF8StringEncoding];
    NSString *requestString = [NSString stringWithFormat:@"sales=%@", postDataString];
    NSString *postLength = [NSString stringWithFormat:@"%d", [requestString length]];

    // Make the request
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
    [request setURL:url];
    [request setHTTPMethod:@"POST"];
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"];
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
    [request setHTTPBody:[requestString dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES]];
    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];

    // Error reporting
    if (!connection) {
        NSLog(@"Could not make a connection!");
    }
}

其中(id)数据是字典数组。

以下是我在服务器中处理它的方法:

<?php
    $sales = $_POST['sales'];
    $myFile = "testFile.txt";
    $fh = fopen($myFile, 'w') or die("can't open file");
    fwrite($fh, $sales);
    fclose($fh);
?>

2 个答案:

答案 0 :(得分:0)

您应该根据application/x-www-form-urlencode转义您的网址(查询)字符串。这有一个NSString函数:

- (NSString *)stringByAddingPercentEscapesUsingEncoding:(NSStringEncoding)encoding

根据这一点,您的代码应如下所示:

NSData *postData = [NSJSONSerialization dataWithJSONObject:data options:NSJSONWritingPrettyPrinted error:nil];
NSString *postDataString = [[NSString alloc] initWithData:postData encoding:NSUTF8StringEncoding];
NSSztring *escapedDataString = [postDataString stringByAddingPercentEscapesUsingEncoding:NSUTF8Encoding]
NSString *requestString = [NSString stringWithFormat:@"sales=%@", escapedDataString];
NSString *postLength = [NSString stringWithFormat:@"%d", [requestString length]];

答案 1 :(得分:-1)

您需要先对postDataString进行URL编码。为此,您可以使用Core Foundation函数CFURLCreateStringByAddingPercentEscapes

NSString *encoded = CFBridgingRelease( CFURLCreateStringByAddingPercentEscapes( kCFAllocatorDefault, (__bridge CFStringRef)originalString, NULL, NULL, kCFStringEncodingUTF8 ) );

两个NULL参数控制哪些字符应该编码,哪些应该保留。传递NULL两者都会转义URL中无效的所有字符。请注意,我在这里假设ARC。

此外,您的内容长度计算错误。您需要从NSData对象获取长度,而不是字符串。