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 回答