无法通过AJAX请求从Java/Spring REST端点获取JSON的问题排查
问题原因及解决方案
这问题我之前踩过坑!核心原因是你混用了JSON和JSONP两种响应格式,导致jQuery的JSONP解析逻辑找不到预期的回调函数——哪怕HTTP状态码是200,还是会触发错误回调。
为什么会报错?
你前端设置了dataType: "jsonp",这相当于告诉jQuery:我要按JSONP规则处理响应。而JSONP的本质是靠动态创建<script>标签绕过跨域限制,它要求后端返回的不是纯JSON字符串,而是一个回调函数的调用语句,格式大概是这样:
jQuery1113010493236335514322_1517318340103({"msg":"success"})
但你的后端返回的是纯JSON {"msg":"success"},完全没有包裹在jQuery自动生成的回调函数里。所以jQuery加载这个响应后,找不到要执行的回调函数,就抛出了xxx was not called的错误。
两种解决方案
方案一:改用普通JSON + 开启CORS(推荐)
JSONP是比较老旧的跨域方案,局限性大(只支持GET请求、安全性低),现在更推荐用CORS解决跨域问题,然后用普通JSON格式交互。
后端开启CORS:
在Spring Boot中,你可以直接在Controller或方法上添加@CrossOrigin注解:@RestController @CrossOrigin // 全局允许跨域,也可以只加在单个方法上 public class YourController { @RequestMapping(value = "/test", method = RequestMethod.GET, produces="application/json") public String getReitByDateRangeAdDoGeographic(){ return "{\"msg\":\"success\"}"; } }前端修改dataType:
把dataType: "jsonp"改成dataType: "json"(甚至可以去掉,jQuery会自动识别响应格式):$.ajax({ dataType: "json", url: URL, success: function(data) { console.log("SUCCESS"); console.log(data.msg); // 可以直接访问返回的字段 }, error: function (a,b, result) { console.log("ERROR"); console.log(a); console.log(b); console.log(result); } });
方案二:后端适配JSONP格式(不推荐,仅兼容老旧场景)
如果一定要用JSONP,需要后端接收前端传过来的callback参数,把JSON数据包裹在回调函数里返回:
@RequestMapping(value = "/test", method = RequestMethod.GET) public String getReitByDateRangeAdDoGeographic(@RequestParam(value = "callback", required = false) String callback){ String json = "{\"msg\":\"success\"}"; // 如果有callback参数,就返回JSONP格式;否则返回普通JSON if(callback != null){ return callback + "(" + json + ")"; } return json; }
前端保持dataType: "jsonp"即可,jQuery会自动在请求URL里加上callback=xxx参数。
内容的提问来源于stack exchange,提问作者user7052012
相关产品推荐
相关产品推荐

