如何在没有 JQUERY 的情况下从浏览器扩展程序向本地主机发出 POST 请求?
How to do a POST request from a browser extension to localhost WITHOUT JQUERY?
这类问题已经被问过很多次了,但我找不到这样的答案:
不使用jQuery
有效
jQuery 答案:,
不是 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
是字符串,time
是 undefined
(在函数中处理)或布尔值。
这就是我尝试使用的方式 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 中是多余的 - 数据已经自动解码了。
这类问题已经被问过很多次了,但我找不到这样的答案:
不使用jQuery
有效
jQuery 答案:
不是 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
是字符串,time
是 undefined
(在函数中处理)或布尔值。
这就是我尝试使用的方式 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 中是多余的 - 数据已经自动解码了。