今天使用jQuery 的Ajax函数进行异步的post数据提交,后台使用Laravel 5.5无法正常获取到数据
Ajax 部分代码:
var submit_data = {name : 'logo', age : '25'};
$.ajax({
url : "..", //(实际的path)
type : "post",
dataType : "json",
data : submit_data,
success : function(data){
console.log(data);
},
cache : false,
});
Laravel controller 里面获取:
public function command(Request $request){
$input = $request->input();//获取输入的数据
dd($input);
}
使用Chrome浏览器,按F12 -> Network 找到相应的回复文件,点击查看,在preview里面看到并没有数据,是[ ]状态。
解决:
接着上面的步骤,查看该回复文件的Headers部分,找到Request Headers, 找到Content-Type ,
Content-Type: application/x-www-modules-urlencoded; charset=UTF-8
我的jQuery版本是3.1.0, 其Ajax默认的ContentType是application/json, 而使用PHP的话无法通过$_REQUEST、$_POST等全局变量获取post的数据,有两个解决办法:
1. 修改jQuery 的Ajax对象的contentType属性,在$.ajax({ })里面加上:
contentType : "application/x-www-form-urlencoded; charset=UTF-8",
2.使用PHP获取原本的post数据:
在PHP 7以前的版本,使用$GLOBALS['HTTP_RAW_POST_DATA'], PHP 7以后的版本使用php://input
PHP 7 :
$rawInput = file_get_contents("php://input");//获取post的字符串
$input = json_decode($rawInput);
dd($input);
由于post的数据必须是字符串,在jQuery Ajax 里面确保数据是字符串,可把json格式序列号, 在$.ajax({ }) 里面修改data属性:
data : JSON.stringify(submit_data),
关于Content-Type 的更多知识可参考这篇博文。
文中如有疏漏之处,敬请指正,谢谢!