跨域请求的jsonp处理
跨域简介
跨域是指不用域之间相互请求资源,只要协议,主机名,端口号,二级域名等不同都算跨域。
浏览器认为多数由js程序发起的跨域请求都是不合法的,主要为xhr,但不由js发起的跨域是允许的,包括:img,link,script,iframe;
JSONP
- JSON with Padding 填充式 json
正常的ajax请求是不允许跨域请求的,只能用允许跨域请求的元素script代替
处理步骤
- 客户端定义一个专门处理相应的有名函数doResponse(处理函数中仅接受并处理服务端json数据,不用xhr对象,更不用判断状态)
- 服务器端php: 接受请求数据并处理,返回一条js语句echo ‘doResponse($json)’;
- 动态创建一个script元素,设置src指向服务器端的php地址
客户端js:
function doResponse(resp){ console.log(resp); for(var i in resp){ console.log(i); } } $("#btn").click(function() { /*动态追加script元素*/ $("body").append(`<script src="http://127.0.0.1/jsonp.php?callback=doResponse"><\/script>`); });
也可以采用ajax获得返回数据
$.getJSON("https://www.haohome.top/demo/jsonp.php?callback=doResponse",data=>{ console.log(data); }); $.ajax({ type:"GET", url:"https://www.haohome.top/demo/jsonp.php?callback=doResponse", success:data=>{ console.log("返回数据",data); }, dataType:"jsonp" })
服务器端php:
header("Content-type:application/javascript;charset:utf-8"); $getData=$_GET['callback']; $hello=json_encode([1,2,3,4]); echo $getData."('$hello')";