web-dev-qa-db-ja.com

iPhone送信POST NSURLConnection付き

POST data to a PHP script with NSURLConnection。の送信に問題があります。これは私のコードです:

_    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);から取得する出力は、「theData」ではなく「<>」になりました。

たぶんどこか足りないミスが見つかるかもしれませんが?何か案は?

21
per_pilot

あなたのデータは間違っています。 PHPの$ _POST配列でデータが見つかると予想される場合は、次のようになります。

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

XMLデータを送信する場合は、別のHTTPコンテンツタイプを設定する必要があります。例えば。あなたは設定するかもしれません

application/xml; charset=utf-8

HTTPコンテンツタイプを設定しない場合、デフォルトのタイプ

application/x-www-form-urlencoded

使用されます。また、このタイプは、POSTデータがGETリクエストと同じ形式であると想定しています。

ただし、application/xmlなどの別のHTTPコンテンツタイプを設定した場合、このデータはPHPの$ _POST配列に追加されません。入力ストリームからrawを読み取る必要があります。

これを試して:

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のapplication/x-www-form-urlencodedでない場合にのみ機能することに注意してください。application/ x-www-form-urlencodedの場合PHP自体がすべての投稿データを読み取り、デコードして(キー/値のペアに分割)、最後に$ _POST配列に追加します。

39
Mecki

ええと...乾杯。しかし、responseDataの出力は「<48656c6c 6f326f72 6c64>」のようになります。NS@を%​​@で出力しませんか? – per_pilot 2010年1月15日13:57

これは、「バイト」値を表示しているため、実際のメッセージを表示するには、それをNSStringに渡す必要があります。

NSString *string = [[NSString alloc] initWithData:responseData encoding:NSASCIIStringEncoding];
NSLog(@"responseData: %@", string);
8
Alex
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];
7
Mehul Joisar

POSTデータと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];

2
Aaron

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を設定します。

2
dip