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");
问题解决。
怀疑是后台出了问题,然后就查阅一下文档:
原来是后台使用_POST这种是针对 "user_name="+ userName +"&user_age="+ userAge +"&user_sex="+ userSex 即普通表单写法。直接获取键值对; 其实正确的姿势应该是: 前端: contentType:'application/json; 后端: header('Content-type: application/json');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方法请求也是犯过类似的错误哦。
所以,经验害死人哦。。。

附上参考链接:
https://www.cnblogs.com/CyLee/p/7644380.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,026评论 19 139
  • # Ajax标签(空格分隔): 笔记整理---[TOC]### 从输入网址开始:- 在学习ajax之前,你应该先了...
    V8阅读 289评论 1 0
  • 大家好,我是IT修真院深圳分院第3期的学员,一枚正直纯洁善良的前端程序员,今天给大家分享一下,修真院官网前端工程师...
    大大头大阅读 7,867评论 1 72
  • AJAX 原生js操作ajax 1.创建XMLHttpRequest对象 var xhr = new XMLHtt...
    碧玉含香阅读 3,306评论 0 7
  •   2005 年,Jesse James Garrett 发表了一篇在线文章,题为“Ajax: A new App...
    霜天晓阅读 903评论 0 1