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


contentType : 'application/json' not working for JSON String? [PHP]

我是JSON的新手,并尝试了一些将PHP对象传递到另一个站点的测试
当我使用contentType:'application/json'时,它是如何产生的?字符串无法传递,
但当我取消显示默认的内容类型:"application/x-wwww-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;
?>

使用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'));

您的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',

不要让它变得复杂,将其作为普通POST发送:输出

<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;
}
?>

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