navigator.sendBeacon with application / x-www-form-urlencoded

时间:2017-08-23 18:46:10

标签: javascript ajax onbeforeunload

我正在尝试使用POSTbeforeunload事件上发送navigator.sendBeacon请求,但数据无法访问PHP $_POST。我认为这是因为在使用navigator.sendBeacon时,标头Content-Type始终设置为text/plain;charset=UTF-8,但在我的情况下,因为我需要发送查询字符串,因此使用application/x-www-form-urlencoded

var amountOfApples = 0;

...

addEventListener("beforeunload", function(e) {
    navigator.sendBeacon("save.php", "key=apples&value=" + amountOfApples);
});

如何执行此操作并确保标题设置为application/x-www-form-urlencoded

2 个答案:

答案 0 :(得分:0)

阅读php://input并通过parse_str()运行。基本上是:

$MY_POST = null;
parse_str(file_get_contents('php://input'), $MY_POST);

答案 1 :(得分:0)

Beacon API使用的

Content-Type标头,取决于您传递给sendBeacon第二个参数的实例类型。

application / x-www-form-urlencoded

要发送application/x-www-form-urlencoded,请使用UrlSearchParams实例。

var params = new URLSearchParams({
   key : 'apples',
   values : amountOfApples
});
navigator.sendBeacon(anUrl, params);

multipart / form-data

要发送multipart/form-data标头,请使用FormData实例。

var params = new FormData();
params.append('key', 'apples');
params.append('value', amountOfApples);
navigator.sendBeacon(anUrl, params);

application / json

要发送application/json标头,请使用Blob并设置其类型。

var data = {
   key : 'apples',
   values : amountOfApples
};

var params = new Blob(
    [JSON.stringify(data)], 
    {type : 'application/json'}
);
navigator.sendBeacon(anUrl, params);