Ajax和跨域問題

来源:http://www.cnblogs.com/caijunjun/archive/2017/04/04/6665317.html
-Advertisement-
Play Games

什麼是ajax Ajax(Asynchronous JavaScript and XML),是一種可以向伺服器請求額外的數據並且無需刷新頁面的技術,ajax的出現帶來了更好的用戶體驗. Ajax的核心就是XMLHttpRequest(XHR)對象.XHR為向伺服器發送請求和解析伺服器響應提供了流暢的 ...


什麼是ajax

  • Ajax(Asynchronous JavaScript and XML),是一種可以向伺服器請求額外的數據並且無需刷新頁面的技術,ajax的出現帶來了更好的用戶體驗.
  • Ajax的核心就是XMLHttpRequest(XHR)對象.XHR為向伺服器發送請求和解析伺服器響應提供了流暢的介面.可以使用XHR對象獲取新數據,通過DOM將新數據插入到頁面.雖然名字中包含XML,但是ajax通信和數據格式無關;這種技術就是可以不用刷新就從伺服器獲取數據,但是不一定是XML數據,也可以是json.

XMLHttpRequest對象

XHR的用法

1.創建一個XMLHttpRequest對象
2.發送請求
  • 1.設置請求行 xhr.open()
  • 2.POST請求需要設置請求頭 xhr.setRequestHeader() POST請求頭Content-Type的值: application/x-www-form-urlencoded
  • 3.設置請求體 xhr.send() get請求傳null,post根據情況
3.處理伺服器響應
  • 先判斷響應狀態碼和非同步對象是否解析完畢.
  • 伺服器返回的狀態碼 status

    1xx:消息
    2xx:成功
    3xx:重定向
    4xx:請求錯誤
    5xx:伺服器錯誤
  • 非同步對象的狀態碼 readystate

    0:非同步對象已經創建
    1:非同步對象初始化完成,發送請求
    2:接收伺服器返回的原始數據
    3:數據正在解析,解析需要時間
    4:數據解析完成,數據可以使用了

XML

XML的特點,出身名門,W3C制定,微軟和IBM曾經共同大力推薦過的數據格式.XML 指可擴展標記語言(Extensible Markup Language),被設計用來傳輸和存儲數據,HTML 是設計用來表示頁面的.

  • 語法規則:和HTML差不多,都是通過標記來表示的
  • 特殊符號:比如<>要使用實體-轉移字元
  • xml的解析需要前後臺配合:
    1.後臺在返回的時候,在響應頭中設置Content-Type的值為 application/xml
    2.前臺非同步對象在接收後臺數據時,記得按照xml的方式來接收,xhr.responseXML,並且它返回的是一個object對象,內容是#document

JSON

JSON(JavaScript Object Notation),出身草根,是 Javascript 的子集,專門負責描述數據格式.JSON本身是一個特殊格式的字元串,可以轉換成js對象,是網路上用來傳輸數據使用最廣泛的數據格式,沒有之一.

  • 語法規則:數據以 key/value 值對錶示,數據由逗號分隔,大括弧保存對象,中括弧保存數組,名稱和值都需要使用雙引號包含(這個是和js的一點小區別).
  • js中解析/操作JSON:
    1.JSON.parse(json字元串); 將一個json格式的字元串解析成js對象
    2.JSON.stringify(js對象); 將一個js對象轉成一個json格式的字元串

自己封裝一個ajax

function pinjieData(obj) {
    //obj 就相當於 {key:value,key:value}
    //最終拼接成鍵值對的字元串  "key:value,key:value"
    var finalData = "";
    for(key in obj){
        finalData+=key+"="+obj[key]+"&";  //key:value,key:value&
    }
    return finalData.slice(0,-1);//key:value,key:value
}

function  ajax(obj) {
    var url = obj.url;
    var method = obj.method.toLowerCase();
    var success = obj.success;
    var finalData = pinjieData(obj.data);
    //finalData最終的效果key:value,key:value

    //1.創建xhr對象
    var xhr = new XMLHttpRequest();
    //get方法拼接地址,xhr.send(null)
    if (method=='get'){
        url = url + "?"+finalData;
        finalData = null;
    }

    //2.設置請求行
    xhr.open(method,url);

    // 如果是post請求,要設置請求頭
    if (method=='post'){
        xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded")
    }

    //3.發送
    xhr.send(finalData);

    //4.監聽伺服器返回的數據
    xhr.onreadystatechange = function () {
        if (xhr.status==200 && xhr.readyState==4){
            var result = null;
            //獲取返回的數據類型
            var rType = xhr.getResponseHeader("Content-Type");
            if (rType.indexOf('xml')!=-1){
                result = xhr.responseXML;
            }else if(rType.indexOf('json')!=-1){
                // JSON.parse 的意思是 將 json格式的字元串
                //比如 [{ "src":"./images/nav0.png","content":"商品分類1"}]
                //轉成js對象
                result = JSON.parse(xhr.responseText);
            }else{//當成普通的字元串去處理
                result = xhr.responseText;
            }

            //將這裡解析好的數據交給頁面去渲染
            success(result);
        }
    }
}

jQuery中使用ajax API jQuery ajax

jQuery為我們提供了更便利的ajax封裝使用.

  • $.ajax({}) 可以配置方式發起ajax請求
  • $.get() 以get方式發起ajax請求
  • $.post() 以post方式發起ajax請求
  • $('form').serialize() 序列化表單(格式化key=val$key=val)
  • 參數說明

    url :介面地址
    type :請求方式(get/post)
    timeout : 要求為Number類型的參數,設置請求超時時間(毫秒)
    dataType: 應該是客戶端傳遞給伺服器一個值,告訴伺服器如何進行處理:
    data: 發送請求數據
    beforeSend: 要求為Function類型的參數,發送請求前可以修改XMLHttpRequest對象的函數,例如添加自定義HTTP頭。在beforeSend中如果返回false可以取消本次ajax請求.
    success: 成功響應後調用
    error: 錯誤響應時調用
    complete: 響應完成時調用(包括成功和失敗)
     //ajax===get
     $.ajax({
         url:'',
         data:'key=value&key=value',
         type:'get',
         success:function (result) {
             console.log(result);
         }
     });
    
    //ajax===post
    $.ajax({
         url:'',
         data:'key=value&key=value',
         type:'post',
         success:function (result) {
             console.log(result);
         }
     });
    
    //$.get
    $.get({
         url:'',
         data:'key=value&key=value',
         success:function (result) {
            console.log(result);
         }
    });
    
    //$.post
    $.post({
         url:'',
         data:'key=value&key=value',
         success:function (result) {
            console.log(result);
         }
    });
    //在使用jQuery中ajax發送請求的時候,只需要在 dataType中寫上jsonp即可實現ajax的跨域請求
     dataType:'jsonp'    

跨域

  • 通過XHR實現ajax通信的一個主要限制(相同域,相同埠,相同協議),來源於跨服安全策略,預設情況下,XHR只能請求同一域的資源,這是為了防止某些惡意的行為.

    CORS跨域

  • CORS(cross-origin resource sharing,跨域源資源共用)定義了在跨域時,瀏覽器和伺服器應該如何溝通.CORS允許一個域上的網路應用向另一個域提交跨域 AJAX 請求。實現此功能非常簡單,只需由伺服器發送一個響應標頭即可。
  • CORS支持所有類型的HTTP請求.
  • 伺服器端對於CORS的支持,主要就是通過設置Access-Control-Allow-Origin來進行的。

    JSONP

  • JSONP由回調函數和數據組成.JSONP只支持GET請求.JSONP的優勢在於支持老式瀏覽器,以及可以向不支持CORS的網站請求數據.
  • JSONP通過動態<script>元素來使用,src屬性知道一個跨域URL,JSONP是有效的JavaScript代碼,瀏覽器可以跨域請求JS文件.
  • 優點:簡單易用,可以直接訪問響應文本,支持在瀏覽器和伺服器之間雙向通信.
  • 缺點:1.JSONP是從其他域載入代碼執行,存在不安全風險.2.不好確定JSONP請求是否成敗.

    通過修改document.domain來跨子域

    使用window.name來進行跨域

    HTML5中新引進 window.postMessage方法來跨域傳送數據

    flash

    iframe

    伺服器設置代理頁面

    圖像Ping

  • 通過使用標簽,利用網頁可以從任何網頁載入圖像原理.
  • 圖像Ping常用於跟蹤用戶點擊頁面或動態廣告曝光次數.
  • 2個缺點:1.只支持GET請求.2.無法訪問伺服器的響應文本.只能用於瀏覽器與伺服器間的單項通信.

    var img = new Image();
    img.onload = img.onerror = function (){
    alert("Done!");
    };
    img.src = "";

comet

  • 一種更高級的ajax技術.ajax是頁面向伺服器請求數據的技術.comet是伺服器向頁面推送數據的技術.

SSE (Server-Sent Events) 伺服器發送事件

Web Sockets

  • Web Sockets的目標是在一個單獨的持久鏈接上提供全雙工,雙向通信.

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

-Advertisement-
Play Games
更多相關文章
  • 創建用戶 ? 1 CREATE USER 'username'@'host' IDENTIFIED BY 'password'; ? 1 CREATE USER 'username'@'host' IDENTIFIED BY 'password'; ? 1 CREATE USER 'username ...
  • 類庫:.dll文件,使用類庫來封裝常用的功能,無法單獨運行。 abstact class Calculator類{欄位Num1,欄位Num2,abstract int GetResult()方法} Add類:Calculator類{override int GetResult()返回Num1+Num ...
  • 一、概述 提供一個創建一系列相關或相互依賴對象的介面,而無需指定它們具體的類。 二、模式中的角色 AbstarctProduct(IProduct):為一類產品對象聲明一個介面; ConcreteProduct(MySqlProduct、SqlServerProduct):定義一個將被相應的具體工廠 ...
  • JavasScript社區在創新的道路上開足了馬力,曾經流行過的也許一個月之後就過時了。2016已經結束了。你可能會想你是否錯過一些重要的東西?不用擔心,讓我們來回顧2016年前端有哪些主流。通過比較過去12個月里Github所增加的star數,我們依次來看看哪些項目吸引了大多數眼光。 ...
  • [1]前端架構 [2]版本管理 [3]命令行工具 [4]編輯器 [5]預處理器 ...
  • 原文鏈接:http://www.jianshu.com/p/42e11515c10f 什麼是WebPack,為什麼要使用它? 為什要使用WebPack 現今的很多網頁其實可以看做是功能豐富的應用,它們擁有著複雜的JavaScript代碼和一大堆依賴包。為了簡化開發的複雜度,前端社區涌現出了很多好的實 ...
  • 首先要瞭解何為跨域,(協議、功能變數名稱、埠任意一個不同)的web資源。如何解決跨域:1,jsonp 它只支持GET請求而不支持POST等其它類型的HTTP請求;例如angular 中,如下使用,$http.jsonp('some/trusted/url', {jsonpCallbackParam: 'c ...
  • 什麼是模板引擎 模板引擎是為了使用戶界面與業務數據(內容)分離而產生的,它可以生成特定格式的文檔,用於網站的模板引擎就會生成一個標準的HTML文檔.其本質是利用正則表達式,替換模板當中預先定義好的標簽. 常用模板引擎 "ArtTemplate" "BaiduTemplate" "velocity.j ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...