使用NODEJS實現JSONP的實例

JSONP與JSON只有一字之差,咱們在使用Jquery的Ajax調用的時候也是使用相同的方法來調用,二者的區別幾乎只在於使用的dataType這個屬性的不一樣。可是實際上JSON和JSONP是徹底不一樣的兩個東西,JSON是一個數據格式,就好像XML同樣,JSONP適用於解決遠程調用本地回調函數跨域的問題。html

當指定dataType爲JSON的時候,回調函數的參數(success:function(data)裏面的data)是一個JSON格式的數據字符串,相似於「{‘NAME’:'ckym','Age':27}」,在success中定義處理這個數據的邏輯。jquery

當指定dataType爲JSONP的時候,回調函數的定義是同樣的,可是服務器返回的就不是一個JSON的數據了,而是一個調用的方法字符串,例如「showMessage(JSON.stringify(data))」,此時,ajax就會調用success後面定義的方法來代替這個這個showMessage方法。ajax

因此無論是JSON仍是JSONP,處理代碼的邏輯都定義在success這個回調函數中。express

下面是一個實例程序(基於NodeJS,須要安裝Express,固然其餘的開發語言也是同樣的道理)。json

Server端:跨域

var express=require('express');
var app=express();

app.get('/',function(req,res,err){
    var data=[{"Name":'ckym',"password":'12345678'}];//數據格式必須使用雙引號,不然會報錯
    
    var result="showMessage("+JSON.stringify(data)+")";
    
    res.end(result);
})

app.listen('8001',function(err){
    if(err){
        console.log(err);
    }else{
        console.log("客戶端在8001端口監聽成功!");
    }
})服務器

Client端:app

var express=require('express');
var path=require('path');
var app=express();

app.get('/',(req,res,err)=>{
    res.sendFile(path.join(__dirname,'Main.html'));//注意sendFile必須使用絕對路徑,不然程序會報錯
})

app.use(express.static('Scripts'));//路徑不區分大小寫

app.listen(8000,(err)=>{
    if(err){
        console.log(err);
    }else{
        console.log('端口8000監聽成功!');
    }
})函數

Html頁面(Main.html):測試

<!DOCTYPE html><html>    <head>        <meta charset='utf-8'/>        <title>JSONP測試</title>        <script src='/JS/jquery-3.2.1.min.js'></script>    </head>    <body>        <h2>這是一個NodeJs的JSONP測試項目</h2>        <script>        $(document).ready(function(){            $.ajax({                url:'http://localhost:8001/',                dataType:'jsonp',//此處若是使用json的話就會出現error的報錯,是由於XMLHttpRequest不支持跨域訪問                //因此會報錯,爲解決這個問題,須要使用JSONP的數據類型,script等元素節點的src屬性是自帶跨域訪問的                //功能,因此也能用來解決跨域問題                type:'get',//JSONP只支持get方法請求                jsonp:'callback',                jsonpCallback:"showMessage",//定義jsonp執行的回調函數的名稱--與服務端返回的數據中的方法的名稱相同                success:function(data){                    alert("這是一個跨域調用方法的數據:"+JSON.stringify(data));                },                error:function(err){                alert("ajax出現錯誤,請聯繫管理員!:"+JSON.stringify(err));                }            })        })        </script>    </body></html>

相關文章
相關標籤/搜索