整合營銷服務商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          JavaScript實現(xiàn)Ajax

          JavaScript實現(xiàn)Ajax

          :基本概念

          jQuery的Ajax請求實際上是封裝的一個XHLHttpRequest,從字面意思來看是,XML是一種文件格式,Http是一個網(wǎng)絡請求,Request最開始是用于請求XML文件的,后來不斷擴展可以請求多種類型的文件。

          XHLHttpRequest,網(wǎng)絡請求模塊,或者是一個瀏覽器網(wǎng)絡線程。用于從URL網(wǎng)絡上獲取數(shù)據(jù),有了對象,就可以實現(xiàn)頁面的無刷新請求數(shù)據(jù),就可以做到一個局部的更新,也可以獲取多種類型的數(shù)據(jù)(ftp、文件)。

          2:要實現(xiàn)和使用XMLHttpRequest

          它是一個對象,首先我們需要實例化,定義一個:

          var xhr=new XMLHttpRequest();
          

          3:初始化請求,給定一些必要的配置,給它一些property

          //Ajax請求時的參數(shù)設(shè)置
          method 請求方式
          url 請求地址
          async 是否異步
          user 用戶名
          password 密碼
          ?
          xhr.open(method,url,async,user,password);
          

          4:發(fā)送請求(encodeURLComponent)

          xhr.send(data);
          等待接收
          

          5:接收網(wǎng)絡請求返回

          一般有如下屬性:

          • responseText,請求返回的數(shù)據(jù)內(nèi)容,可以是一段文本,是一段二進制或者是一個json
          • responseXML

          是一個文件,如果響應頭內(nèi)容是text/xml,這個屬性將保留響應數(shù)據(jù)的XML、DOM文檔。

          • status,響應的HTTP狀態(tài),如 200(正常,200-300之間都表示成功) 304(使用緩存) 404(沒找到) 500(服務器內(nèi)部錯誤)等
          • statusText,HTTP狀態(tài)說明
          • readyStatus,請求/響應過程的當前活動階段,一共有5個值:0(未被調(diào)用open),1(已被調(diào)用open但未發(fā)送),2(已調(diào)用send),3(已接收到請求返回的數(shù)據(jù)),4(請求已完成)。
          • timeout,設(shè)置請求超時時間
          xhr.onreadystatechange=()=> {
           if (xhr.readyStatus===4) {
           /* HTTP 狀態(tài)在 200-300 之間表示請求成功 */
           /* HTTP 狀態(tài)為 304 表示請求內(nèi)容未發(fā)生改變,可直接從緩存中讀取 */
           if (xhr.status >=200 &&
           xhr.status < 300 ||
           xhr.status==304) {
           console.log('請求成功', xhr.responseText)
           }
           }
          }
          

          6:封裝(promise)

          function ajax (options) {
           /* 獲取請求地址 */
           let url=options.url;
           /* 獲取請求方法 */
           const method=options.method.toLocaleLowerCase() || 'get';
           /* 默認異步 */
           const async=options.async !=false;
           /* 獲取請求request數(shù)據(jù) */
           const data=options.data;
           /* 實例化XMLHttpRequest */
           const xhr=new XMLHttpRequest();
           /* 設(shè)置超時時間 */
           if (options.timeout && options.timeout > 0) {
           xhr.timeout=options.timeout
           }
          ?
           return new Promise ( (resolve, reject)=> {
           /* 添加超時回調(diào) */
           xhr.ontimeout=()=> reject && reject('請求超時');
           /* 成功回調(diào) */
           xhr.onreadystatechange=()=> {
           if (xhr.readyState==4) {
           if (xhr.status >=200 && xhr.status < 300 || xhr.status==304) {
           resolve && resolve(xhr.responseText);
           } else {
           reject && reject();
           }
           }
           }
          ?
           /* 失敗回調(diào) */
           xhr.onerror=err=> reject && reject(err);
          ?
           /* 拼接參數(shù) */
           let paramArr=[];
           let encodeData;
           if (data instanceof Object) {
           for (let key in data) {
           paramArr.push( encodeURIComponent(key) + '=' + encodeURIComponent(data[key]) );
           }
           encodeData=paramArr.join('&');
           }
          ?
           /* get請求 */
           if (method==='get') {
           const index=url.indexOf('?')
           if (index===-1) url +='?'
           else if (index !==url.length -1) url +='&'
           url +=encodeData
           }
          ?
           /* 初始化請求 */
           xhr.open(method, url, async);
          ?
           /* get直接發(fā)送拼接的URL */
           if (method==='get') xhr.send(null);
          ?
           if (method==='post') {
           xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded;charset=UTF-8')
           xhr.send(encodeData)
           }
           })
          }
          

          總結(jié):關(guān)于網(wǎng)絡請求,一般常用的有四種:

          一個是get,獲取網(wǎng)絡資源

          然后是post,一般用于提交數(shù)據(jù),提交數(shù)據(jù)的參數(shù)是放在請求的body里面的

          delete,刪除

          put,標準的一個修改

          關(guān)于Http的簡單請求和非簡單請求或者是跨域,在跨域時由于瀏覽器的安全機制,涉及到一個問題關(guān)于在Ajax請求 ,是在請求之后還是請求之前判斷跨域,這時候就需要了解一下簡單請求和復雜請求。

          簡單請求是先把資源請求回來,然后再去判斷是否跨域。如果是一個復雜請求,瀏覽器會先去發(fā)送一個嗅探或者是欲請求(一般是一個option),先判斷是否跨域,如果不是跨域那就執(zhí)行,如果是跨域那就直接不請求了。一般來講,如果get不修改它的Content-Type,那么基本上都是簡單請求。post如果采用www-form的形式,也是一個簡單請求。

          這篇文章主要是分享了Javascript中XMLHttpRequest對象的基本屬性和方法, 從實例化、初始化、發(fā)送和接受四個階段完成了Ajax網(wǎng)絡請求核心內(nèi)容封裝。

          avaScript對象標記是基于鍵值對和有序列表的結(jié)構(gòu)化數(shù)據(jù)基于文本的表示。盡管JSON源自JavaScript,但它在大多數(shù)主要的編程語言中都是通過本地或庫來支持的。JSON通常用于在Web客戶端和Web服務器之間交換信息。

          在過去15年,JSON已經(jīng)在網(wǎng)絡上普遍存在。今天,它幾乎是所有公開Web服務的首選格式,同時也經(jīng)常用于私人網(wǎng)絡服務。

          JSON的受歡迎程度導致許多數(shù)據(jù)庫的本機JSON支持。關(guān)系數(shù)據(jù)庫,如PostgreSQL和MySQL,現(xiàn)在支持存儲和查詢JSON數(shù)據(jù)。MongoDB和Neo4j等NoSQL數(shù)據(jù)庫也支持JSON,盡管MongoDB在后臺使用了稍微修改后的JSON二進制版本。

          下面我們來看一下JSON,并討論它的來源,它與XML相比的優(yōu)勢和它的缺點等等。首先,我們從一個例子開始:

          上面的結(jié)構(gòu)清楚定義了一個人的某些屬性。它包括姓氏,已登錄次數(shù),是否為作家,所在公司名稱以及所養(yǎng)寵物名單和類型(在本例中僅一個)。類似于上述的結(jié)構(gòu)可以從服務器傳遞到web瀏覽器或移動應用,然后這些應用將執(zhí)行諸如顯示數(shù)據(jù)或保存數(shù)據(jù)之類的操作以備日后參考。

          JSON是一種通用數(shù)據(jù)格式,其數(shù)值類型最少:字符串,數(shù)字,布爾值,列表,對象和空值。雖然符號是JavaScript的一個子集,但這些類型都以所有常見的編程語言表示,使得JSON成為跨越語言差距傳輸數(shù)據(jù)的良好候選者。

          為什么要使用JSON?

          要了解JSON的有用性和重要性,我們必須了解一下網(wǎng)絡互動歷史。

          在21世紀初,網(wǎng)絡上的互動開始發(fā)生轉(zhuǎn)變。當時,瀏覽器主要作為一個愚蠢的客戶端顯示信息,服務器做了所有努力準備顯示內(nèi)容。當用戶點擊瀏覽器中的鏈接或按鈕時,將向服務器發(fā)送請求,服務器將所需的信息轉(zhuǎn)換為HTML,瀏覽器會向用戶呈現(xiàn)一個HTML頁面。當要求瀏覽器重新呈現(xiàn)頁面上的所有內(nèi)容,即使只有一部分頁面已更改,這種模式都是緩慢而低效的。

          由于全頁面重新加載成本高昂,因此網(wǎng)頁開發(fā)人員開始尋求更新的技術(shù)來改善用戶體驗。同時,在Internet Explorer 5中引入的頁面顯示時,在后臺進行Web請求的能力被證明是加載數(shù)據(jù)以便顯示的可行方法。點擊刷新按鈕不會重新加載頁面的整個內(nèi)容,而是觸發(fā)在后臺加載的Web請求。加載內(nèi)容時,可以使用瀏覽器中的通用編程語言JavaScript(JavaScript)來操縱、保存和顯示數(shù)據(jù)。

          最初,數(shù)據(jù)以XML格式傳輸(參見下面的示例),但XML在JavaScript中是冗長和難以管理的。JavaScript已經(jīng)有對象,這是一種在語言中表達數(shù)據(jù)的方法,所以Douglas Crockford將該表達式的一部分作為新的數(shù)據(jù)交換格式規(guī)范,并將其稱為JSON。JSON可以讓人們更容易閱讀,并讓瀏覽器進行解析,很快Web開發(fā)人員喜歡JSON就勝過XML了。

          到目前為止,JSON是用于在網(wǎng)絡和移動客戶端和后端服務之間交換數(shù)據(jù)的事實標準。

          JSON與XML

          如上所述,JSON替代了XML,XML在新系統(tǒng)中越來越少見,很容易看出為什么。以下是上面那個示例的XML版本:

          除此之外,XML在解析為JavaScript數(shù)據(jù)結(jié)構(gòu)時也引入了一些歧義。將XML轉(zhuǎn)換為JavaScript對象可能需要數(shù)十到數(shù)百行代碼,最終需要根據(jù)解析對象進行定制。將JSON轉(zhuǎn)換為JavaScript對象需要一行代碼,并且不需要有關(guān)解析對象的任何知識。

          JSON的限制

          雖然JSON是一種相對簡潔,靈活的數(shù)據(jù)格式,易于在許多編程語言中使用,但格式上還是有一些缺點。這里有五個主要的限制:

          1、沒有模式。一方面,這意味著程序員可以完全靈活地以任何方式表示數(shù)據(jù)。另一方面,這意味著可以非常輕松地創(chuàng)建錯誤數(shù)據(jù)。

          2、僅一個數(shù)字類型:IEEE-754雙精度浮點格式是很好用的,但它意味著不能利用許多編程語言中可用的多樣和細微的數(shù)字類型。

          3、沒有日期類型。這意味著開發(fā)人員必須使用一些字符串表示日期,這會導致格式化差異,或者必須以1970年1月1日的形式表示日期。

          4、沒有注釋。這使得程序員無法內(nèi)聯(lián)注釋字段,需要添加額外的文檔并會增加誤解的可能性。

          5、雖然JSON不像XML那么冗長,但它也不是最簡潔的數(shù)據(jù)交換格式。對于大容量或?qū)S梅?,需要使用更高效的?shù)據(jù)格式。

          什么時候應該使用JSON?

          如果程序員正在編寫與瀏覽器或本地移動應用程序通信的軟件,則應使用JSON作為數(shù)據(jù)格式,使用像XML這樣的格式是一個過時的選擇。

          在服務器到服務器通信的情況下,可能最好使用像Apache Avro或Apache Thrift這樣的序列化框架。JSON不是一個壞的選擇,仍然可能正是你需要的,但不如上述兩個效果好。

          如果你正在使用NoSQL數(shù)據(jù)庫,在支持JSON作為類型的關(guān)系數(shù)據(jù)庫中,一個很好的經(jīng)驗法則是盡可能少地使用它。針對符合特定模式的結(jié)構(gòu)化數(shù)據(jù)調(diào)整關(guān)系數(shù)據(jù)庫。雖然大多數(shù)支持JSON形式更靈活的數(shù)據(jù),但在查詢這些JSON對象屬性時,性能將會受到影響。

          JSON是用于在Web服務器、瀏覽器和移動應用程序之間發(fā)送數(shù)據(jù)的格式。其簡單的設(shè)計和靈活性使其易于閱讀和理解,在大多數(shù)情況下,程序員可以輕松地以所選擇的編程語言進行操作。缺乏嚴格的架構(gòu)可以實現(xiàn)格式的靈活性,但這種靈活性有時難以確保正確閱讀和編寫JSON。

          程序員可能需要多做一些工作來處理像Scala或Elm這樣的強類型語言中的JSON,但廣泛采用JSON意味著有庫和實用程序來幫助完成所有最難的部分。 在構(gòu)建新的Web服務時,選擇JSON可能表示對相關(guān)領(lǐng)域缺乏了解。



          SON(JavaScript Object Notation)和XML(eXtensible Markup Language)是在日常開發(fā)中比較常用的兩種數(shù)據(jù)格式,它們主要的作用就是用來進行數(shù)據(jù)的傳輸以及數(shù)據(jù)的存儲。但是兩種數(shù)據(jù)結(jié)構(gòu)都各自有各自的優(yōu)缺點,以及適用的場景,下面我們就來詳細的比較一下兩種數(shù)據(jù)格式有什么區(qū)別和聯(lián)系。

          語法結(jié)構(gòu)

          JSON

          從語法結(jié)構(gòu)的角度上來講JSON數(shù)據(jù)格式是基于了JavaScript對象的方式進行表示,語法相對來說比較直觀,也很容易理解,通過鍵值對的結(jié)構(gòu)進行數(shù)據(jù)的存儲,并且支持數(shù)組以及嵌套對象的存儲。如下所示。

          {
            "name": "John",
            "age": 30,
            "cities": ["New York", "Los Angeles"]
          }

          XML

          XML數(shù)據(jù)格式則是基于標簽結(jié)構(gòu)進行的封裝操作,有點類似于HTML,數(shù)據(jù)是被包裹在一個標簽對中間,這個標簽對包括了開始標簽以及結(jié)束標簽,并且XML支持標簽屬性以及標簽元素的嵌套操作,如下所示。

          <person>
            <name>John</name>
            <age>30</age>
            <cities>
              <city>New York</city>
              <city>Los Angeles</city>
            </cities>
          </person>

          可讀性

          從上面的示例代碼中,我們可以看出JSON數(shù)據(jù)格式的數(shù)據(jù)語法相對來說比較簡單易讀,并且因為結(jié)構(gòu)相對來說比較簡單,所以說維護起來也相對容易一些,通過鍵值對的方式進行存儲,更加便于用戶理解其含義。

          而相比較而言XML格式則由于標簽結(jié)構(gòu)的復雜,所以可讀性比JSON來講相對較低不利于理解,并且尤其在一些比較復雜的XML結(jié)構(gòu)中這種情況更加的明顯,由于標簽冗余過長,導致整個的XML數(shù)據(jù)格式的繁瑣操作起來比較麻煩,而且在XML中必須要遵守嚴格的語法要求,如果語法格式錯誤將會導致整個的數(shù)據(jù)不能使用。

          數(shù)據(jù)類型支持

          JSON數(shù)據(jù)格式中可以支持基本的數(shù)據(jù)類型,例如字符串、數(shù)字、布爾值、數(shù)組以及對象操作,但是不支持自定義的數(shù)據(jù)類型,這些基本的數(shù)據(jù)類型已經(jīng)可以表示大部分的數(shù)據(jù)了,所以自定義的數(shù)據(jù)類型表示在JSON數(shù)據(jù)中基本上沒有太大的意義。

          而在XML中是通過標簽的方式來進行數(shù)據(jù)結(jié)構(gòu)的封裝,所以它可以自定義封裝一些復雜的數(shù)據(jù)結(jié)構(gòu),并且這些自定義的標簽數(shù)據(jù)類型都很靈活,可以表示比較復雜的數(shù)據(jù)結(jié)構(gòu)。相比較JSON的簡單的數(shù)據(jù)結(jié)構(gòu)來講,XML可能通過自定的方式可以支持很多的數(shù)據(jù)類型。

          數(shù)據(jù)解析

          上面也提到了JSON數(shù)據(jù)結(jié)構(gòu)是支持原生的JavaScript操作的,所以對于JSON數(shù)據(jù)的解析來講相對來說比較方便,并且在很多的編程語言中都支持了對于JSON數(shù)據(jù)的解析庫,例如在Python提到的json模塊,在Java中的FastJSON,GSON等。

          而XML由于結(jié)構(gòu)相對來說比較復雜,所以必須要用專門的解析器來進行操作,例如DOM、SAX等,并且由于結(jié)構(gòu)的復雜性,所以說解析數(shù)據(jù)的速度也會相對較慢,當處理一些大型的XML文件的時候這種情況非常明顯,在很多編程語言中都提供對于XML文件的解析,但是整體的使用效果要比JSON解析要復雜的多。

          使用場景

          JSON

          對于JSON數(shù)據(jù)格式來講,它比較適合于Web應用程序的數(shù)據(jù)交換,比較常見的就是前后端分離項目的數(shù)據(jù)交換實現(xiàn),并且在很多的分布式配置中也會使用JSON數(shù)據(jù)格式來進行配置文件的傳輸,在一些遠程調(diào)用的過程中,JSON數(shù)據(jù)格式作為一種簡單的數(shù)據(jù)傳輸給,也被用來進行遠程調(diào)用TCP數(shù)據(jù)傳輸。

          當然除了上面提到的這些場景之外,在很多輕量級應用場景中也是使用JSON進行數(shù)據(jù)交換操作。

          XML

          XML數(shù)據(jù)結(jié)構(gòu)適用于一些比較復雜的數(shù)據(jù)交換場景,例如在SOAP協(xié)議中,通常情況下在Ant、Maven等工具中XML文件格式也備用來充當配置文件,在需要高度擴展性和自定義標簽數(shù)據(jù)的場景中XML數(shù)據(jù)格式也是比較適用的,例如在MyBatis框架中對于SQL語句的映射。

          擴展性

          對于JSON數(shù)據(jù)格式來講,它的擴展性是有限的,由于不支持自定義的標簽操作,而且數(shù)據(jù)結(jié)構(gòu)也相對來說比較固定,所以經(jīng)常被用來做數(shù)據(jù)交換使用。

          而對于XML數(shù)據(jù)格式來講,它支持自定義的標簽以及名稱空間操作,擴展性要比JSON要強,所以經(jīng)常被用來進行一些數(shù)據(jù)模型的擴展操作。

          總結(jié)

          JSON與XML數(shù)據(jù)格式,各自有各自的優(yōu)勢,而在實際使用場景中,選擇使用那種數(shù)據(jù)格式,主要就是取決于具體的使用場景,如果將就高效并且數(shù)據(jù)傳輸相對簡單的場景中我們可以使用JSON數(shù)據(jù)格式,如果要進行一些復雜數(shù)據(jù)的處理,并且在一些跨平臺的應用數(shù)據(jù)交換的過程中,建議使用XML格式的數(shù)據(jù)。


          主站蜘蛛池模板: 无码国产伦一区二区三区视频| 一区二区三区在线观看中文字幕 | 国产精品揄拍一区二区| 日本欧洲视频一区| 日韩电影一区二区三区| 久久精品国产一区二区三区| 日韩中文字幕一区| 亚洲色一区二区三区四区 | 亚洲中文字幕在线无码一区二区| 人妻无码一区二区三区免费| 久久青草国产精品一区| 国产精品区一区二区三在线播放 | 无码毛片视频一区二区本码| 精品一区二区三区无码免费视频| 91视频一区二区三区| 国产高清视频一区二区| 91麻豆精品国产自产在线观看一区 | 亚洲电影一区二区三区| 亚洲国产成人精品久久久国产成人一区二区三区综 | 国产成人无码aa精品一区| 日韩人妻无码一区二区三区99 | 中文字幕人妻无码一区二区三区| 日韩精品一区二区三区色欲AV| 国产精品无码亚洲一区二区三区| 日本视频一区二区三区| 一区二区中文字幕| 动漫精品专区一区二区三区不卡| 无码AV中文一区二区三区| 国产一区二区三区在线免费 | 男人的天堂亚洲一区二区三区| 亚洲中文字幕无码一区| 韩国精品一区二区三区无码视频| 国产一区二区三区高清视频| 中文乱码人妻系列一区二区| 精品成人av一区二区三区| 韩国理伦片一区二区三区在线播放| 高清在线一区二区| 精品人妻无码一区二区色欲产成人| 色狠狠色噜噜Av天堂一区| 日韩a无吗一区二区三区| 99精品一区二区免费视频 |