繁体   English   中英

iPhone用NSURLConnection发送POST

[英]iPhone sending POST with NSURLConnection

我在使用NSURLConnection将POST数据发送到PHP脚本时遇到了一些问题。 这是我的代码:

    const char *bytes = [[NSString stringWithFormat:@"<?xml version=\"1.0\"?>\n<mydata>%@</mydata>", data] UTF8String];

    NSURL *url = [NSURL URLWithString:@"http://myurl.com/script.php"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    [request setHTTPMethod:@"POST"];
    [request setHTTPBody:[NSData dataWithBytes:bytes length:strlen(bytes)]];

    NSURLResponse *response;
    NSError *err;
    NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err];
    NSLog(@"responseData: %@", responseData);

而我的script.php就像这样简单:

<?php
    echo $_POST['mydata'];
?>

这在过去对我有用,但由于某种原因,我从NSLog(@"responseData: %@", responseData);获得输出NSLog(@"responseData: %@", responseData); 现在只是“<>”而不是“theData”。

可能在某处有些蹩脚的错误,但我似乎无法找到它? 有任何想法吗?

你的数据有误。 如果您希望在PHP的$ _POST数组中找到数据,它应该如下所示:

const char *bytes = "mydata=Hello%20World";

如果要发送XML数据,则需要设置不同的HTTP内容类型。 你可能会设置

application/xml; charset=utf-8

如果未设置HTTP内容类型,则为默认类型

application/x-www-form-urlencoded

将会被使用。 此类型要求POST数据具有与GET请求中相同的格式。

但是,如果您设置不同的HTTP内容类型(如application / xml),则此数据不会添加到PHP中的$ _POST数组中。 您必须从输入流中读取原始数据。

尝试这个:

NSString * str = [NSString stringWithFormat:@"<?xml version=\"1.0\"?>\n<mydata>%@</mydata>", data];
[request setHTTPMethod:@"POST"];
[request setValue:@"application/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:[str dataUsingEncoding:NSUTF8StringEncoding]];

并在服务器上尝试以下PHP:

$handle = fopen("php://input", "rb");
$http_raw_post_data = '';
while (!feof($handle)) {
    $http_raw_post_data .= fread($handle, 8192);
}
fclose($handle);

请注意,这仅适用于POST的HTTP标头不是application / x-www-form-urlencoded。 如果它是application / x-www-form-urlencoded,则PHP本身会读取所有后期数据,对其进行解码(将其拆分为键/值对),最后将其添加到$ _POST数组中。

啊耶...干杯 但是responseData输出就像“<48656c6c 6f326f72 6c64>”,你不用%@打印NSData吗? - per_pilot 2010年1月15日13:57

那是因为你显示“字节”值,你应该将它传递给NSString以查看真实的消息

NSString *string = [[NSString alloc] initWithData:responseData encoding:NSASCIIStringEncoding];
NSLog(@"responseData: %@", string);
NSString *post =[NSString stringWithFormat:@"usertype(%@),loginname(%@),password(%@)",txtuser.text,txtusername.text,txtpassword.text];
NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];

NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
[request setURL:[NSURL URLWithString:@"http://www.dacinci.com/app/tes2/login_verify.php"]];
[request setHTTPMethod:@"POST"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:postData];

NSError *error;
NSURLResponse *response;
NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
NSString *str=[[NSString alloc]initWithData:urlData encoding:NSUTF8StringEncoding];

POST数据和XML数据不一样。 您可以像发送XML数据一样发送XML数据,但PHP代码必须解析请求体中的XML。 PHP的xml_parse( http://php.net/manual/en/function.xml-parse.php )可以帮助您完成此任务。

或者,如果您更喜欢发送POST数据,请按以下方式设置请求正文:

const char *bytes = [[NSString stringWithFormat:@"mydata=%@", data] UTF8String];

如果您使用NSURLSession然后在iOS9中设置

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
[request addValue:@"application/json; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[request addValue:@"application/json" forHTTPHeaderField:@"Accept"];
request.HTTPMethod = @"POST";

在PHP中设置

//connection to the database
$dbhandle = mysql_connect($hostname, $username, $password) 
  or die("Unable to connect to MySQL");
  echo "Connected to SQL.";

//select a database to work with
$selected = mysql_select_db($db,$dbhandle) 
  or die("Could not select anons db");
  echo "Connected to DB sucess.";

mysql_query("SET NAMES 'utf8'"); 
mysql_query("SET CHARACTER SET 'utf8'");
mysql_query("SET SESSION collation_connection = 'utf8_general_ci'");

在db(MySql5)中设置utf-8_generic。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM