如何通过POST方法使用XMLHttpRequest?

时间:2019-07-01 15:54:11

标签: php xmlhttprequest http-post php-5.6

我有一个中央PHP脚本,用于处理来自页面的许多请求,使用JavaScript的XMLHttpRequest()调用以及GET方法。我的服务器PHP当前为5.6,是的,我正在避免同步调用。

一切正常,但是在某些情况下,我不希望该请求不保留在浏览器历史记录中,甚至不显示在URL中。因此,基于此调用中的MDN reference,我认为我可以简单地切换到POST方法,保留现有请求(例如“ http://myscript.php?cmd=dothis&data=somedata”)。然后我要做的就是将一些代码添加到我的PHP脚本中,这样我就可以以任何一种方式收集传递的数据...

if  ($_SERVER['REQUEST_METHOD'] === 'GET') {
    if(isset($_GET['cmd'])) $cmd = $_GET['cmd'];
    if(isset($_GET['data'])) $data =  $_GET['data'];  
    }

if  ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if(isset($_POST['cmd'])) $cmd = $_POST['cmd'];
    if(isset($_POST['data'])) $data =  $_POST['data'];  
    }

显然我错了。我发现的是...

  1. 当我切换到POST方法时,$ _ POST数组中的脚本看不到此示例中显示的任何变量。
  2. 从$ _POST数组切换到$ _REQUEST数组工作正常(例如:“ if(isset($ _ REQUEST ['cmd']))$ cmd = $ _REQUEST ['cmd']);“ ),但是...
  3. 仅通过POST方法发出XMLHttpRequest()调用的行为就会在我的日志中导致如下错误:
  

不建议使用PHP:自动填充$ HTTP_RAW_POST_DATA为   已过时,将在以后的版本中删除。为了避免这种情况   警告在php.ini中将“ always_populate_raw_post_data”设置为“ -1”并使用   改为php:// input流。在第0行的“未知”中

很显然,这是一个死胡同。尽我所能研究这里发生的事情,在PHP manual reference to POST中,我首先读到了这篇文章……

  

$ _ POST $ HTTP_POST_VARS [不建议使用]

因此,如果我理解正确,我只能使用$ _REQUEST数组获取POST变量的原因是,我的请求仍然像我仍在使用GET一样进行格式化,(显然吗?) 。因此,“哄骗”它起作用只是将问题转移到未来。

偶然地,通过在服务器上调用phpinfo.php可以看到,尽管在日志中看到了错误,但“ always_populate_raw_post_data”确实已经设置为“ -1”。因此,我发现所有建议“仅”在PHP.INI文件中进行此设置的“解决方案”都无济于事。

即使它“隐藏”了错误,这样做对我也不重要。我的说法是否正确?即使使用POST方法时,即使我只是从$ _REQUEST数组中收集通过的PHP变量,并找出抑制LOG中“已弃用”警告的方法,整个方案仍然会崩溃(并使我的POST请求失败),那一天我终于迁移到PHP 7.x。?

我很抱歉在这里问,但是我确实尝试搜索我可以找到的每个引用,这些引用都使用POST方法执行XMLHttpRequest,以及我在日志中获得的已弃用的错误消息。那里有太多过时的信息,我找不到关于如何正确更改或重新格式化XMLHttpRequests的清晰讨论,以便可以使用POST方法。实际上,我什至无法肯定地确定在PHP.5.6之外是否可以这样做。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

PHP在将浏览器将HTML格式的数据放置在$_GET属性设置为GET或POST的默认位置之后,错误地命名了$_POSTmethod

$_GET从查询字符串中获取数据,即使请求方法是POST。

请求正文由您传递给send的参数确定。您放入查询字符串中的数据仍保留在查询字符串中。

const url = 'http://myscript.php'
const form_data = new FormData();
form_data.append("cmd", "dothis");
form_data.append("data", "somedata");
cost xhr = new XMLHttpRequest;
xhr.open("POST", url);
xhr.addEventListener('load', function () { console.log(this.response); });
xhr.send(form_data);