contentType:' application / json'不适用于JSON字符串? [PHP]

时间:2014-09-09 08:10:50

标签: php ajax json

我是JSON的新手并尝试了一些将PHP对象传递到另一个网站的测试 当我使用 contentType时,它是如何实现的:' application / json' 字符串无法通过,
但是当我不知道默认的 contentType:' application / x-www-form-urlencoded' 时,它会通过
字符串并解码它没有问题?

或者仅在传递对象而不是字符串时才使用application / json类型? 也许我只是错过了一些基本的东西..

PHP OBJ

$objectX = (object) ['name' => 'Here we go!','luckyNum' => 6,'rndText' => 'jkfid'];  

JS

$('#btn1').on('click' , function(){
var json1 = JSON.stringify(<?php echo json_encode($objectX) ?>);    
    $.ajax({
        url : 'try.php',
        type : 'POST',
        contentType : 'application/json; charset=UTF-8',
        data : {
            json1 : json1
        }
    })
    .done (function(response) { console.log(response); })
    .fail (function(jqXHR, textStatus, errorThrown ) {  alert('[Error ' + jqXHR.status + "] "  + textStatus + " : " + errorThrown); });
});

try.php

<?php
header('Content-Type: application/json; charset=UTF8');
$json1 = json_decode($_POST["json1"]);

echo "Player is: " . $json1->name;
echo "\nHis lucky Number is: " . $json1->luckyNum;

?>

4 个答案:

答案 0 :(得分:2)

使用application/x-www-form-urlencoded时格式如下:

var1=a&var2=b&var3=c

这会自动转换为可从$_POST访问的数组。

但是,application/json是PHP不会自动解析的另一种文本格式。 可以通过读取虚拟文件php://input来访问该文本。

然而,另一点是您的请求也无效。当数据不希望关联时,您将发送一个键/值对作为正文。

在您的ajax请求中,将其更改为:

data : json1

在PHP脚本中使用:

$json1 = json_decode(file_get_contents('php://input'));

答案 1 :(得分:1)

您的POST请求不是“JSON字符串”,它是封装在application/x-www-form-urlencoded消息中的JSON字符串。

或者:

发送实际的普通JSON消息

将JSON字符串传递给data,而不是传递对象。传递一个对象将使jQuery将内容编码为表单数据。

data : json1

并更改PHP以便它不再尝试读取application/x-www-form-urlencoded数据:

$inputJSON = file_get_contents('php://input');
$input= json_decode( $inputJSON, TRUE );

停止声明您正在发送JSON

卸下:

contentType : 'application/json; charset=UTF-8',

答案 2 :(得分:1)

不要让它变得复杂,将其作为正常的POST发送:Output

<button id="btn1" type="button">Test</button>
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script type="text/javascript">
<?php
// normal php object
$objectX = (object) ['name' => 'Here we go!','luckyNum' => 6,'rndText' => 'jkfid'];
?>

var json1 = <?php echo json_encode($objectX); // encode, no need for JSON.stringify ?>;
$('#btn1').on('click' , function(){

    $.ajax({
        url : 'try.php',
        type : 'POST', // send as normal post
        data : { json1 : json1 }, // just put a normal object
        success: function(response) {
            alert(response);
            console.log(response);
        }
    });
});
</script>

然后在PHP:

<?php

if($_SERVER['REQUEST_METHOD'] == 'POST') {
    $json1 = $_POST['json1'];
    echo "Player is: " . $json1['name'];
    echo "\nHis lucky Number is: " . $json1['luckyNum'];
    exit;
}

?>

答案 3 :(得分:-1)

JSON以{开头,以}结尾。尝试发布格式正确的JSON字符串,名称之间使用逗号