json从js到php - 无法打开流:http请求失败

时间:2014-11-11 16:36:44

标签: javascript php json

我正在尝试将一些json数据从js发送到php,并通过REST将其传递给mongo。

以下输出json字符串(如果我只是将它作为字符串放在PHP文件中,以后工作正常,请参阅下面的代码段。)

JS发送json:

var s = JSON.stringify(send); //s contains previous data in arrays, etc

ic(s);

function ic(s){
    var ajaxUrl = './iM.php';
    $.getJSON(ajaxUrl, 
    {da: s}, 
    function(data) {
       console.log (data);
});
}

在iM.php中:

$s = $_GET["da"]; // <-- doesn't work
//$s = '{"r":"pax","c":1,"w":["kiwi","melon"],"g":["cat","dog"]}'; //<-- works fine
$opts = array(
    "http" => array(
        "method"  => "POST",
        "header"  => "Content-type: application/json",
        "content" => $s,
    ),
);

$context = stream_context_create($opts);

$result = file_get_contents("https://api.mongolab.com/api/1/databases/$db/collections/$collection?apiKey=$key", false, $context);

var_dump($result); // Dumps the response document

在firefox调试器中,我可以看到文件实际被调用,但是没有添加数据。

创建了error_log文件: 无法打开流:HTTP请求失败! HTTP / 1.1 400错误请求

我也在php中试过urlencode($ s),仍然无法正常工作。 $ db,$ collection和$ key在php中是不确定的,没问题。

我错过了什么?

1 个答案:

答案 0 :(得分:0)

基本上JSON.stringify(send)函数的设计方式使它能让你的json成为你所得到的。

JSON.stringify(value[, replacer[, space]])

您应该正确使用此功能。阅读文档了解更多。 如果你有输入值作为JS数组或JS对象,它基本上是有用的 可以转换成单个字符串。

你得到的是'{/“r /”:/“pax /”,/“c /”:1,如果你试图将一个已经是字符串格式的json字符串化的话。

这些:

var s = ['1','2','3'];
and 
var s = "['1','2','3']";

完全不同。

如果您要发送数组或json对象,您甚至可以直接发送它 使用上面的代码。 例如:

send = {"r":"pax","c":1,"w":["kiwi","melon"],"g":["cat","dog"]};
ic(send);

function ic(s){
    var ajaxUrl = 'im.php';
    $.getJSON(ajaxUrl, 
    {da: s}, 
    function(data) {
       console.log (data);
});
}

确保正确处理php端的数组。 如果你想要返回json,请执行:

$s = $_GET["da"]; //this will be array.
var jsonObject = json_encode($s);

或者您可以在那里进行字符串化然后提供。

或者只是发送字符串然后使用json_decode在php中创建json