http请求概述
當(dāng)瀏覽器輸入網(wǎng)址后
- 首先DOM結(jié)構(gòu),生成DOM TREE
- 自上而下運(yùn)行代碼,加載css等資源內(nèi)容
- 根據(jù)css生成帶樣式的 RENDER TREE
- 開始渲染和繪制
客戶端請(qǐng)求
打開請(qǐng)求:發(fā)送請(qǐng)求之前的一些配置
- POST:向服務(wù)端推送數(shù)據(jù)(傳向服務(wù)端發(fā)送的多,向服務(wù)端獲取的少)
- GET: 向服務(wù)端推送數(shù)據(jù)(傳向服務(wù)端發(fā)送的少,向服務(wù)端獲取的多)
- PUT: 像服務(wù)端存放一些內(nèi)容(一般是存放文件)
- DELETE: 刪除服務(wù)端的的某些內(nèi)容(一般是刪除一些文件)
- HEAD: 只想獲取響應(yīng)頭信息,不要響應(yīng)主體的內(nèi)容
- OPTIONS && TRACE: 一般使用它向服務(wù)器發(fā)送一個(gè)探測(cè)性請(qǐng)求,如果服務(wù)器端返回信息了,說(shuō)明客戶端和服務(wù)器端建立了連接,我們可以繼續(xù)執(zhí)行其它請(qǐng)求了(TRACE就是干這件事的,但是axios這個(gè)AJAX類庫(kù)在基于cross domain進(jìn)行跨域請(qǐng)求的時(shí)候,就是先發(fā)送OPTIONS請(qǐng)求進(jìn)行探測(cè)嘗試,如果能連通服務(wù)器,才會(huì)發(fā)送其他請(qǐng)求)
- CONNECT: 使用TCP直接去連接 的,所以不適合在網(wǎng)頁(yè)開發(fā)中使用
常用的POST && GET請(qǐng)求方式
傳遞服務(wù)器的方式不一樣 GET是URL問(wèn)號(hào)傳參的方式把信息傳到服務(wù)器,POST是基于 請(qǐng)求主題把信息傳到服務(wù)器。
[GET]xhr.open('GET', '/status/list?id=100&name=zhangsan');[POSt]xhr.send('---URL---'); 復(fù)制代碼區(qū)別:
關(guān)于XMLHttpRequest常用內(nèi)置方法
var xhr = XMLHttpRequest() (ie6以下是new ActiveXObject('Microsoft.XMLHTTP')) xhr.response 響應(yīng)主題 xhr.responseText 響應(yīng)主題內(nèi)容(JSON或者XML格式字符串都可以) xhr.responseXML 響應(yīng)主體內(nèi)容是XML文檔 xhr.status 返回HTTP狀態(tài)碼 xhr.statusText 狀態(tài)碼描述 xhr.timeout 設(shè)置請(qǐng)求超時(shí)的時(shí)間 xhr.withCredentials 是否允許跨域 (FALSE) xhr.abort() 強(qiáng)制中斷AJAX請(qǐng)求 xhr.getAllResponseHeaders() 獲取所有響應(yīng)頭信息
實(shí)現(xiàn)簡(jiǎn)易的AJAX庫(kù)
ajax({url: "", //請(qǐng)求地址type: "POST",//請(qǐng)求方式data: { name: "super", age: 20 },//請(qǐng)求參數(shù)dataType: "json",success: function (response, xml) {// 此處放成功后執(zhí)行的代碼},error: function (status) {// 此處放失敗后執(zhí)行的代碼}});function ajax(option) {options = options || {};options.type = (options.type || "GET").toUpperCase();options.dataType = options.dataType || "json";var params = formatParams(options.data);var xhr;//創(chuàng)建 - 第一步if (window.XMLHttpRequest) {xhr = new XMLHttpRequest();} else if(window.ActiveObject) { //IE6及以下xhr = new ActiveXObject('Microsoft.XMLHTTP');}//連接 和 發(fā)送 - 第二步if (options.type == "GET") {xhr.open("GET", options.url + "?" + params, true);xhr.send(null);} else if (options.type == "POST") {xhr.open("POST", options.url, true);//設(shè)置表單提交時(shí)的內(nèi)容類型xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");xhr.send(params);}//接收 - 第三步// xhr.status狀態(tài)碼// 200 OK成功(只能證明服務(wù)器返回信息了,但是信息不一定是業(yè)務(wù)所需要的)// 301 Moved Permanently 永久轉(zhuǎn)移(永久重定向:域名更改,訪問(wèn)原始域名重定向到新的域名)// 302 Move temporarily 臨時(shí)轉(zhuǎn)移(臨時(shí)重定項(xiàng):307:網(wǎng)站現(xiàn)在是基于HTTPS協(xié)議運(yùn)作的,如果訪問(wèn)的是HTTP協(xié)議,會(huì)基于307重定向到HTTPS協(xié)議上)// 302一般用作服務(wù)器負(fù)載均衡:當(dāng)一臺(tái)服務(wù)器達(dá)到最大并發(fā)數(shù)的時(shí)候,會(huì)把后續(xù)訪問(wèn)的用戶臨時(shí)轉(zhuǎn)移到其他服務(wù)器機(jī)組上處理// 偶爾真實(shí)項(xiàng)目中會(huì)把所用的圖片單獨(dú)放到服務(wù)器上“圖片處理服務(wù)器”,這樣減少主服務(wù)器的壓力,當(dāng)用戶向主服務(wù)器訪問(wèn)圖片的時(shí)候,主服務(wù)器都把它轉(zhuǎn)移到圖片服務(wù)器上處理// 304 Not Modified設(shè)置緩存:對(duì)于不經(jīng)常更新的文件,例如:css/js/html/img等,服務(wù)器會(huì)結(jié)合客戶端設(shè)置304緩存,第一次加載的資源會(huì)緩存到客戶端了,下次在獲取的時(shí)候,會(huì)從緩存中加獲取,如果更新了,服務(wù)端會(huì)通過(guò)最后修改時(shí)間來(lái)強(qiáng)制讓客戶端從服務(wù)器從新拉取,基于Ctrl+F5強(qiáng)制刷新頁(yè)面,304的緩存就沒(méi)有用了。// 400 Bad Request 請(qǐng)求參數(shù)錯(cuò)誤// 401 Unauthorized 無(wú)權(quán)限訪問(wèn)// 404 NOt Found 找不到資源(地址不存在)// 413 Request Entity Too Large 和服務(wù)器交互的內(nèi)容資源超過(guò)服務(wù)器最大限制xhr.onreadystatechange = function () {if (xhr.readyState == 4) {var status = xhr.status;if (status >= 200 && status < 300 || status == 304) {options.success && options.success(xhr.responseText, xhr.responseXML);} else {options.error && options.error(status);}}}}// 拼接get方式傳參?號(hào)后面urlfunction formatParams(data) {var arr = [];for (var item in data) {arr.push(item + "=" + data[item]);}arr.push(("v=" + Math.random()).replace("."));return arr.join("&");} 復(fù)制代碼轉(zhuǎn)載于:https://juejin.im/post/5c8ce423518825431116c76b
總結(jié)
- 上一篇: mysql gzip_在mysql中存储
- 下一篇: 虚拟机中访问连接在物理机上的摄像机(使用