摘要:設(shè)置請求和接收響應(yīng)自己封裝簡易這篇文章是承接前幾篇博客的是前幾篇繼續(xù)學(xué)習(xí)包括學(xué)習(xí)與理解和簡化版自己實(shí)現(xiàn)等這篇文章只算是我的個人學(xué)習(xí)筆記內(nèi)容沒有精心排版一些錯誤請見諒所有代碼都在這里從歷史可以看到所有代碼擺闊一個簡易的服務(wù)器所有代碼在歷史里
Ajax設(shè)置請求和接收響應(yīng)、自己封裝簡易jQuery.Ajax
這篇文章是承接前幾篇博客的,是前幾篇繼續(xù)學(xué)習(xí)
包括Ajax學(xué)習(xí)與理解和簡化版自己實(shí)現(xiàn)jQuery等
這篇文章只算是我的個人學(xué)習(xí)筆記,內(nèi)容沒有精心排版,一些錯誤請見諒.
所有代碼都在這里,從歷史commit可以看到所有代碼,擺闊一個簡易的node.js服務(wù)器
所有代碼在歷史commit里(AjaxStudy---github)
一個http請求分為四個部分
請求行,請求頭,回車,請求體
設(shè)置請求的四個部分(第三部分為回車):
第一部分 request.open("get", "/xxx")
第二部分 request.setRequestHeader("content-type","x-www-form-urlencoded")
第四部分 request.send("a=1&b=2")
request.setRequestHeader()方法需要注意的是此方法必須在 open() 方法和 send() 之間調(diào)用。
XMLHttpRequest.setRequestHeader()
另外需要注意的是,如果設(shè)置西請求方法為get 并且設(shè)置了請求體(第四部分),在谷歌瀏覽器中看不到請求體,不報錯但是不顯示
示例代碼:
myButton.addEventListener("click",(e)=>{ let request = new XMLHttpRequest(); request.open("POST","/xxx")//配置request //設(shè)置第二部分 request.setRequestHeader("mataotao","123123xxx") request.setRequestHeader("content-type","x-www-form-urlencoded") request.send("a=1&b=2");//發(fā)送請求 request.onreadystatechange = ()=>{ if(request.readyState ===4){ console.log("請求和響應(yīng)都完畢了"); if ( request.status>=200&&request.status<=400){ console.log("說明請求成功"); let string = request.responseText; //把符合json語法的字符串轉(zhuǎn)化為js對應(yīng)的值 let object2 = window.JSON.parse(string); console.log(object2) }else if(request.status>=400){ console.log("響應(yīng)失敗"); } } } })
查看請求
響應(yīng)的四個部分
獲取四個部分的響應(yīng)
第一部分 request.status / request.statusText
第二部分 request.getResponseHeader() / request.getAllResponseHeaders()
第四部分 request.responseText
myButton.addEventListener("click",(e)=>{ let request = new XMLHttpRequest(); request.open("POST","/xxx")//配置request //設(shè)置第二部分 request.setRequestHeader("mataotao","123123xxx") request.setRequestHeader("content-type","x-www-form-urlencoded") request.send("a=1&b=2");//發(fā)送請求 request.onreadystatechange = ()=>{ if(request.readyState ===4){ console.log("請求和響應(yīng)都完畢了"); if ( request.status>=200&&request.status<=400){ console.log("說明請求成功"); //*核心代碼 */ //第一部分: console.log("獲取響應(yīng)第一部分:") console.log(request.status)//200 console.log(request.statusText)//ok //第二部分: console.log("獲取響應(yīng)第二部分:") console.log(request.getResponseHeader("Content-Type")) console.log(request.getAllResponseHeaders()) //第四部分: console.log("獲取響應(yīng)第四部分:") console.log(request.responseText) //*核心代碼 */ let string = request.responseText; //把符合json語法的字符串轉(zhuǎn)化為js對應(yīng)的值 let object2 = window.JSON.parse(string); // console.log(object2) }else if(request.status>=400){ console.log("響應(yīng)失敗"); } } } })3 客戶端/服務(wù)器模型
客戶端使用js設(shè)置請求的四個部分,
服務(wù)器用nodejs也可以設(shè)置響應(yīng)的四個部分
三次握手:
A:我能連你了嗎?
B: 可以連我,你連吧
A:那我連你了
開始發(fā)送數(shù)據(jù)
原因:因?yàn)橐WCA/B 都可以收發(fā)信息 ,數(shù)據(jù)才能在AB之間傳輸
1.
A:我能連你了嗎?
B: 可以
說明A可以發(fā)信息,B可以接受信息
2.
B: 可以連我,你連吧
A:那我連你了
說明B可以發(fā)送信息,A可以接受信息
所有代碼在歷史commit里(AjaxStudy---github)
3.1 方法一window.jQuery = ()=>{//假裝有一個簡易的jQuery,具體封裝 let object1 = {}; boject1.addClass = function(){}; boject1.show = function(){}; return object1; } window.jQuery.ajax = (method,path,body,successFn,failFn)=>{ let request = new XMLHttpRequest(); request.open(method,path) request.send(body); request.onreadystatechange = ()=>{ if(request.readyState ===4){ if ( request.status>=200&&request.status<=400){ successFn.call(undefined,request.responseText)//執(zhí)行成功函數(shù) }else if(request.status>=400){ failFn.call(undefined,request)//執(zhí)行失敗函數(shù) } } } } window.$ = window.jQuery; myButton.addEventListener("click",(e)=>{ //使用ajax $.ajax("post", "/xxx", "username=mtt&password=1", function(result){ console.log("成功了,返回的響應(yīng)體為:") console.log(result);//打印request.responseText }, function(result){ console.log(result); console.log(result.status);//打印失敗的狀態(tài)碼 console.log(result.responseText);//打印失敗時返回的響應(yīng)體 } ) })
結(jié)果:
成功時:
失敗時:(假如請求一個不存在的路徑,響應(yīng)狀態(tài)碼是404,但是也有響應(yīng)體responseText)
例如,訪問一個不存在的路徑/frank:
myButton.addEventListener("click",(e)=>{ //使用ajax $.ajax("post", "/frank", "username=mtt&password=1", function(result){ console.log("成功了,返回的響應(yīng)體為:") console.log(result);//打印request.responseText }, function(result){ console.log(result); console.log(result.status);//打印失敗的狀態(tài)碼 console.log(result.responseText);//打印失敗時返回的響應(yīng)體 } ) })
返回狀態(tài)碼404,而且有設(shè)置的返回體
因?yàn)槲业姆?wù)器端的代碼為:
else { response.statusCode = 404 response.setHeader("Content-Type", "text/html;charset=utf-8") response.write(`{ "error":"404error" }`) response.end() }
這種方法的缺點(diǎn):這個函數(shù)必須按照規(guī)定的順序傳參,第二,如果沒有參數(shù)就會出現(xiàn)類似于$.ajax("post",null,successFn,null)的情況,必須傳有結(jié)構(gòu)的參數(shù)(對象)
3.2什么是回調(diào)在上面的代碼中,在ajax函數(shù)中傳了一個successFN,failFn函數(shù)作為參數(shù),但是執(zhí)行的時候是在別的地方執(zhí)行的(在request.onreadystatechange里)
if(request.readyState ===4){ if ( request.status>=200&&request.status<=400){ successFn.call(undefined,request.responseText)//執(zhí)行成功函數(shù) }else if(request.status>=400){ failFn.call(undefined,request)//執(zhí)行失敗函數(shù)
這兩個函數(shù)就是回調(diào)函數(shù)
回調(diào)(callback):
回來執(zhí)行的意思,自己不call.
把這個函數(shù)給別人,自己不執(zhí)行,讓別人執(zhí)行,就是callback
回調(diào):使用方代碼不執(zhí)行,只傳一個函數(shù),回來再執(zhí)行
回調(diào)就是傳一個函數(shù),自己不執(zhí)行,傳到別的地方讓他在那里執(zhí)行的函數(shù)!只要滿足這個條件就叫回調(diào)而已.他是一個函數(shù),只不過在別的地方執(zhí)行了
所以看上去沒有執(zhí)行,實(shí)際上success了就執(zhí)行傳進(jìn)去的這個函數(shù)
3.3封裝方法二:傳有結(jié)構(gòu)的參數(shù)(對象)let myButton = document.getElementById("myButton"); window.jQuery = ()=>{//假裝有一個簡易的jQuery let object1 = {}; boject1.addClass = function(){}; boject1.show = function(){}; return object1; } window.jQuery.ajax = (options)=>{ //獲取傳進(jìn)來的對象的value let method = options.method; let path = options.path; let body = options.body; let successFn = options.successFn; let failFn = options.failFn; let headers = options.headers; let request = new XMLHttpRequest(); request.open(method,path);//配置 for (const key in headers) {//遍歷header,設(shè)置響應(yīng)頭 let value = headers[key]; request.setRequestHeader(key,value); } request.send(body);//發(fā)送,并配置響應(yīng)體 request.onreadystatechange = ()=>{ if(request.readyState ===4){ if ( request.status>=200&&request.status<=400){ successFn.call(undefined,request.responseText);//執(zhí)行成功函數(shù) }else if(request.status>=400){ failFn.call(undefined,request);//執(zhí)行失敗函數(shù) } } } } window.$ = window.jQuery; myButton.addEventListener("click",(e)=>{ //使用ajax $.ajax({ method:"post", path:"/xxx", body:"username=mtt&password=1", headers:{ "content-type":"application/x-www-form-urlencoded", "mataotao":18 }, successFn:function(result){//成功函數(shù)的回調(diào) console.log("成功了,返回的響應(yīng)體為:"); console.log(result);//打印request.responseTex }, failFn:function(){ console.log(result); console.log(result.status);//打印失敗的狀態(tài)碼 console.log(result.responseText);//打印失敗時返回的響應(yīng)體 } } ) })
結(jié)果:
4真正的jQuery.ajax()API如何使用jQuery.ajax()API
例子
$.ajax({ type: "GET", url: "/test", dataType: "script", data:{} success:function(){}, });
dataType就是setRequestHeader("content-type","application/javascript")
data就是請求的第四部分
5函數(shù)傳不同的參數(shù)例如文檔里的
jQuery.ajax( url [, settings ] )
jQuery.ajax( [settings ] )
jQuery.ajax第一個參數(shù)既可以是url字符串你也可以是對象
如何實(shí)現(xiàn)這種封裝?
只要在最開始判斷參數(shù)長度即可
let url; if(arguments.length===1){//參數(shù)長度為1 url = options.url; }else if(arguments.length===2){//參數(shù)長度為2 url = arguments[0]; options = arguments[1]; }
其余代碼不變
解構(gòu)賦值MDN
或者直接
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/96605.html
摘要:回調(diào)使用封裝入門回調(diào)是啥看這里回調(diào)是什么方應(yīng)杭知乎是一種特殊的函數(shù),這個函數(shù)被作為參數(shù)傳給另一個函數(shù)去調(diào)用。 回調(diào)、使用Promise封裝ajax()、Promise入門 1 回調(diào)是啥 call a functioncall a function back callback 看這里:Callback(回調(diào))是什么?---方應(yīng)杭知乎 callback 是一種特殊的函數(shù),這個函數(shù)被作為參數(shù)...
摘要:如下用回調(diào)最大的問題是回調(diào)函數(shù)沒有命名規(guī)范,每個開發(fā)者都有自己的風(fēng)格,一旦引用了多個庫,各個庫之間的回調(diào)函數(shù)可能會互相影響,的出現(xiàn)正好解決了這個問題。 AJAX 的所有功能 AJAX 出現(xiàn)之后解決了前后端交互問題,前端也正式走向前臺。AJAX 最核心的8句話 1. let request = new XMLHttpRequest() 2. request.onreadystatecha...
摘要:當(dāng)請求完成后注冊一個回調(diào)函數(shù)。該請求是否觸發(fā)全局處理事件如等,請求發(fā)送前的回調(diào)函數(shù),用來修改請求發(fā)送前,此功能可用來設(shè)置自定義頭信息,在函數(shù)中返回將取消這個請求。例如,為請求指定一個回調(diào)函數(shù)名。即改變回調(diào)函數(shù)的,默認(rèn)就是傳入的整個對象。 Ajax Ajax 全稱是 asynchronous javascript and xml,并不是新的編程語言,可以說是已有技術(shù)的組合,主要用來實(shí)現(xiàn)客...
摘要:通過高度變化來切換所有匹配元素的可見性,并在切換完成后可選地觸發(fā)一個回調(diào)函數(shù)。請求完成后回調(diào)函數(shù)請求成功或失敗時均調(diào)用。 一、JQuery對象的基本方法: (1) get(); 取得所有匹配的元素 (2) get(index); 取得其中一個匹配的元素 $(this).get(0) 等同于 $(this)[0] (3) Number index(jqueryObj); 搜索子對象 (...
摘要:是在收到響應(yīng)后執(zhí)行的函數(shù),可以不用返回。一步步介紹了如何構(gòu)建以及使用中間層,來統(tǒng)一管理接口地址,最后還介紹了下中間件等高級功能。 零、問題的由來 開門見山地說,這篇文章是一篇安利軟文~,安利的對象就是最近搞的 tua-api。 顧名思義,這就是一款輔助獲取接口數(shù)據(jù)的工具。 發(fā)請求相關(guān)的工具辣么多,那我為啥要用你呢? 理想狀態(tài)下,項(xiàng)目中應(yīng)該有一個 api 中間層。各種接口在這里定義,業(yè)務(wù)...
閱讀 3496·2021-10-18 13:30
閱讀 2951·2021-10-09 09:44
閱讀 1969·2019-08-30 11:26
閱讀 2299·2019-08-29 13:17
閱讀 765·2019-08-29 12:17
閱讀 2253·2019-08-26 18:42
閱讀 478·2019-08-26 13:24
閱讀 2960·2019-08-26 11:39