我正在尝试使用WordPress中的XMLHttpRequest发送JSON数据:
$jsonString = file_get_contents(storage_path() . "/jay/Configuration/TypoScript/Constants/Settings.ts");
当我将标头设置为JSON document.getElementById("user_vote").addEventListener("click", function(event) {
event.preventDefault();
//action to handle in WP add_action("wp_ajax_my_user_vote", "my_user_vote");
let action = "my_user_vote";
let url = myAjax.ajaxurl;
let data = {
action: action,
post_id : this.dataset.post_id,
nonce: this.dataset.nonce
};
let json = JSON.stringify(data);
let xhr = new XMLHttpRequest();
xhr.open("POST", url, true);
xhr.setRequestHeader('Content-type', 'application/json; charset=utf-8');
xhr.onreadystatechange = function() {
if (this.readyState != 4) return;
document.getElementById('response').innerHTML = this.responseText;
}
xhr.send(json);
});
时,我得到的是空xhr.setRequestHeader('Content-type', 'application/json; charset=utf-8');
变量。看来WP无法理解此标头,或者我做错了。
我看到了这个post。当我在$_REQUEST
中检查$input = file_get_contents('php://input');
时,它返回我的数据字符串:admin-ajax.php
但{"action":"my_user_vote","post_id":"1","nonce":"2b2eaea6d3"}
变量为空。
使用此标头$_REQUEST
都工作良好,但我想发送JSON。
为什么要使用jQuery.ajax,我可以简单地将JSON数据发送到xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
并不能使用javascript做到呢?
添加1
这是在WP中发送AJAX的正确方法:
admin-ajax.php
您的意思是在这种情况下jQuery不会将标头设置为jQuery.ajax({
type : "post",
dataType : "json",
url : myAjax.ajaxurl,
data : {action: "my_user_vote", post_id : post_id, nonce: nonce},
success: function(response) {
//do stuff
}
})
,而是将标头设置为application/json
,所有此请求都将生成为带有标准标头和{{ 1}}转换为字符串,类似application/x-www-form-urlencoded
?
我不需要将标头设置为XMLHttpRequest
并将简单的xhr.send(data)
请求与标准标头一起使用吗?
答案 0 :(得分:2)
PHP 不会自动解码JSON并将其放在-not
或$_POST
中。
您已经发现,您需要从STDIN读取原始HTTP请求正文,并对其进行显式解析以读取PHP中的JSON格式的请求。
您的问题似乎是对jQuery的误解。可能当您使用jQuery时,您正在执行以下操作:
$_REQUEST
执行此操作时,jQuery将对var data = { some: "object" };
jQuery.ajax({
url: "foo",
data: data,
method: "POST"
});
对象进行URL编码。它将不用JSON编码。
请记住,虽然JSON语法受JavaScript文字语法的启发,但是在JavaScript源代码中包含对象文字的结果将为您提供一个对象,而不是JSON字符串。
如果您使用jQuery发出JSON格式的请求,则需要这样的内容:
data
要使用XHR将对象编码为表单数据,您需要以下内容:
jQuery.ajax({
url: "foo",
data: JSON.stringify(data),
contentType: "application/json; charset=utf-8",
method: "POST"
});