2

私は見つけた同様の質問をすべて調べましたが、私の状況に適したものがすべて揃っているようには見えません。これは非常に単純なようです。

  1. POSTを使用して単純なNSURLRequestを作成し、NSJSONSerializationクラスを使用してその本体をNSDATAビルドに設定しています。
  2. そのデータをキャプチャするために、非常に単純なphpスクリプトをテストしています。

  3. json_decode(file_get_contents('php:// input')、1);を使用してPHPで値を取得すると、コードは正常に機能します。しかし、$_POSTを使用することはまったくありません

  4. セキュリティ上の理由から、サーバーはfile_get_contents()を有効にできないと言われています...そのため、別の方法を探しています。

リクエストを作成するための私のObj-Cコードは次のとおりです。

 NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.techno-mac.org/dev101/jsonForm.php"]];
[request setHTTPMethod:@"POST"];

NSMutableDictionary *jsonDict = [[NSMutableDictionary alloc] init];
[jsonDict setValue:self.userNameField.text forKey:@"userName"];
NSLog(@"Dict: %@",jsonDict);

NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsonDict options:kNilOptions error:nil];
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
NSLog(@"JSON String: %@",jsonString);

//[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];

[request setValue:@"json" forHTTPHeaderField:@"Data-Type"];
[request setValue:[NSString stringWithFormat:@"%d", [jsonData length]] forHTTPHeaderField:@"Content-Length"];
[request setHTTPBody: jsonData];
NSLog(@"jsonData: %@",jsonData);

self.postConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:true];

jsonデータにエンコードされるフィールドに「test」と入力して実行したときのコンソールログは次のとおりです。

2012-05-17 20:26:19.417 RBWebServices[95037:f803] Dict: {
userName = test;
}

2012-05-17 20:26:19.418 RBWebServices[95037:f803] JSON String: {"userName":"test"}
2012-05-17 20:26:19.418 RBWebServices[95037:f803] jsonData: <7b227573 65724e61 6d65223a   22746573 74227d>
2012-05-17 20:26:19.464 RBWebServices[95037:f803] Received response from server, resetting data length to zero
2012-05-17 20:26:19.465 RBWebServices[95037:f803] Succeeded! Received 12 bytes of data

そして、これが私の非常に単純なphpスクリプトです。

$json_post = json_decode(file_get_contents('php://input'),1);

$myArray = $json_post["userName"];
print $myArray;

およびそうでないコード(「配列」を返す)

$json_post = json_decode($_POST);
print $json_post["userName"];

これをphpに入力すると:

var_dump($_POST)

私は受け取ります:

array(0){}

最初のシナリオが機能するので、原因は$ _POSTであると思う傾向があります...またはそれから何かを取得しようとしている方法ですが、完全に空のようです。

$ _POSTを使用してこれが不可能な場合は、file_get_contentsを使用しない別の方法がありますか?

私はPHPの専門家になるにはほど遠いです...これが些細なことだと思われる場合は申し訳ありません。

あなたが持っているかもしれないどんな提案にも感謝します。

4

1 に答える 1

0

次のスクリプトを使用した簡単なテストで、キーと値のペアを使用した場合にのみ入力されるcurlことが実証されました。$_POSTそれ以外の場合は、生の入力と見なされました。

脚本:

var_dump($_POST);
var_dump(file_get_contents('php://input'));

実行済み(生データ):

curl -X POST -d "whatever" http://jason.local/dev/server.php

出力(空$_POST):

array(0) {
}

string(8) "whatever"

実行(キー/値ペア):

curl -X POST -d "data=whatever" http://jason.local/dev/server.php

出力:

array(1) {
  ["data"]=>
  string(8) "whatever"
}

string(13) "data=whatever"

これは確かにHTTP仕様またはPHP内部の一部である可能性があります。他の誰かがそれを確認できると確信しています。それでも、迅速で汚い修正は、キーと値のペアを使用することです。

于 2012-05-18T02:23:46.750 に答える