Objective-C POST请求不发送数据

我有一个方法,应该发布一些数据到PHP文件:

-(void)submitForm { NSLog(@"name=%@", formName.text); // returns correct value NSString *post = [NSString stringWithFormat:@"name=%@&", formName.text]; NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]]; NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; [request setURL:[NSURL URLWithString:@"http://path/to/file"]]; [request setHTTPMethod:@"POST"]; [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; [request setHTTPBody:postData]; NSURLResponse *response = NULL; NSError *requestError = NULL; NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&requestError]; NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; NSLog(@"%@",responseString); } 

注意:我实际上并没有使用@"http://path/to/file" 。 我已经省略了URL的隐私。

我相信它正确地连接到PHP脚本,因为我收到了我期望的响应。 问题是,如果我echo $name ,我得到一个空string。 这是脚本:

 <?php include("config.php"); // Handles DB connection $name = mysql_escape_string($_POST["name"]); mysql_query("insert into objects(name) values('$name')") or die(mysql_error()); echo $name; // returns empty string 

我期望的是Obj-C代码中的某种语法/逻辑错误,但我无法发现它。

我有一种感觉,你的请求缺less一些强制性的数据,边界和内容types,这可能会导致你的POST请求半完成。

我会告诉你我上传一个HTML文件到networking服务器,然后在下面解释。

Objective-C的

 NSString* str = formName.text; NSData* theData = [str dataUsingEncoding:NSUTF8StringEncoding]; NSString *urlString = @"http://whereyouarepostingto.com"; NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease]; [request setURL:[NSURL URLWithString:urlString]]; [request setHTTPMethod:@"POST"]; NSString *boundary = @"---------------------------14737809831466499882746641449"; NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary]; [request addValue:contentType forHTTPHeaderField: @"Content-Type"]; NSMutableData *body = [NSMutableData data]; [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithString:[NSString stringWithFormat: @"Content-Disposition: form-data; name=\"file\"; filename=\"%@.html\"\r\n", self.fileName]] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[NSData dataWithData:theData]]; [body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [request setHTTPBody:body]; NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; NSLog(@"%@", returnString); 

PHP

  <?php echo "Connection made to server"; move_uploaded_file($_FILES["file"][tmp_name], "uploads/" . $_FILES["file"]["name"]); ?> 

你需要改变一些东西,以适应你的SQL插入和删除我的文件的东西,但这是一个开始。

这是我认为你错过的部分。

 NSString *boundary = @"---------------------------14737809831466499882746641449"; NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary]; 

边界可以是一系列随机数,但必须存在。

另外,请注意构build请求的主体,特别是斜杠。 确保你逃脱任何“”。

你没有编码你所有的variables。 你应该为你的variables做URL-Encode。 编码function的示例可以在这里find:

 +(NSString *)urlEncode:(NSString *)unencodedString{ return (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)[NSHelper string:unencodedString], NULL, (CFStringRef)@"!*'();:@&=+$,/?%#[]", kCFStringEncodingUTF8 ); } 

并顺便删除POSTstring结尾的“&”字符。