jsonp 演示實例 —— 基於node

来源:http://www.cnblogs.com/yzg1/archive/2016/09/22/5897024.html
-Advertisement-
Play Games

序 1. 同源策略 是瀏覽器處於安全考慮,為通信設置了“相同的域、相同的埠、相同的協議”這一限制。這讓我們的ajax請求存在跨域無許可權訪問的問題。 2. 同時我們發現script標簽引入腳本的行為並不受同源策略的限制,但是script引入的文件會被立即執行,如果其內容不符合js語法,則會報錯; 操 ...


  1. 同源策略是瀏覽器處於安全考慮,為通信設置了“相同的域、相同的埠、相同的協議”這一限制。這讓我們的ajax請求存在跨域無許可權訪問的問題。

  2. 同時我們發現script標簽引入腳本的行為並不受同源策略的限制,但是script引入的文件會被立即執行,如果其內容不符合js語法,則會報錯;

操作原理

針對以上情況,誕生了jsonp:

  1. 利用script標簽的src屬性來請求介面,並向介面傳遞一個回調函數(剋服了同源問題)

  2. 介面將數據以回調函數參數的形式同回調函數一同傳回;此時傳回則是這樣形式的一個字元串:回調函數名(數據),這樣就符合js語法了(剋服了script標簽引入內容非js報錯的問題)

實例操作

紙上得來總覺淺,絕知此事要躬行。jsonp的原理我早就倒背入流了,但是看著覺得明白,但總覺得少了點什麼沒抓住。所以,實際操刀試試吧。點擊下載源碼

下載代碼後,進入some-code/jsonp-demo文件夾,該文件夾的目錄為:

app.js

package.json

views

  1. 命令行進入當前目錄,安裝包依賴:

    npm install
  2. 安裝完畢後,運行程式:

    node app.js

    如果看到命令行輸出“app is listening”則表示運行成功

  3. 修改host

    因為需要模擬跨域,所以在host文件中創建倆個不同的功能變數名稱,在host文件中添加以下內容:

    127.0.0.1  www.a.com www.b.com

    自此結束,在瀏覽器中輸入http://www.a.com:3000/,如果訪問成功則表示大功告成,頁面中應該出現倆個按鈕。

這個時候,我們打開瀏覽器的控制台,分別點擊頁面中的倆個按鈕,就可以看到測試結果啦。

代碼分析

  1. 入口文件:app.js

    • 設定模版引擎

      app.set('views', path.join(__dirname, 'views'));
      var swig = new swig.Swig();
      app.engine('html', swig.renderFile);
      app.set('view engine', 'html');
    • 設置路由和介面

      訪問www.a.com時,渲染view/index.html頁面

      app.get("/",function(req,res){
          res.render('index', {});
      })

      請求www.b.com/index.json時,返回數據,這裡伺服器收到jsonp的回調函數名,並把它與數據拼接在一起返回給客戶端

      //模擬數據
      var data = {"brand":23}
      app.get("/index.json",function(req,res){
      //解析請求路徑
      var param = urlLib.parse(req.url,true);
      var returnValue = param.query.callback+ '(' +           JSON.stringify(data) +')';
          res.send(returnValue)
      })
    • 啟動服務

      app.listen(3000,function(){
        console.log("app is listening")
      })
  2. 頁面:view/index.html

    頁面中有倆個按鈕:jsonp_buttonajax_button,點擊以後分別進行jsonp請求和ajax請求。

    • 綁定點擊事件

      jsonp_button.onclick = function(){
          var url = "http://www.b.com:3000/index.json?callback=jsonp";
          //向頁面中添加script標簽,進行jsonp請求
          creatScript(url)
      }
      
      ajax_button.onclick = function(){
      //ajax請求
          var xhr = getXhr();
          xhr.open("get","http://www.b.com:3000/index.json");
          xhr.send();
          if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){
                console.log(xhr.responseText);
            } else {
                console.log("Request was unsuccessful: " + xhr.status);
          }
      }
      function getXhr(){
          var xhr;
          if(window.XMLHttpRequest){      
              xhr = new XMLHttpRequest()
          }else{
              xhr = new ActiveXObject("Microsoft.XMLHTTP"); 
          }
          return xhr;
      }
    • 動態創建script標簽

      function creatScript(url){
          var scriptTag = document.createElement('script');
          scriptTag.setAttribute('src', url);
          document.getElementsByTagName('head')[0].appendChild(scriptTag);
      }
    • jsonp回調函數

      function jsonp(data) {
            //獲取數據
          console.log(data);
      }

由上面可以得出:jsonp中所有請求數據的後續操作應寫在jsonp的回調函數中,它類似於ajax 的 success操作。

最後一句話概括jsonp:jsonp就是原本應該發送json數據給客戶端的伺服器,不再發送json,改為發送一段調用回調函數的js代碼,而原本應該返回的數據則是該函數的參數。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • package.json 中包含各種所需模塊以及項目的配置信息(名稱、版本、許可證等)meta 信息。 Name:它屬於必須欄位,在package.json中最重要的就是name和version欄位,如果沒有就無法install。name和version一起組成的標識在假設中是唯一的。改變包應該同時 ...
  • ...
  • 絮語:按這個步驟走,你就會明白JSONP是什麼鬼。 1.工程目錄: 2.nginx的server配置 配置了兩個功能變數名稱不同,埠不同的域。 不會配置? 請看:nginx+php的使用 nginx的使用 3.get的xhr的非同步請求 谷歌下請求沒問題,因為我設置對瀏覽器設置了跨域參數。 但是火狐確是不行 ...
  • × 目錄 [1]範圍限定 [2]拖拽範圍 [3]磁性吸附 前面的話 上一篇,我們介紹了元素拖拽的實現。但在實際應用中,常常需要為拖拽的元素限定範圍。而通過限定範圍,再增加一些輔助的措施,就可以實現磁性吸附的效果 範圍限定 如果我們限定元素只可以在可視範圍內移動,那麼就需要對其進行範圍限定 首先,先要 ...
  • 前期準備 2本書:《HTML5從入門到精通》清華大學出版社,《Head First HTML與CSS》中國電力出版社; 1個編譯器:sublime; 幾種瀏覽器用於測試網頁:Firefox、chrome、360、IE; 2個主要的學習網站:慕課網:http://www.imooc.com/,w3sc ...
  • [1]原理介紹 [2]代碼實現 [3]代碼優化 [4]拖拽衝突 [5]IE相容 ...
  • JavaScript圖表FusionCharts免費線上公開課,由印度原廠技術工程師主講,10月13日發車。 ...
  • 前言: 使用HTML5,通過創建cache manifest文件,可輕鬆創建web應用的離線版本。 HTML5引入了應用程式緩存,這意味著web應用可進行緩存,並可在沒有網路時進行訪問。 應用程式緩存為應用帶來三個優勢: 離線瀏覽--用戶可在離線時使用它們。 速度--已經緩存的資源載入得更快。 減少 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...