【发布时间】:2019-08-04 03:55:23
【问题描述】:
我正在尝试在 WordPress 中使用 XMLHttpRequest 发送 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);
});
当我将标头设置为 JSON xhr.setRequestHeader('Content-type', 'application/json; charset=utf-8'); 时,$_REQUEST 变量为空。似乎 WP 不理解这个标题或者我做错了什么。
我看到了这个post。当我在admin-ajax.php 中检查$input = file_get_contents('php://input'); 时,它返回我的数据字符串:{"action":"my_user_vote","post_id":"1","nonce":"2b2eaea6d3"} 但$_REQUEST 变量为空。
使用此标头 xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); 一切正常,但我想发送 JSON。
为什么使用 jQuery.ajax 我可以简单地将 JSON 数据发送到 admin-ajax.php 而不能使用 javascript?
加1
以下是在 WP 中发送 AJAX 的正确方法:
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
}
})
您的意思是,在这种情况下,jQuery 不会将标头设置为application/json,而是将它们设置为application/x-www-form-urlencoded,并且所有这些请求都将生成为带有标准标头的简单XMLHttpRequest,并将xhr.send(data) 转换为字符串,一些东西像这样"action=my_user_vote&post_id=1&nonce=2b2eaea6d3"?
而且我不需要将标头设置为 application/json 并使用带有标准标头的简单 POST 请求?
【问题讨论】:
-
如果您将 jQuery ajax
data属性设置为像您这样的对象,jQuery 会将其转换为普通表单参数。 -
@Pointy OP 不想使用 ajax。此外,从内容类型标头中删除“charset=utf-8”,它不应该包含在其中。
-
@garryman — OP 询问为什么 jQuery 和 XHR 似乎有不同的行为。该评论完全相关。
-
@garryman — 在
charset标头中包含charset参数没有任何问题。
标签: javascript json wordpress xmlhttprequest