5

POSTメッセージを機能させようとしています。このようなことを説明している投稿をいくつか見ましたが、まだ機能しません。以下は私の目的のCコードです:

NSString * urlString = @"http://magicthegatheringdatabase.com/test.php";
NSURL *aUrl = [NSURL URLWithString: urlString];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:aUrl
                                                       cachePolicy:NSURLRequestUseProtocolCachePolicy
                                                   timeoutInterval:60.0];

NSString *postString = [NSString stringWithFormat:@"tes1=%@&test2=%@",
                        [@"hello" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],
                        [@"world" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
NSData * postBody = [postString dataUsingEncoding:NSUTF8StringEncoding];
[request setHTTPBody: postBody];

[request addValue:@"application/x-www-form-urlencoded; charset=utf-8" forHTTPHeaderField:@"Content-Type"];

NSString *postLength = [NSString stringWithFormat:@"%d", postBody.length];
[request addValue: postLength forHTTPHeaderField:@"Content-Length"];

[request setHTTPMethod:@"POST"];

NSError * error = nil;
NSData *returnData = [NSURLConnection sendSynchronousRequest: request
                                           returningResponse: nil
                                                       error: &error];
NSLog(@"%p, %@", error, error.localizedDescription);

NSString * returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];
NSLog(@"Result: %@", returnString);

そして、ここに私のPHPがあります:

<?php
  print_r($_REQUEST);
  print_r($_POST);
  print_r($_GET);

  echo file_get_contents( 'php://input' );
?>

コードを実行すると、次のログが記録されます。

2012-12-19 09:24:09.061 MTG Deck Builder[7921:570f] 0x0, (null)
2012-12-19 09:24:09.062 MTG Deck Builder[7921:570f] 結果: 配列
(
)
配列
(
)
配列
(
)

URL に直接移動して追加すると?test1=hello&test2=world(明らかに POST ではなく GET を使用)、次のようになります。

配列
(
    [test1] => こんにちは
    [test2] => 世界
    [phpbb3_5e63r_u] => 1
    [phpbb3_5e63r_k] =>
    [phpbb3_5e63r_sid] => 7ff37e188aa8e0ab57fae6a52f0d1f7b
    [__utma] => 86369156.392372889.1349352986.1352901458.1353328580.11
    [__utmz] => 86369156.1351935106.8.2.utmcsr=hankinsoft.com|utmccn=(紹介)|utmcmd=referral|utmcct=/website/forum/10-mtg-magic-the-gathering-trading-card-game-tcg- da/634-new-forum.html
    [style_cookie] => null
)
配列
(
)
配列
(
    [test1] => こんにちは
    [test2] => 世界
)

したがって、PHP が get/request を適切にログに記録していることはわかっていますが、objective-c コードを介した POST が機能しない理由はわかりません。私は愚かなことを見落としていると確信しています。私が欠けているものについて何か提案はありますか?

4

3 に答える 3

3

これは、NSURLConnectionリダイレクトが適切に処理されていないためです。

POSTリクエストを URLに送信http://magicthegatheringdatabase.com/test.phpすると、サーバーは で応答し301 Moved Permanently、 にリダイレクトしhttp://www.magicthegatheringdatabase.com/test.phpます。

同じリクエストを新しい URL に送信する代わりにNSURLConnection、新しいリクエストを作成しGET、元のリクエストのHTTPBody. これは、HTTP 仕様により、ユーザーからの確認以外のリクエストの自動リダイレクトが禁止さHEADれているためです。GETメソッドを に変更するのGETは誤りですが、少なくとも安全なメソッドであり、HTTP リソースに害を及ぼすことはありません。

この問題は、次の 2 つのオプションで解決できます。

  1. リクエストの URL を に変更するだけですhttp://www.magicthegatheringdatabase.com/test.php

  2. または、この質問への回答で説明されているように、リダイレクトを適切に処理するためにNSURLConnection、デリゲートを使用して のインスタンスを作成し、を実装することもできます。これはリダイレクトが変更されても機能しますが、応答を待機し、オブジェクトを作成し、バイトが来るたびに追加し、すべてを非同期で処理する必要があるため、より多くのコードを記述する必要があります( Apple Developer Documentationを参照)。ただし、タスクを非同期で実行することは常に良い考えです。必要に応じてタスクをキャンセルでき、スレッドを長時間ブロックするリスクはありません (メインスレッドにいる場合、1 秒より長いものは長い時間です) )。connection:willSendRequest:redirectResponse:NSMutableData

于 2012-12-19T20:22:51.497 に答える
2

次のものを追加してみてください。

[request addValue:@"application/x-www-form-urlencoded; charset=utf-8" forHTTPHeaderField:@"Content-Type"];

于 2012-12-19T13:08:02.363 に答える
1

変化する:

 NSString *postString = [NSString stringWithFormat:@"tes1=%@&test2=%@", 
                           [@"hello" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],
                           [@"world" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

今すぐ追加

  [request setHTTPMethod:@"POST"];
于 2012-12-19T13:03:24.570 に答える