JSONP詳解

  • 同源策略

    • 限制:Ajax
      • 向別的網站發Ajax請求,在拿回數據的時候,已經在拿回來的時候,發送給瀏覽器,瀏覽器阻止了,請求已經發送給服務器並執行了
    • 不限制:有src屬性的,如script 標籤
  • 但是在開發過程中有這樣的需求:向其他網站發送Http請求。

    • 瀏覽器直接發送請求【考慮同源】
    • 瀏覽器-> 服務端 -> 發送請求
  • 瀏覽器直接發送請求【考慮同源】

# jsonp.html

<body>

<input type="button" value="獲取用戶列表" onclick="getUsers();" />
<ul id="user_lsit"></ul>

<script>
// Ajax 請求有限制,同源策略
    /*
    function getUsers() {
        var xhr = new XMLHttpRequest();
        xhr.onreadystatechange = function () {
            if(xhr.readyState == 4){
                var content = xhr.responseText;
                console.log(content)
            }
        };
        xhr.open('GET','http://www.s4.com:8001/users/?callback=bbb');
        xhr.send();
    }
    function bbb(arg) {
        console.log(arg)

    }
    */


// jsonp
    function getUsers() {
        var tag = document.createElement('script');
        tag.src = 'http://www.s4.com:8001/users/?callback=bbb';
        document.head.appendChild(tag);

    }
    function bbb(arg) {
        console.log(arg)

    }

</script>

</body>
# 請求目標網站
# veiws.py

def users(request):
    funcname = request.GET.get('callback')
    print('請求來了')
    user_list = [
        'summer','spring','autumn'
    ]
    user_list_str = json.dumps(user_list)
    temp = '%s(%s)' % (funcname,user_list_str)

    print(temp)
    return HttpResponse(temp)






  • jsonp要求:

  • 用jQuery Ajax 來發送請求
<body>

<input type="button" value="獲取用戶列表" onclick="getUsers();" />
<ul id="user_lsit"></ul>
<script src="/static/jquery-3.2.1.js"></script>
<script>
    function getUsers() {
        $.ajax({
            url: 'http://www.s4.com:8001/users/',
            type: 'GET',
            // 改用jsonp去發,改下面幾個參數,原用XMLHttpRequest。
            dataType: 'JSONP',
            jsonp: 'callback',
            jsonpCallback: 'bbb'

        })

    }
    function bbb(arg) {
        console.log(arg)

    }


</script>

</body>

  • 使用
使用:
    1. 自己寫動態創建script
        function getUsers(){
            var tag = document.createElement('script');
            tag.src = "http://www.s4.com:8001/users/?callback=bbb";
            document.head.appendChild(tag);
         }
    2. jQuery
        $.ajax({
            url: 'http://www.s4.com:8001/users/',
            type: 'GET',
            dataType: 'JSONP',
            jsonp: 'funcname',
            jsonpCallback: 'bbb'
        })

    其他:
    - 只能發GET請求
    - 約定,客戶端服務端制定好規則

    JSONP是一種技術,一種方式,目的解決跨域問題
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章