DOM 編程藝術 6-7

6.數(shù)據(jù)通信

HTTP協(xié)議

HTTP 請求過程:瀏覽器向服務器端發(fā)送一個 HTTP 請求報文,服務器端接到請求報文之后進行一系列計算啰扛,向瀏覽器返回一個 HTTP 響應報文。瀏覽器接受響應報文后將響應報文的主體顯示在瀏覽器端上。

HTTP 請求報文和響應報文均由三部分組成本冲,頭行,頭部和主體劫扒。

請求報文

頭行:GET ?music.163.com ? HTTP/1.1

分別為 HTTP 方法檬洞,主機地址,HTTP 版本

頭部:由許多鍵值對組成

Accept——瀏覽器端可接受的媒體類型沟饥;

Accept-Encoding——瀏覽器端可接受的媒體類型的編碼方式添怔;

Cache-Control——緩存策略湾戳,no-cache 不進行緩存

Cookie——瀏覽器向服務器端發(fā)送的 cookie 值

User-Agent——當前瀏覽器版本

主體:請求為 GET 方法時,主體為空

響應報文

頭行:HTTP/1.1 ? 200 ? ?OK ??

分別為 HTTP 版本广料,HTTP 狀態(tài)碼砾脑,HTTP 狀態(tài)碼描述

頭部:鍵值對

Expires——緩存的有效時間,為瀏覽器端進行緩存時可使用艾杏。

Server——HTTP 服務器

主體:一個完整的 XML 文件

常用 HTTP 方法

GET:從服務器獲取一份文檔韧衣,不包含主體

POST:向服務器發(fā)送需要處理的數(shù)據(jù),包含主體

PUT:將請求的主體部分存儲在服務器上购桑,包含主體

DELETE:從服務器上刪除一份文檔畅铭,不包含主體

URL 構成

http://www.163.com:8080/index.html?r=admin&lang=zh-CN#news

協(xié)議(protocol)—— http:

主機名(hostname)—— www.163.com

端口(port)—— 8080

路徑(pathname)—— index.html

查詢字符串(search)—— r=admin&lang=zh-CN

片段(hash)—— news

port,pathname其兴,search顶瞒,hash 非必須

HTTP 版本

HTTP/0.9:1991年,HTTP 原型元旬,有很多設計缺陷

HTTP/1.0:很快取代 HTTP/0.9 榴徐,成為第一個廣泛應用的版本

HTTP/1.0+:添加持久的 keep-alive 連接,虛擬主機支持匀归,以及代理連接支持坑资,成為非官方的事實標準

HTTP/1.1:校正了結構性缺陷,明確語義穆端,引入重要的性能優(yōu)化措施袱贮,刪除不好特性。是當前使用版本

常見 HTTP 狀態(tài)碼

200 OK:請求成功体啰。一般用于 GET 和 POST 方法

301 Moved Permanently:資源移動攒巍,所請求資源自動到新的 URL,瀏覽器自動跳轉到新的 URL荒勇。

304 Not Modified:未修改柒莉,所請求資源未修改,瀏覽器讀取緩存數(shù)據(jù)

400 Bad Request:請求語法錯誤沽翔,不能被服務器所理解兢孝。

404 Not Found:請求資源不存在,舉個例子:輸入了錯誤的URL仅偎。

500 Internal Server Error:服務器發(fā)生不可預期的錯誤科汗。

ajax

Asynchronous JavaScript and XML 用 JavaScript 異步地獲取 XML 作為數(shù)據(jù)交換的格式

Ajax 通信流程

創(chuàng)建 Ajax 對象 XHR表谊,它的三個屬性為 readyState联逻,status觉渴,responseText 。初始 readyState 值為0威恼,另外兩個屬性值為空品姓。

調(diào)用 XHR 的 open() 方法寝并,開啟一個請求以備發(fā)送箫措,此時readyState 值為1腹备。

調(diào)用 XHR 的 send() 方法,正式向服務器端發(fā)起請求斤蔓,此時readyState 值為2植酥。

服務器端開始返回數(shù)據(jù)時,瀏覽器端接收到數(shù)據(jù)弦牡,此時readyState 值為3友驮。

當瀏覽器結束請求,此時readyState:4 status:200 reponseText:<!DOCTYPE html>

Ajax 調(diào)用示例

中間 xhr.onreadystatechange 為處理返回數(shù)據(jù)驾锰。監(jiān)聽 readystatechange 事件處理回調(diào)卸留,readyState 改變觸發(fā) readystatechange 事件。在 XHLHttpRequest2 標準還可以監(jiān)聽 xhr.onload 事件椭豫,readyState == 4耻瑟,status==200 才能觸發(fā)。

open() 方法:開啟一個請求已備發(fā)送

xhr.open(method,url[,async = true]);

method 表示調(diào)用的 http 請求方法(‘get’)

url 表示請求的資源相對當前文檔的路徑

async 布爾值赏酥,默認開啟異步請求喳整,false 表示開啟同步請求

setRequestHeader() 方法:在請求頭部設置頭部字段

在 open() 后調(diào)用,不一定調(diào)用裸扶。

xhr.setRequestHeader(header,value);

向服務器端發(fā)起一個表單編碼的請求時框都,需要在 send 前調(diào)用 setRequestHeader 方法。把頭部設成 Context-Type呵晨。

xhr.setRequestHeader(‘Context-Type’,‘a(chǎn)pplication/x-www-form-urlencoded’);

send() 方法:正式向服務器端發(fā)起請求

xhr.send([data = null]);

data 為向服務器端發(fā)起請求的請求體中的數(shù)據(jù)魏保。data 可為String FormData

data 為 FormData 時發(fā)起表單編碼的 POST 請求。

請求參數(shù)序列化

如果要向服務器端發(fā)起一個帶查詢參數(shù)的請求摸屠,需要把查詢參數(shù)作為字符串跟在 url 后面谓罗,如果查詢參數(shù)是個對象,要把對象轉換成字符串餐塘。

xhr.open(‘get’,'example.js'+'name1=value1&name2=name2',true);

需要一個函數(shù)妥衣,傳入對象,返回需要的字符串

GET 請求

POST 請求

查詢參數(shù)作為 send() 方法的請求參數(shù)傳入戒傻。

同源策略

同源策略限制不同源之間的交互税手,針對 XMLHttpRequest 等請求

兩個頁面擁有相同的協(xié)議,端口和主機需纳,那么這兩個頁面就屬于同一個源芦倒。

跨域資源訪問

不滿足同源策略的訪問,叫跨域資源訪問不翩。

W3C 定義了 CORS兵扬。

現(xiàn)代瀏覽器已經(jīng)實現(xiàn)對 CORS 支持麻裳。

其他跨域技術

Frame代理 ? ? ? ?JSONP ? ? ? ? ?Comet ? ? ? ? ? Web Socket

Frame代理

優(yōu)點:參照 CORS 標準,支持各種請求方法器钟。

缺點:需要在目標服務器放置代理文件津坑,由于首次發(fā)起請求,需要載入代理文件傲霸,載入代理之前的所有請求都會存在一定的延時疆瑰。對于低版本瀏覽器受限于消息通信,并發(fā)量大的請求返回時可能存在大的延時昙啄。

JSONP

利用了 HTML 中 script 標簽可跨域原理穆役,利用 script 標簽,向服務器請求一段 JS 代碼梳凛,然后執(zhí)行跨域過程耿币。


7.數(shù)據(jù)存儲

cookie

瀏覽器中的 Cookie 是一段小型的文本文件,4KB 左右韧拒,由鍵值對構成淹接,鍵值對之間用分號和空格隔開。

屬性

Name(名)叭莫,Value(值)為在設置 Cookie 時必須填的屬性蹈集;

Domain(作用域),默認值為當前文檔作用域雇初;Path(作用路徑)拢肆,默認值為當前文檔路徑;

Expires/Max-Age(失效時間)靖诗,默認值為瀏覽器會話時間(客戶端和服務端建立關聯(lián)的時間)郭怪,Expires 指定時間戳,Max-Age 表示以毫秒為單位的數(shù)值刊橘。

Secure(https 協(xié)議時生效)鄙才,默認值為 false。

Name促绵,Domain攒庵,Path 組合標識一個唯一的 Cookie 值。

作用域和作用路徑 轉自CSDN博客

Domain為設置Cookie的有效域败晴,Path限制有效路徑浓冒,如以下幾種情況:

1.最大可能的作用域 yourdomain.com所有角落(設置Cookie.Domain = "yourdomain.com",效果為yourdomain.com域下的所有主機的所有位置都可以取到這個Cookie)

2.域下的某主機?www.yourdomain.com(設置Cookie.Domain = "www.yourdomain.com"尖坤,效果為www主機下所有位置可以取)

3.某主機的某個文件夾www.yourdomain.com/bbs(Cookie.Domain ="www.yourdomain.com" ; Cookie.Path = "/bbs"稳懒,www主機的bbs下可以取)

讀取 Cookie

設置/修改 Cookie

刪除 Cookie

Cookie 的作用和缺陷

作用:跟蹤用戶信息,方便用戶登陸

缺陷:流量代價慢味,安全性問題场梆,大小限制

替代:localStorage 本地儲存 ?sessionStorage 會話存儲

storage

HTML5 提供 storage 作為 cookie 的替代方案墅冷。根據(jù)有效期和作用域的不同,storage 分為 localStorage 和 sessionStorage或油。

有效期

localStorage 的有效期默認為永久寞忿,如果在此期間用戶不對它進行刪除。

sessionStorage 的有效期默認為瀏覽器的會話時間装哆,當瀏覽器會話結束罐脊,sessionStorage 消亡定嗓。

作用域

localStorage 的作用域是由協(xié)議蜕琴,主機名和端口決定的。

sessionStorage 的作用域是在 localStorage 作用域的基礎上再加上窗口的限制宵溅,瀏覽器不同的窗口之間不共享 sessionStorage凌简。

大小

不同的瀏覽器對 storage 的實現(xiàn)不同,支持的大小也不同恃逻,大概為 5MB雏搂。

只要滿足有效期和作用域,瀏覽器每次訪問的時候都會將 storage 載入到內(nèi)存里寇损,對內(nèi)存造成不小壓力凸郑。建議在設置 storage 時不要設置過大的數(shù)據(jù)。

JS 對象

我們可以簡單地將 storage 理解成一個對象矛市,它的增刪查改可以以對象的形式來進行芙沥。

讀取:localStorage.name

添加/修改:localStorage.name = "NetEase"

刪除:delete localStorage.name

瀏覽器支持的 storage 存儲類型只有字符串浊吏。

API

W3C 有定義專門的 API 來對 storage 進行增刪查改而昨。

獲取鍵值對的數(shù)量:localStorage.length

讀取:localStorage.getItem("name") ? ? ?llocalStorage.key(i)

添加/修改:localStorage.setItem("name","NetEase")

刪除對應鍵值:localStorage.removeItem("name")

刪除所有數(shù)據(jù):localStorage.clear()

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末找田,一起剝皮案震驚了整個濱河市歌憨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌墩衙,老刑警劉巖务嫡,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異漆改,居然都是意外死亡心铃,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進店門籽懦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來于个,“玉大人,你說我怎么就攤上這事暮顺√ǎ” “怎么了秀存?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長羽氮。 經(jīng)常有香客問我或链,道長,這世上最難降的妖魔是什么档押? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任澳盐,我火速辦了婚禮,結果婚禮上令宿,老公的妹妹穿的比我還像新娘叼耙。我一直安慰自己,他們只是感情好粒没,可當我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布筛婉。 她就那樣靜靜地躺著,像睡著了一般癞松。 火紅的嫁衣襯著肌膚如雪爽撒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天响蓉,我揣著相機與錄音硕勿,去河邊找鬼。 笑死枫甲,一個胖子當著我的面吹牛源武,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播言秸,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼软能,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了举畸?” 一聲冷哼從身側響起查排,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎抄沮,沒想到半個月后跋核,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡叛买,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年砂代,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片率挣。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡刻伊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情捶箱,我是刑警寧澤智什,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站丁屎,受9級特大地震影響荠锭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜晨川,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一证九、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧共虑,春花似錦愧怜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至供炎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間疾党,已是汗流浹背音诫。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留雪位,地道東北人竭钝。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像雹洗,于是被迫代替她去往敵國和親香罐。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,652評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Ajax和XMLHttpRequest 我們通常將Ajax等同于XMLHttpRequest时肿,但細究起來它們兩個是...
    changxiaonan閱讀 2,236評論 0 2
  • element.chidren和element.childNodes的區(qū)別 element.children是El...
    cheerss閱讀 452評論 0 1
  • 看到標題時螃成,有些同學可能會想:“我已經(jīng)用xhr成功地發(fā)過很多個Ajax請求了旦签,對它的基本操作已經(jīng)算挺熟練了〈绾辏” 我...
    前端渣渣閱讀 5,762評論 1 12
  • 前端開發(fā)面試知識點大綱: HTML&CSS: 對Web標準的理解宁炫、瀏覽器內(nèi)核差異、兼容性氮凝、hack羔巢、CSS基本功:...
    秀才JaneBook閱讀 2,362評論 0 25
  • 本文詳細介紹了 XMLHttpRequest 相關知識,涉及內(nèi)容: AJAX、XMLHTTP竿秆、XMLHttpReq...
    semlinker閱讀 13,657評論 2 18