1. JS操作請求與響應
http報文格式
請求格式
GET /xxx HTTP/1.1 第一部分
HOST: jack.com:8002 第二部分 key:value形式
Content-Type: application/x-www-url-encoded
空行是第三部分,下面就是第四部分請求體
響應格式
HTTP/1.1 200 OK 第一部分
Content-Type: text/html 第二部分 key:value形式
第三部分 空行
<!DOCTYPE html> 第四部分 響應體
<html>.…</html>
複製程式碼
1.1 JS 可以設定任意請求 header 嗎? 可以
第一部分 request.open('get', '/xxx')
第二部分 request.setHeader('content-type', 'x-www-form-urlencoded')
第四部分 request.send('a=1&b=2')
1.2 JS 可以獲取任意響應 header 嗎? 可以
第一部分 request.status / request.statusText
第二部分 request.getResponseHeader() / request.getAllResponseHeaders()
第四部分 request.responseText
所以通過ajax,我們可以獲取請求中的4各部分的所有內容(不安全的會不讓設定),也可以獲取響應中的4個部分。
1.3 巨集觀上看一眼
2. 寫window.jQuery.ajax (封裝)
2.1 從記憶體圖的角度看我們在做什麼
jQuery作為物件,我們假設它在桟記憶體中地址是Addr89,對應的堆記憶體中的一個物件89。
現在我們需要給89新增一個新的key,也就是ajax,它的值對應著101這個函式體,我們要寫的就是這個函式體。
window.jQuery.ajax = function(options){
// 程式碼 (這就是我們要寫的部分)
}
複製程式碼
程式碼:自己實現window.jQuery.ajax
系統學習jQuery.ajax,要看文件
更多文件 http://cndevdocs.com/
2.2 自己封裝一個jQuery.ajax 的api
滿足條件 jQuery.ajax(url,method,body,success, fail)
程式碼如下:
window.jQuery.ajax = function(url, method, body, success, fail) {
let request = new XMLHttpRequest()
request.open(method, url)
request.onreadystatechange = ()=>{
if(request.readyState === 4) {
if(request.status >= 200 && request.status < 300) {
success.call(undefined, request.responseText)
} else if (request.status >= 400) {
fail.call(undefined, request)
}
}
}
request.send(body)
}
複製程式碼
3. 升級 jQuery.ajax 滿足 Promise 規則
promise的好處
1.完全不需要記是傳 success還是成功或是error還是fail,只需要then(這裡放成功,這裡放失敗),標準化操作
2. 可以對同一個狀態進行多次處理
3.1 升級 jQuery.ajax 滿足 Promise 規則
window.jQuery.ajax = function({url, method}) { // 傳參是 es6解構賦值
return new Promise ( function(resolve, reject){ // 這一行很關鍵
let request = new XMLHttpRequest()
request.open(method, url)
request.onreadystatechange = ()=>{
if(request.readyState === 4) {
if(request.status >= 200 && request.status < 300) {
resolve.call(undefined, request.responseText)
} else if (request.status >= 400) {
reject.call(undefined, request)
}
}
}
request.send()
})
}
複製程式碼