2018-12-09
最近在使用ajax的时候按照后台要求使用post请求,跨域出现了一个问题:
当使用原生方法加上请求头:
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
传输json字符串时后台返回一个空数组,
当把请求头更改为
xhr.setRequestHeader("Content-Type","application/json");
后台XHR2又出现请求头格式不对的报错;
最终解决方案:
在xhr.send('action='+jsondata);
请求头更改为
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
问题解决。
怀疑是后台出了问题,然后就查阅一下文档:
原来是后台使用data = json_decode(file_get_contents("php://input"), true);
还有一种解决方案:
前端:
contentType:'application/json;
后端:
必须使用$GLOBALS['HTTP_RAW_POST_DATA']取出来,然后再json_decode就行了
1、后端必须允许前端定义Content-Type之类的头请求。
header('Access-Control-Allow-Headers:x-requested-with,content-type');
2、php中exit的输出只允许字符串。所以要输出什么之前最好使用(string)转义一下。
3、如果使用ajax的application/json方式,记得data参数是字符串类型的。使用JSON.stringify()转换一下。
仔细想一想,我们之前公司同事刚使用post方法请求也是犯过类似的错误哦。
所以,经验害死人哦。。。