Ajax 里的 JSON:fetch、jQuery 和 JSONP
前端拿数据,绕不开 Ajax 和 JSON。但三个概念经常被混在一起说。
fetch:现代写法
发请求时,请求体要先 stringify,并设置 Content-Type: application/json。
收响应时,response.json() 返回一个 Promise,内部做的是读取文本再 parse。所以不能直接 response.body 当对象用。
如果要兼容老浏览器,得加 polyfill,或者退回 XMLHttpRequest。
jQuery:老项目还在用
$.ajax 里设 dataType: 'json',jQuery 会自动解析响应。
更简单的是 $.getJSON(url, data, callback),一行搞定 GET 请求加解析。
注意 dataType 和 contentType 不是一回事:前者是期望的响应类型,后者是发送的请求体类型。搞混了会出现“请求发出去了但解析失败”。
JSONP:不是 Ajax
JSONP 利用的是 <script> 标签不受同源策略限制这一点。服务端返回一段 callback({...}),浏览器当脚本执行。
它只支持 GET,没有状态码,出错也拿不到具体原因,还有安全隐患。现在有了 CORS,JSONP 基本只剩历史项目在用。
看到接口返回 jQuery123456({...}),那就是 JSONP。想取纯数据,得先把外层函数名剥掉。
跨域到底卡在哪
CORS 是服务端加响应头,Access-Control-Allow-Origin 之类。前端改不了,只能让后端配。
带 Cookie 的请求还要 credentials 和 Allow-Credentials 同时设对,少一个就失败。
排查建议
请求发出去了但数据不对,先看响应原文,别只看控制台里的对象。
把响应文本贴进 JSON 解析工具,确认是不是合法 JSON、有没有被包一层回调、有没有转义。很多“前端解析失败”,其实是后端返回了 HTML 错误页。