摘要:用于從網絡上獲取數(shù)據,有了對象,就可以實現(xiàn)頁面的無刷新請求數(shù)據,就可以做到一個局部的更新,也可以獲取多種類型的數(shù)據文件。這篇文章主要是分享了中對象的基本屬性和方法從實例化初始化發(fā)送和接受四個階段完成了網絡請求核心內容封裝。
1:基本概念
jQuery的Ajax請求實際上是封裝的一個XHLHttpRequest,從字面意思來看是,XML是一種文件格式,Http是一個網絡請求,Request最開始是用于請求XML文件的,后來不斷擴展可以請求多種類型的文件。
XHLHttpRequest,網絡請求模塊,或者是一個瀏覽器網絡線程。用于從URL網絡上獲取數(shù)據,有了對象,就可以實現(xiàn)頁面的無刷新請求數(shù)據,就可以做到一個局部的更新,也可以獲取多種類型的數(shù)據(ftp、文件)。
2:要實現(xiàn)和使用XMLHttpRequest它是一個對象,首先我們需要實例化,定義一個:
var xhr = new XMLHttpRequest();3:初始化請求,給定一些必要的配置,給它一些property
//Ajax請求時的參數(shù)設置 method 請求方式 url 請求地址 async 是否異步 user 用戶名 password 密碼 xhr.open(method,url,async,user,password);4:發(fā)送請求(encodeURLComponent)
xhr.send(data); 等待接收5:接收網絡請求返回
一般有如下屬性:
responseText,請求返回的數(shù)據內容,可以是一段文本,是一段二進制或者是一個json
responseXML,是一個文件,如果響應頭內容是text/xml,這個屬性將保留響應數(shù)據的XML、DOM文檔。
status,響應的HTTP狀態(tài),如 200(正常,200-300之間都表示成功) 304(使用緩存) 404(沒找到) 500(服務器內部錯誤)等
statusText,HTTP狀態(tài)說明
readyStatus,請求/響應過程的當前活動階段,一共有5個值:0(未被調用open),1(已被調用open但未發(fā)送),2(已調用send),3(已接收到請求返回的數(shù)據),4(請求已完成)。
timeout,設置請求超時時間
xhr.onreadystatechange = () => { if (xhr.readyStatus === 4) { /* HTTP 狀態(tài)在 200-300 之間表示請求成功 */ /* HTTP 狀態(tài)為 304 表示請求內容未發(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ù)據 */ const data = options.data; /* 實例化XMLHttpRequest */ const xhr = new XMLHttpRequest(); /* 設置超時時間 */ if (options.timeout && options.timeout > 0) { xhr.timeout = options.timeout } return new Promise ( (resolve, reject) => { /* 添加超時回調 */ xhr.ontimeout = () => reject && reject("請求超時"); /* 成功回調 */ xhr.onreadystatechange = () => { if (xhr.readyState == 4) { if (xhr.status >= 200 && xhr.status < 300 || xhr.status == 304) { resolve && resolve(xhr.responseText); } else { reject && reject(); } } } /* 失敗回調 */ 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) } }) }
總結:
關于網絡請求,一般常用的有四種:
一個是get,獲取網絡資源
然后是post,一般用于提交數(shù)據,提交數(shù)據的參數(shù)是放在請求的body里面的
delete,刪除
put,標準的一個修改
關于Http的簡單請求和非簡單請求或者是跨域,在跨域時由于瀏覽器的安全機制,涉及到一個問題關于在Ajax請求 ,是在請求之后還是請求之前判斷跨域,這時候就需要了解一下簡單請求和復雜請求。
簡單請求是先把資源請求回來,然后再去判斷是否跨域。如果是一個復雜請求,瀏覽器會先去發(fā)送一個嗅探或者是欲請求(一般是一個option),先判斷是否跨域,如果不是跨域那就執(zhí)行,如果是跨域那就直接不請求了。一般來講,如果get不修改它的Content-Type,那么基本上都是簡單請求。post如果采用www-form的形式,也是一個簡單請求。
這篇文章主要是分享了Javascript中XMLHttpRequest對象的基本屬性和方法, 從實例化、初始化、發(fā)送和接受四個階段完成了Ajax網絡請求核心內容封裝。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/106321.html
摘要:為這些回調函數(shù)分別命名并分離存放可以在形式上減少嵌套,使代碼清晰,但仍然不能解決問題。如果在一個結束成功或失敗,同前面的說明后,添加針對成功或失敗的回調,則回調函數(shù)會立即執(zhí)行。 異步? 我在很多地方都看到過異步(Asynchronous)這個詞,但在我還不是很理解這個概念的時候,卻發(fā)現(xiàn)自己常常會被當做已經很清楚(* ̄? ̄)。 如果你也有類似的情況,沒關系,搜索一下這個詞,就可以得到大致...
摘要:作者后臺使用的是語言,所以這里以后臺為例子不影響學習一原生使用方法創(chuàng)建對象兼容處理處理低版本不兼容問題準備發(fā)送請求方式接口參數(shù)名參數(shù)值異步執(zhí)行發(fā)送回調是表示數(shù)據解析完成,后臺處理完成了。是表示處理的結果是的。 作者后臺使用的是php語言,所以這里以php后臺Api為例子,不影響學習Ajax 一、 javaScript原生使用Ajax 1.get方法 //1.創(chuàng)建對象 兼容處理 var ...
摘要:在這里講解一下用原生如何實現(xiàn)。當然,前面也說過,你可以給定固定回調函數(shù)名最后我已經將和請求合并在一起了,下載鏈接原文鏈接原生實現(xiàn)如有問題,歡迎在下方留言 相信大多數(shù)前端開發(fā)者在需要與后端進行數(shù)據交互時,為了方便快捷,都會選擇JQuery中封裝的AJAX方法,但是有些時候,我們只需要JQuery的AJAX請求方法,而其他的功能用到的很少,這顯然是沒必要的。 其實,原生JavaScript...
摘要:所以說,我們所看到的微博頁面的真實數(shù)據并不是最原始的頁面返回的,而是后來執(zhí)行后再次向后臺發(fā)送了請求,拿到數(shù)據后再進一步渲染出來的。結果提取仍然是拿微博為例,我們接下來用來模擬這些請求,把馬云發(fā)過的微博爬取下來。 上一篇文章:Python3網絡爬蟲實戰(zhàn)---34、數(shù)據存儲:非關系型數(shù)據庫存儲:Redis下一篇文章:Python3網絡爬蟲實戰(zhàn)---36、分析Ajax爬取今日頭條街拍美圖 ...
閱讀 2265·2023-04-25 23:15
閱讀 1917·2021-11-22 09:34
閱讀 1546·2021-11-15 11:39
閱讀 955·2021-11-15 11:37
閱讀 2152·2021-10-14 09:43
閱讀 3493·2021-09-27 13:59
閱讀 1506·2019-08-30 15:43
閱讀 3454·2019-08-30 15:43