JSONP 应用

受限于浏览器的同源安全策略, js 无法发起跨域的请求. 但是 HTML 中的 <script> 标签却可以引入跨域的文件使用. 而 JSONP 就是利用 <script> 的开源策略解决跨域问题的一种 JSON 的使用模式.

JSONP 抓取到的数据并不是 JSON, 而是任意可执行的 JS 代码.

JSONP 应用

服务器端代码

<?php
$info = ['type' => 'jsonp', 'msg' => '服务器端数据'];
$info = json_encode($info, JSON_UNESCAPED_UNICODE);
$callback = $_GET['jsonpCallback'];
// 此处相当于直接返回一句js代码: showData({type: "jsonp", msg: "服务器端数据"})
echo "{$callback}({$info})";

 

客户端代码

<script type="text/javascript">
function showData(data)
{
    console.log(data);
}
</script>
// 获取到返回的js后开始执行
<script type="text/javascript" src="http://127.0.0.1:88/JSONP/getData?jsonpCallback=showData"></script>

上面的客户端代码在执行时等于:

<script type="text/javascript">
function showData(data)
{
    console.log(data);
}
</script>
<script type="text/javascript">
showData({type: "jsonp", msg: "服务器端数据"})
</script>

JQuery 下的 JSONP 实现

客户端代码

服务器端代码不变, 客户端代码替换为:

<script type="text/javascript">
    $.ajax({
        url: 'http://127.0.0.1:88/JSONP/getData?jsonpCallback=showData',
        type: 'get',
        data: null,
        dataType: 'jsonp',
        async: false,
        success: function(data)
        {
            console.log(data);
        },
        error: function(){}
    });

    function showData(data)
    {
        console.log(data);
    }
</script>

 或是

<script type="text/javascript">
    $.ajax({
        url: 'http://127.0.0.1:88/JSONP/getData',
        type: 'get',
        data: null,
        dataType: 'jsonp',
        jsonpCallback: 'showData', // 定义回调函数名, 没有此项, jQuery将提供一个随机函数名, 后端通过$_GET['callback']获取回调函数名
        async: false,
        success: function(data)
        {
            console.log(data);
        },
        error: function(){}
    });

    function showData(data)
    {
        console.log(data);
    }
</script>

  

posted @ 2019-01-03 10:10  有风来  阅读(176)  评论(0编辑  收藏  举报