關於ajax
ajax是異步的JavaScript和XML,優點是無刷新的與后天通信並獲取數據,只更改頁面中需要更改的部分,而不是刷新整個頁面,減少無意義的數據傳輸,提高了效率和用戶體驗
1.協議和HTTP協議。
HTTP協議,它規定了在網絡中發布、傳輸和接收html頁面的方法。大家都遵循這個協議,就能實現信息的傳輸。
2.HTTP協議典型的工作流程。
客戶端和服務器端沒有任何聯系——建立連接,客戶端發送請求——沿着建立好的連接,服務器端返回響應信息——斷開連接。
3.HTTP請求信息的格式。
請求信息分為三部分:請求行、請求頭信息和請求主體信息。請求頭信息和請求主體信息之間用一個空行分割,不管是否有請求主體信息,這個空行都必須存在。
請求行又分成三部分:請求方法,請求資源的路徑,所用協議的版本(目前一般是http1.1,0.9和1.0已經基本不用了)。
請求方法又有以下幾種:GET/POST/PUT/DELETE/TRACE/OPTIONS等。
get方式通過地址欄傳遞參數,post方式是通過請求頭信息傳遞信息的。但是這兩種方式傳遞數據的格式都是相同的。key=value&key=value
4.HTTP響應信息的格式。
響應信息同樣分成三部分:響應行,響應頭信息,響應主體信息。
響應行:協議版本,狀態碼,狀態描述信息。
5.常見的http狀態碼:
200 OK,表示一切正常。對GET和POST請求的應答文檔跟在后面。
301 Moved Permanently。永久重定向。客戶請求的文檔在其他地方,新的URL在Location頭中給出,瀏覽器應該自動地訪問新的URL。
302 Found。臨時重定向,新的URL被視為臨時性的替代,而不是永久性的。
304 Not Modified。客戶端有緩存的文檔並發出了一個條件性的請求(一般是提供If-Modified-Since頭表示客戶只想比指定日期更新的文檔)。服務器告訴客戶,原來緩存的文檔還可以繼續使用。
400 Bad Request。請求出現語法錯誤。
403 Forbidden。資源不可用。
404 Not Found。無法找到指定位置的資源。
405 Method Not Allowed。請求方法(GET、POST、HEAD、Delete、PUT、TRACE等)對指定的資源不適用。
414 Request URI Too Long。輸入的網站URI太長。
500 Internal Server Error。服務器遇到了意料不到的情況,不能完成客戶的請求
501 Not Implemented。服務器不支持實現請求所需要的功能。例如,客戶發出了一個服務器不支持的PUT請求
505 HTTP Version Not Supported。服務器不支持請求中所指明的HTTP版本。
6.HTTP協議的頭信息
Refer信息是一個url,可以知道是從哪個頁面跳轉到當前頁面的,也就是用戶來到當前頁面的上一頁是哪里。通過這個特性結合服務器配置,可以用來防盜鏈。
7.XMLHttpRequest對象的屬性。
(1)responseText。從HTTP協議的角度來看,它代表的是服務器響應的主體信息,body信息。從我們用戶的角度看,就是在瀏覽器的頁面上能看到的信息,這個屬性的值肯定是字符串類型的。
(2)status是服務器返回的狀態碼。就是上面提到的http協議的狀態碼。
(3)statusText,狀態碼對應的文字描述,也是http協議中的內容。
(4)onreadystatechange,一個事件句柄,用來綁定一個函數。具體來說,它綁定的是當XMLHttpRequest對象的狀態發生變化的時候激發的函數。
(5)readyState,這是XMLHttpRequest對象自身的狀態碼,有以下幾種:
0(未初始化)還沒有調用send()方法,此階段確認XMLHttpRequest對象是否創建,值為0表示對象已經存在。
1(載入),此階段對XMLHttpRequest對象進行初始化,已經調用 send()方法,值為1表示正在向服務端發送請求。
2表示載入完成,(send()方法執行完畢),已經收到全部的響應內容。但是此時收到的並不是我們能直接看懂的內容,所以還不能在客戶端調用。
3正在解析響應內容。
4響應內容解析完成。這里要特別注意,完成並不一定代表成功得到了想要得到的內容。
(6).responseXML,對於大量的格式化文檔,可以用XML來傳輸或交換,由后台程序把數據封裝在XML文檔中,JS接收XML對象並解析其中的內容。
8.XMLHttpRequest對象的方法。
(1).open('請求方式','url',同步/異步),默認為true,表示異步。同步和異步聽起來有些高大上,其實可以這樣形容,前面的沒執行完,后面的就不能執行,這就是同步,它們排着隊,前面的會阻塞后面的。而異步就是前面的沒做完也不影響后面的執行,等到前面的執行完了把結果動態的拿過來就好了,通過及時“插隊”的形式實現了異步。
(2).send(null,參數),參數的格式是鍵值對&鍵值對。
比如這樣:obj.send('username='+un+'&email='+eml);
(3).getResponseHeader():獲取響應的某個頭信息,括號中寫入到底要獲得哪一個頭信息,比如('Content-Type')用來獲取返回的主體內容的長度。
(4).getAllResponseHeaders():獲取響應的所有頭信息。
(5).Abort,忽略,不要再進行下去了,到此為止。
(6).setRequestHeader(key,value),這個用來設置請求頭信息。
9.get方式提交數據,直接把要發送的內容跟在請求地址的后面即可,同時還要注意兩個問題:緩存和中文亂碼。瀏覽器的緩存會導致后端更新的數據不能及時的反饋到前端,所以要在地址最后加上一個時間戳或者是隨機數。而解決中文亂碼,可以在發送的時候用encodeRUI函數對漢字進行編碼,這個函數的作用就是把字符串作為URI進行編碼。
10.post方式沒有緩存問題,也沒有中文亂碼問題。它用來提交數據,提交數據是不會產生緩存的。把要提交的數據放到send方法的括號中作為參數傳遞過去。具體的拼接方式仍然不變,不過一定要注意一點,post提交數據的時候,必須在請求頭信息中聲明Content-Type,告訴后端你要發送的大致是什么內容,方便服務器進行相應的解析。同時,由於設置了內容類型,也就沒有中文亂碼問題了。