在没有jQuery.ajax的情况下在WordPress中以XMLHttpRequest发送JSON的正确方法

时间:2019-03-13 12:57:04

标签: javascript json wordpress xmlhttprequest

我正在尝试使用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)请求与标准标头一起使用吗?

1 个答案:

答案 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"
});