我有一个方法应该将一些数据发布到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"
。我已经省略了隐私网址。
我相信它正确地连接到PHP脚本,因为我收到了我期望的响应。问题是如果我echo
出$name
,我会得到一个空字符串。这是脚本:
<?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代码中的某种语法/逻辑错误,但我无法发现它。
答案 0 :(得分:2)
我感觉您的请求缺少一些必需的数据,边界和内容类型,这可能会导致您的POST请求完成一半。
我将向您展示我为将HTML文件上传到网络服务器所做的工作,然后在下面进行解释。
<强>目标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];
边界可以是一系列随机数,但它必须存在。
另外,在构造请求的主体时要小心,特别是斜杠。确保你逃脱任何“”。
答案 1 :(得分:1)
你没有编码所有变量的人。您应该为变量创建URL-Encode。你可以在这里找到编码功能的样本:
+(NSString *)urlEncode:(NSString *)unencodedString{
return (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,
(CFStringRef)[NSHelper string:unencodedString],
NULL,
(CFStringRef)@"!*'();:@&=+$,/?%#[]",
kCFStringEncodingUTF8 );
}
顺便删除'&amp;' POST字符串末尾的字符。