php响应jsonp请求

jsonp是一种跨域请求解决方案,利用了 html 可以引入远程 js 的原理,实现跨域。

说白了,就是请求远程响应一个可执行的 js ,一般格式为一个callback对象(这里是一个js,只是看起来比较特殊): callback( $json )

优点:它的兼容性更好,在更加古老的浏览器中都 可以运行,不需要XMLHttpRequest或ActiveX的支持

缺点:它只支持GET请求而不支持POST等其它类型的HTTP请求;需要后端配合

一个完整的 php 响应 jsonp 的例子:

前端使用 jquery 请求,例如:(注意,必须使用 dataType: “jsonp”)

        $.ajax({
            url: masterDomain + "/include/ajax.php?service=job&action=invitation",
            data: {
                lease_day: ms_day,
                lease_halfa: ms_halfa,
                lease_hour: ms_hour,
                place: mplace,
                name: mcontact,
                phone: mphone,
                areaCode: areaCode,
                rid: id,
                pid: mzhiwei,
                remark: remark.join("、")+(remark2 ? "、"+remark2 : ""),
            },
            type: "GET",
            dataType: "jsonp",
            success: function (data) {
              if(data.state == 100){
                showMsg('已发送邀请');
                setTimeout(function(){
                   $('.popup-yqms').hide();
                },2000);
              }else{
                showMsg(data.info);
              }
            },
            error: function(){
              showMsg('网络错误,邀请失败!');
            }
        });

实际生成的请求参数:

service: job
action: invitation
callback: jQuery183005780949854490891_1661221971605
lease_day: 2022-08-26
lease_halfa: 上午
lease_hour: 07:00
place: 1050302
name: 朱丰华
phone: 18278069613
areaCode: 86
rid: 98
pid: 256
remark: 请携带简历、请带纸笔、请携带作品、请着正装、2321
_: 1661222005709

响应数据(一个对象):

jQuery36008420933829690445_1661223447342({"state":100,"info":"邀请成功!"})

php具体实现代码:

$callback = htmlspecialchars(RemoveXSS($callback));
$callback = str_replace(')', '', str_replace('(', '', $callback));


if($callback){
	if(isset($param['dataType'])){
		if($param['dataType'] == 'html'){
			echo $return['info'];
			return;
		}
	}
	echo $callback."(".json_encode($return, JSON_UNESCAPED_UNICODE).")";
}

总结:

jsonp,通常用于跨域请求js数据(不是js脚本),但利用了html请求js脚本的方式完成。

类似于在 html 中 <script src=”远程服务器 .php”></script> 。(也能返回 js 脚本,但是返回的数据不好处理)

使用 dataType : jsonp ,就是传递一个 callback 对象名,后端把响应数据加一个 对象名( $json ) 即可。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注