如何在没有 JQUERY 的情况下从浏览器扩展程序向本地主机发出 POST 请求?

How to do a POST request from a browser extension to localhost WITHOUT JQUERY?

这类问题已经被问过很多次了,但我找不到这样的答案:

  1. 不使用jQuery

  2. 有效

jQuery 答案:,

不是 jQuery,但不起作用:

"Drop that and try jQuery"

首先,我正在尝试使用浏览器扩展来做到这一点。

这是我的(唯一的)JS 文件:

// ...

function log(info,time){
    if(time===undefined)time=true;
    var xhttp=new XMLHttpRequest();
    xhttp.onreadystatechange=function(){
        if(this.readyState===4&&this.status===200){
            console.log(this.responseText);
        }
    }
    info="http://localhost/log.php?log_item="+encodeURIComponent(info)+"&time="+(time?"true":"false");
    xhttp.open("GET",info,true);
    xhttp.send(null);
}

// ...

当然,这个用的是GET。 info 是字符串,timeundefined(在函数中处理)或布尔值。

这就是我尝试使用的方式 POST:

function log(info,time){
    if(time===undefined)time=true;
    var xhttp=new XMLHttpRequest();
    xhttp.onreadystatechange=function(){
        if(this.readyState===4&&this.status===200){
            console.log(this.responseText);
        }
    }
    info="log_item="+encodeURIComponent(info)+"&time="+(time?"true":"false");
    xhttp.open("POST","http://localhost/log.php",true);
    xhttp.send(JSON.stringify({
        "log_item":info,
        "time":time?"true":"false"
    }));
}

取自

这是我的 log.php:

<?php
header("Access-Control-Allow-Origin: *");
if(isset($_POST["log_item"],$_POST["time"])){
    $_POST["log_item"]=urldecode($_POST["log_item"]);
    if($_POST["time"]==="true")file_put_contents("log.html","<li><b>[".date('l, F j, Y \a\t h:i:s A')."]: </b>$_POST[log_item]</li>\n",FILE_APPEND);
    else file_put_contents("log.html",$_POST["log_item"]."\n",FILE_APPEND);
    echo $_POST["time"];
}

不过您不必为此担心。它只是记录到 log.html.

我找不到有效的解决方案(或者我没有正确使用有效的解决方案)。同样 你的答案不应该包括 jQuery.

你在那里做什么(在 JSON object 内发送 URL-encoded 数据)没有意义。您任意混合两种不同的数据格式。您还没有设置 content-type header,这是必需的,否则它默认为 plain-text/HTML,服务器不会将其填充到 $_POST 变量中。

这个版本可以工作:

function log(info,time){
    if(time===undefined)time=true;
    var xhttp=new XMLHttpRequest();
    xhttp.onreadystatechange=function(){
        if(this.readyState===4&&this.status===200){
            console.log(this.responseText);
        }
    }
    info="log_item="+encodeURIComponent(info)+"&time="+(time?"true":"false");
    
    xhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); //set content type
    xhttp.open("POST","http://localhost/log.php",true);
    xhttp.send(info); //just send the URL-encoded data without wrapping it in JSON
}

P.S。 $_POST["log_item"]=urldecode($_POST["log_item"]); 在 PHP 中是多余的 - 数据已经自动解码了。