21

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);今から得られる出力は「theData」ではなく「<>」です。

おそらくどこかで間違っているのでしょうが、見つけられないのでしょうか?何か案は?

4

5 に答える 5

39

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

于 2010-01-15T13:33:03.547 に答える
7

あ、そうか…乾杯。しかし、responseData の出力は "<48656c6c 6f326f72 6c64>" のようになります。%@ で NSData を出力していませんか? — per_pilot 15 1月. 102010-01-15 13:57:00

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

NSString *string = [[NSString alloc] initWithData:responseData encoding:NSASCIIStringEncoding];
NSLog(@"responseData: %@", string);
于 2011-11-16T19:53:06.757 に答える
2

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];

于 2010-01-15T14:03:03.440 に答える