前端知識體系8.前后端通訊

本文目錄:

  • 1.HTTPS和HTTP的區(qū)別
  • 2.http1.0、1.1偏陪、2.0酪耳、3.0的區(qū)別浓恳?
  • 3.你了解哪些請求方法,分別有哪些作用和不同
  • 4.什么是CA證書碗暗?整個網(wǎng)站進(jìn)行驗證的流程是什么颈将?
  • 5.SOCKET?UDP言疗?DNS晴圾?FTP?以及不常用的其他協(xié)議噪奄?
  • 6.HTTP協(xié)議常見的狀態(tài)碼
  • 7.說一下AJAX和AXIOS的區(qū)別
  • 8.URL從輸入到輸出的過程
  • 9.前后端聯(lián)調(diào)之Form Data與Request Payload
  • 10.post請求的form-data和x-www-form-urlencoded和raw和binary了解多少死姚,在使用axios發(fā)請求的時候怎么對這些進(jìn)行處理
  • 11.說下HTTP常見的請求頭和響應(yīng)頭
  • 12.怎么與服務(wù)端保持連接
  • 13.http請求跨域問題及解決方法,JSONP和ajax有什么區(qū)別
  • 14.說下HTTP的報文結(jié)構(gòu)
  • 15.說說Get和Post的區(qū)別
  • 16.什么是無狀態(tài)協(xié)議勤篮,HTTP 是無狀態(tài)協(xié)議嗎都毒,怎么解決(JWT)
  • 17.說說你了解的HTTP 的緩存策略
  • 18.在你開發(fā)的過程中,什么情況下會遇到跨域問題碰缔,你是怎么解決的账劲?
  • 19.什么是HTTP鏈接的管線化
  • 20.前后端通訊的主要方式
  • 21.前端請求的常用觸發(fā)方式
  • 22.為什么TCP建立連接不能是兩次握手?
  • 23.為什么TCP斷開連接揮手需要四次金抡?
  • 24.瀏覽器輸入localhost開頭的地址訪問會發(fā)生什么瀑焦?

1.HTTPS和HTTP的區(qū)別

HTTPS和HTTP的區(qū)別主要如下:
1、https協(xié)議需要到ca申請證書梗肝,一般免費證書較少榛瓮,因而需要一定費用。
2巫击、http是超文本傳輸協(xié)議禀晓,信息是明文傳輸精续,https則是具有安全性的ssl加密傳輸協(xié)議。
3匆绣、http和https使用的是完全不同的連接方式驻右,用的端口也不一樣,前者是80崎淳,后者是443堪夭。
4、http的連接很簡單拣凹,是無狀態(tài)的森爽;HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議嚣镜,比http協(xié)議安全爬迟。

2.http1.0、1.1菊匿、2.0付呕、3.0的區(qū)別?

http 1.0
短連接跌捆,每個資源文件都需要一次tcp三次握手和四次揮手徽职,耗費網(wǎng)絡(luò)資源
線頭阻塞,請求隊列的第一個請求因為服務(wù)器正忙(或請求格式問題等其他原因)佩厚,導(dǎo)致后面的請求被阻塞姆钉。
http 1.1
長連接,keep-alive抄瓦,一次流程即可
使用多個TCP鏈接潮瓶,客戶端可以并行發(fā)送最多 N個請求,服務(wù)器可以并行處理最多 N個請求
增了許多動詞方法:PUT钙姊、PATCH毯辅、HEAD、 OPTIONS煞额、DELETE
擴(kuò)充了請求頭和響應(yīng)頭的一些功能悉罕,比如請求頭信息新增了Host字段,用來指定服務(wù)器的域名
http 2.0
長連接+IO多路復(fù)用模型
Header壓縮立镶,在HTTP1.0中,我們使用文本的形式傳輸header类早,在header中攜帶cookie的話媚媒,每次都需要重復(fù)傳輸幾百到幾千的字節(jié),這著實是一筆不小的開銷涩僻。在HTTP2.0中缭召,我們使用了HPACK(HTTP2頭部壓縮算法)壓縮格式對傳輸?shù)膆eader進(jìn)行編碼栈顷,減少了header的大小。并在兩端維護(hù)了索引表嵌巷,用于記錄出現(xiàn)過的header萄凤,后面在傳輸過程中就可以傳輸已經(jīng)記錄過的header的鍵名,對端收到數(shù)據(jù)后就可以通過鍵名找到對應(yīng)的值搪哪。
http 3.0
谷歌開發(fā)的QUIC協(xié)議靡努,利用UDP實現(xiàn)可靠數(shù)據(jù)傳輸。

3.你了解哪些請求方法晓折,分別有哪些作用和不同

HTTP 協(xié)議中共定義了八種方法或者叫“動作”來表明對 Request-URI 指定的資源的不同操作方式惑朦,具體介紹如下:
OPTIONS:返回服務(wù)器針對特定資源所支持的HTTP請求方法。也可以利用向Web服務(wù)器發(fā)送'*'的請求來測試服務(wù)器的功能性漓概。
HEAD:向服務(wù)器索要與GET請求相一致的響應(yīng)漾月,只不過響應(yīng)體將不會被返回。這一方法可以在不必傳輸整個響應(yīng)內(nèi)容的情況下胃珍,就可以獲取包含在響應(yīng)消息頭中的元信息梁肿。
GET:向特定的資源發(fā)出請求。
POST:向指定資源提交數(shù)據(jù)進(jìn)行處理請求(例如提交表單或者上傳文件)觅彰。數(shù)據(jù)被包含在請求體中吩蔑。POST請求可能會導(dǎo)致新的資源的創(chuàng)建和/或已有資源的修改。
PUT:向指定資源位置上傳其最新內(nèi)容缔莲。
DELETE:請求服務(wù)器刪除 Request-URI 所標(biāo)識的資源哥纫。
TRACE:回顯服務(wù)器收到的請求,主要用于測試或診斷痴奏。
CONNECT:HTTP/1.1 協(xié)議中預(yù)留給能夠?qū)⑦B接改為管道方式的代理服務(wù)器蛀骇。
雖然 HTTP 的請求方式有 8 種,但是我們在實際應(yīng)用中常用的也就是 get 和 post读拆,其他請求方式也都可以通過這兩種方式間接的來實現(xiàn)擅憔。

4.什么是CA證書?整個網(wǎng)站進(jìn)行驗證的流程是什么檐晕?

CA證書就是電子商務(wù)認(rèn)證授權(quán)機(jī)構(gòu)暑诸,也稱為電子商務(wù)認(rèn)證中心,是負(fù)責(zé)發(fā)放和復(fù)管理數(shù)字證書的權(quán)威機(jī)構(gòu)辟灰,并作為電子商務(wù)交易中受信任的第三方,承擔(dān)公鑰體系中公鑰的合法性檢驗的責(zé)任制芥喇。
HTTPS的整體過程分為證書驗證和數(shù)據(jù)傳輸階段西采,具體的交互過程如下:
① 證書驗證階段
1.瀏覽器發(fā)起 HTTPS 請求
2.服務(wù)端返回 HTTPS 證書
3.客戶端驗證證書是否合法,如果不合法則提示告警
② 數(shù)據(jù)傳輸階段
1.當(dāng)證書驗證合法后继控,在本地生成隨機(jī)數(shù)
2.通過公鑰加密隨機(jī)數(shù)械馆,并把加密后的隨機(jī)數(shù)傳輸?shù)椒?wù)端
3.服務(wù)端通過私鑰對隨機(jī)數(shù)進(jìn)行解密
4.服務(wù)端通過客戶端傳入的隨機(jī)數(shù)構(gòu)造對稱加密算法胖眷,對返回結(jié)果內(nèi)容進(jìn)行加密后傳輸

5.SOCKET?UDP霹崎?DNS珊搀?FTP?以及不常用的其他協(xié)議尾菇?

SOCKET
套接字(socket)是通信的基石境析,是支持TCP/IP協(xié)議的網(wǎng)絡(luò)通信的基本操作單元。它是網(wǎng)絡(luò)通信過程中端點的抽象表示错沽,包含進(jìn)行網(wǎng)絡(luò)通信必須的五種信息:連接使用的協(xié)議簿晓,本地主機(jī)的IP地址,本地進(jìn)程的協(xié)議端口千埃,遠(yuǎn)地主機(jī)的IP地址憔儿,遠(yuǎn)地進(jìn)程的協(xié)議端口。
SOCKET連接與TCP連接
Socket是對TCP/IP協(xié)議的封裝放可,Socket本身并不是協(xié)議谒臼,而是一個調(diào)用接口(API),通過Socket耀里,我們才能使用TCP/IP協(xié)議蜈缤。
創(chuàng)建Socket連接時,可以指定使用的傳輸層協(xié)議冯挎,Socket可以支持不同的傳輸層協(xié)議(TCP或UDP)底哥,當(dāng)使用TCP協(xié)議進(jìn)行連接時,該Socket連接就是一個TCP連接房官。
HTTP和TCP
TCP是底層通訊協(xié)議趾徽,定義的是數(shù)據(jù)傳輸和連接方式的規(guī)范
HTTP是應(yīng)用層協(xié)議,定義的是傳輸數(shù)據(jù)的內(nèi)容的規(guī)范
HTTP協(xié)議中的數(shù)據(jù)是利用TCP協(xié)議傳輸?shù)暮彩兀灾С諬TTP也就一定支持TCP
TCP/IP協(xié)議
TCP/IP協(xié)議是一個協(xié)議簇孵奶。里面包括很多協(xié)議的,UDP只是其中的一個蜡峰, 之所以命名為TCP/IP協(xié)議了袁,因為TCP、IP協(xié)議是兩個很重要的協(xié)議湿颅,就用他倆命名了载绿。
TCP和UDP
都屬于是網(wǎng)絡(luò)數(shù)據(jù)的傳輸協(xié)議,UDP建立連接需要三次握手油航,斷開連接需要四次揮手卢鹦,安全可靠性更強(qiáng),但是傳輸效率相對UDP低,UDP發(fā)送數(shù)據(jù)之前不需要建立連接冀自。TCP連接只能是點到點、一對一的秒啦,而UDP支持一對一熬粗,一對多,多對一和多對多的交互通信余境,對實時性要求高的情景如視頻通話等適用于UDP協(xié)議驻呐。
DNS
域名系統(tǒng)(服務(wù))協(xié)議(DNS)是一種分布式網(wǎng)絡(luò)目錄服務(wù),主要用于域名與 IP 地址的相互轉(zhuǎn)換芳来,以及控制因特網(wǎng)的電子郵件的發(fā)送含末。
由根DNS服務(wù)器、頂級域 DNS 服務(wù)器和權(quán)威 DNS 服務(wù)器組成即舌。
解析順序是首先從瀏覽器緩存佣盒、操作系統(tǒng)緩存以及本地 DNS 緩存 (/etc/hosts) 逐級查找,然后從本地 DNS 服務(wù)器顽聂、根 DNS肥惭、頂級 DNS 以及權(quán)威 DNS層層遞歸查詢。
還可以基于域名在內(nèi)網(wǎng)紊搪、外網(wǎng)進(jìn)行負(fù)載均衡蜜葱。
FTP
FTP(文件道傳輸) FTP就是文件傳輸協(xié)議,通過FTP,用戶可以從Internet網(wǎng)上的一臺內(nèi)機(jī)器向另一臺機(jī)器復(fù)制文件耀石,可以用這種方式獲取大量的文檔牵囤,數(shù)據(jù)和其他的信息。

6.HTTP協(xié)議常見的狀態(tài)碼

1xx: 表示目前是協(xié)議處理的中間狀態(tài)滞伟,還需要后續(xù)操作揭鳞。
2xx: 表示成功狀態(tài)。
3xx: 重定向狀態(tài)诗良,資源位置發(fā)生變動汹桦,需要重新請求。
4xx: 請求報文有誤鉴裹。
5xx: 服務(wù)器端發(fā)生錯誤舞骆。
具體常見的一些狀態(tài)碼
200-請求成功
301-永久重定向
302和307-臨時重定向
304-客戶端有緩存的文檔并發(fā)出了一個條件性的請求,服務(wù)器告訴客戶端径荔,原來緩存的文檔還可以繼續(xù)使用
400-當(dāng)前請求不能被服務(wù)器理解或請求參數(shù)有誤
401-請求需要認(rèn)證或認(rèn)證失敗
403-服務(wù)器禁止訪問
404-資源未找到
405-方法未允許
500-內(nèi)部服務(wù)器錯誤
502-網(wǎng)關(guān)錯誤
503-服務(wù)器處于超負(fù)載或停機(jī)維護(hù)

7.說一下AJAX和AXIOS的區(qū)別

AJAX
AJAX最初作用就是在不重新加載整個頁面的情況下與服務(wù)器交換數(shù)據(jù)并更新部分網(wǎng)頁督禽。
本身是為了針對MVC編程而誕生的。
AJAX是異步的JavaScript 和 XML(標(biāo)準(zhǔn)通用標(biāo)記語言的子集)总处。
AXIOS
AXIOS是一個基于Promise 用于瀏覽器和 nodejs 的 HTTP 客戶端狈惫,本質(zhì)上也是對原生XHR的封裝,只不過它是Promise的實現(xiàn)版本,符合最新的ES規(guī)范胧谈。

8.URL從輸入到輸出的過程

    1. 構(gòu)建請求
      構(gòu)建請求行忆肾,請求行包括請求方法、請求http版本等
    1. 查找強(qiáng)緩存
      檢查強(qiáng)緩存菱肖,命中則直接使用客冈,否則檢查協(xié)商緩存
    1. DNS解析
      瀏覽器首先會查看本地硬盤的hosts文件,看看有沒有域名對應(yīng)的規(guī)則稳强,如果有的話直接使用hosts文件里對應(yīng)的ip地址场仲,如果沒有則會發(fā)出DNS請求域名與IP地址映射
  • 4.建立tcp連接
    chrome限制同一域名下最多6個tcp連接
    通過三次握手建立連接
    三次握手過程:
    1.客戶端向服務(wù)器發(fā)送連接請求,傳遞一個數(shù)據(jù)包syn退疫,此時客戶端處于SYN_SEND狀態(tài)
    2.服務(wù)器接收syn報文后渠缕,會以自己的syn報文作為應(yīng)答,傳遞數(shù)據(jù)包syn+ack,此時服務(wù)器處于SYN-REVD狀態(tài)
    3.客戶端接收syn報文后褒繁,發(fā)送一個數(shù)據(jù)包ack亦鳞,此時客戶端處于ESTABLISHED狀態(tài),雙方已建立連接
    進(jìn)行數(shù)據(jù)傳輸
    通過四次揮手?jǐn)嚅_連接
    四次揮手過程:
  1. 客戶端發(fā)送一個FIN報文澜汤,報文中指定一個序列號蚜迅,此時客戶端處于FIN_WAIT1狀態(tài),等待服務(wù)器確認(rèn)
  2. 服務(wù)器接收到FIN后俊抵,會發(fā)送ACK確認(rèn)報文谁不,表明已經(jīng)收到客戶端報文,此時服務(wù)端處于CLOSE_WAIT2狀態(tài)
  3. 服務(wù)器發(fā)送FIN徽诲,告訴客戶端想斷開連接刹帕,此時服務(wù)端處于LAST_CHECK階段
  4. 客戶端收到FIN后,一樣發(fā)送一個ACK作為應(yīng)答谎替,此時客戶端處于TIME_WAIT階段爪膊。需要過一段時間確認(rèn)服務(wù)端收到自己的ACK報文
    后才會進(jìn)入CLOSED狀態(tài)
    5.發(fā)送http請求
    6.網(wǎng)絡(luò)響應(yīng)
    7.瀏覽器解析和渲染
    分為構(gòu)建dom樹追逮、樣式計算、生成布局樹。
    8.生成布局
    觸發(fā)回流和重繪

9.前后端聯(lián)調(diào)之Form Data與Request Payload

Request Payload更準(zhǔn)確的說是http request的payload body撒会。一般用在數(shù)據(jù)通過POST請求或者PUT請求器躏。它是HTTP請求中空行的后面那部分波俄。(PS:這里涉及一個http常被問到的問題侥加,http請求由哪幾部分組成,一般是請求行弃锐,請求頭袄友,空行,請求體霹菊。payload body應(yīng)該是對應(yīng)請求體剧蚣。)
如果你正常請求一個ajax。瀏覽器會簡單的將你提交的內(nèi)容作為payload展示出來,這就是它所能做的鸠按,因為它不知道數(shù)據(jù)來自哪里礼搁。
如果你提交了一個html表單并且配置上了method="post",并且設(shè)置了Content-Type: application/x-www-form-urlencoded或者Content-Type: multipart/form-data目尖。那么你的請求可能長這個樣:

POST /some-path HTTP/1.1
Content-Type: application/x-www-form-urlencoded
foo=bar&name=John

這里的form-data就是request payload叹坦。在這里,瀏覽器知道更多:它知道bar是提交表單的輸入字段foo的值卑雁。這就是它向你展示的。
所以區(qū)別就是绪囱,他們只是因為Content-Type設(shè)置的不同测蹲,并不是數(shù)據(jù)提交方式的不同,這兩種提交都會將數(shù)據(jù)放在message-body中鬼吵。但是chrome瀏覽器的開發(fā)者工具會根據(jù)這個ContentType區(qū)分顯示方式扣甲。
Content-Type的差異
1.傳統(tǒng)的ajax請求時候,Content-Type默認(rèn)為"文本"類型齿椅。
2.傳統(tǒng)的form提交的時候琉挖,Content-Type默認(rèn)為"Form"類型。
3.axios傳遞字符串的時候涣脚,Content-Type默認(rèn)為"Form"類型示辈。
4.axios傳遞對象的時候,Content-Type默認(rèn)為"JSON"類型
無論何種形式傳遞遣蚀,后端解析表單信息的時候矾麻,會考慮Content-Type。如果是JSON字符串的話芭梯,后端解析payload的內(nèi)容時候险耀,肯定要去解析JSON啦。如果是key1=value1&key2=value2的形式玖喘,則需要去分割字符串甩牺。
當(dāng)然這些事情一般后端使用的框架會去處理,但是框架給后端提供取值接口有可能是不同的累奈,所以前端的小伙伴在處理請求問題時贬派,一定要跟后端小伙伴商量好,是用JSON還是FormData费尽。

10.post請求的form-data和x-www-form-urlencoded和raw和binary了解多少赠群,在使用axios發(fā)請求的時候怎么對這些進(jìn)行處理

**1.multipart/form-data **
使用表單上傳文件時,必須讓 form 的 enctyped 等于這個值旱幼。
multipart/form-data既可以上傳文件查描,也可以上傳鍵值對,它采用了鍵值對的方式,所以可以上傳多個文件冬三。
2.x-www-form-urlencoded:
瀏覽器的原生form 表單匀油,如果不設(shè)置enctype屬性,那么最終就會以 application/x-www-form-urlencoded 方式提交數(shù)據(jù)勾笆。請求類似于下面這樣

POST http://www.example.com HTTP/1.1
Content-Type: application/x-www-form-urlencoded;charset=utf-8
title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3

提交的數(shù)據(jù)按照 key1=val1&key2=val2 的方式進(jìn)行編碼敌蚜,key 和 val 都進(jìn)行了 URL 轉(zhuǎn)碼。jQuery的Ajax的默認(rèn)Content-Type就是這種窝爪。
3.raw
可以上傳任意格式的文本弛车,可以上傳text、json蒲每、xml纷跛、html等
4.binary
相當(dāng)于Content-Type:application/octet-stream,從字面意思得知,只可以上傳二進(jìn)制數(shù)據(jù)邀杏,通常用來上傳文件贫奠,由于沒有鍵值,所以望蜡,一次只能上傳一個文件唤崭。
5.application/json
JSON格式支持比鍵值對復(fù)雜得多的結(jié)構(gòu)化數(shù)據(jù),所以application/json是比application/x-www-form-urlencoded更適合復(fù)雜交互的替代品脖律,Axios的Content-Type默認(rèn)就是application/json
6.text/xml
text/xml傳輸?shù)氖荴ML結(jié)構(gòu)的數(shù)據(jù)谢肾,語言顯得有些臃腫,雖用途也很廣泛状您,但我們在實際項目中還是用json更加靈活方便勒叠。

POST http://www.example.com HTTP/1.1
Content-Type: text/xml
<?xml version="1.0"?>
<methodCall>
    <methodName>examples.getStateName</methodName>
    <params>
        <param>
            <value><i4>41</i4></value>
        </param>
    </params>
</methodCall>

修改axios請求的頭部
首先需要明確一點,當(dāng)使用axios發(fā)送對象數(shù)據(jù)的時候膏孟,axios默認(rèn)的請求頭content-type類型眯分。如果前后端的content-type設(shè)置不一樣,會導(dǎo)致請求數(shù)據(jù)獲取不到柒桑。明明自己的請求地址和參數(shù)都對了卻得不到數(shù)據(jù)弊决。
axios修改content-type可以選擇引用axios自帶的qs

import axios from 'axios'
import qs from 'querystring'
//如果想傳過去的參數(shù)是字符串就是這用形式
axios.post(url, qs.stringify(params), {
  headers: {
    'Content-Type': 'application/json;charset=UTF-8'
  },
}).then(res => res.data)
//如果想傳過去的參數(shù)是對象就是這用形式
axios.post(url, qs.parse(qs.stringify(params)), {
  headers: {
    'Content-Type': 'application/json;charset=UTF-8'
  }

11.說下HTTP常見的請求頭和響應(yīng)頭

HTTP 標(biāo)頭會分為四種,分別是 通用標(biāo)頭魁淳、實體標(biāo)頭飘诗、請求標(biāo)頭、響應(yīng)標(biāo)頭界逛。分別介紹一下:

通用標(biāo)頭

Date
Date 是一個通用標(biāo)頭昆稿,它可以出現(xiàn)在請求標(biāo)頭和響應(yīng)標(biāo)頭中,它的基本表示如下
Date: Wed, 21 Oct 2015 07:28:00 GMT
表示的是格林威治標(biāo)準(zhǔn)時間息拜,這個時間要比北京時間慢八個小時
Cache-Control
Cache-Control 是一個通用標(biāo)頭溉潭,他可以出現(xiàn)在請求標(biāo)頭和響應(yīng)標(biāo)頭中净响,Cache-Control 的種類比較多,雖然說這是一個通用標(biāo)頭喳瓣,但是有一些特性是請求標(biāo)頭具有的馋贤,有一些是響應(yīng)標(biāo)頭才有的。主要大類有 可緩存性畏陕、閾值性配乓、 重新驗證并重新加載 和其他特性
Connection
Connection 決定當(dāng)前事務(wù)(一次三次握手和四次揮手)完成后,是否會關(guān)閉網(wǎng)絡(luò)連接惠毁。Connection 有兩種犹芹,一種是持久性連接,即一次事務(wù)完成后不關(guān)閉網(wǎng)絡(luò)連接
Connection: keep-alive
另一種是非持久性連接鞠绰,即一次事務(wù)完成后關(guān)閉網(wǎng)絡(luò)連接
Connection: close
Cache-Control
控制緩存的行為

實體標(biāo)頭

實體標(biāo)頭是描述消息正文內(nèi)容的 HTTP 標(biāo)頭羽莺。實體標(biāo)頭用于 HTTP 請求和響應(yīng)中。頭部Content-Length洞豁、 Content-Language、 Content-Encoding荒给、 Content-Type是實體頭丈挟。
Content-Type:實體主體的媒體類型

請求標(biāo)頭

Host:
Host 請求頭指明了服務(wù)器的域名(對于虛擬主機(jī)來說),以及(可選的)服務(wù)器監(jiān)聽的 TCP 端口號志电。如果沒有給定端口號曙咽,會自動使用被請求服務(wù)的默認(rèn)端口(比如請求一個 HTTP 的 URL 會自動使用 80 作為端口)。
Referer:
HTTP Referer 屬性是請求標(biāo)頭的一部分挑辆,當(dāng)瀏覽器向 web 服務(wù)器發(fā)送請求的時候例朱,一般會帶上 Referer,告訴服務(wù)器該網(wǎng)頁是從哪個頁面鏈接過來的鱼蝉,服務(wù)器因此可以獲得一些信息用于處理洒嗤。
Referer: https://developer.mozilla.org/testpage.html
Accept:
接受請求 HTTP 標(biāo)頭會通告客戶端其能夠理解的 MIME 類型

響應(yīng)標(biāo)頭

Access-Control-Allow-Origin:
一個返回的 HTTP 標(biāo)頭可能會具有 Access-Control-Allow-Origin ,Access-Control-Allow-Origin 指定一個來源魁亦,它告訴瀏覽器允許該來源進(jìn)行資源訪問渔隶。
Keep-Alive:
Keep-Alive 表示的是 Connection 非持續(xù)連接的存活時間,可以進(jìn)行指定洁奈。
Set-Cookie
Set-Cookie 用于服務(wù)器向客戶端發(fā)送 sessionID间唉。
Expires:
響應(yīng)過期的日期和時間。

12.怎么與服務(wù)端保持連接

WebSocket 是 HTML5 開始提供的一種在單個 TCP 連接上進(jìn)行全雙工通訊的協(xié)議利术。使得客戶端和服務(wù)器之間的數(shù)據(jù)交換變得更加簡單呈野,允許服務(wù)端主動向客戶端推送數(shù)據(jù)。在 WebSocket API 中印叁,瀏覽器和服務(wù)器只需要完成一次握手被冒,兩者之間就直接可以創(chuàng)建持久性的連接军掂,并進(jìn)行雙向數(shù)據(jù)傳輸。
很多網(wǎng)站為了實現(xiàn)推送技術(shù)姆打,所用的技術(shù)都是 Ajax 輪詢良姆。輪詢是在特定的的時間間隔(如每1秒),由瀏覽器對服務(wù)器發(fā)出HTTP請求幔戏,然后由服務(wù)器返回最新的數(shù)據(jù)給客戶端的瀏覽器玛追。這種傳統(tǒng)的模式帶來很明顯的缺點,即瀏覽器需要不斷的向服務(wù)器發(fā)出請求闲延,然而HTTP請求可能包含較長的頭部痊剖,其中真正有效的數(shù)據(jù)可能只是很小的一部分,顯然這樣會浪費很多的帶寬等資源垒玲。
而HTML5 定義的 WebSocket 協(xié)議陆馁,能更好的節(jié)省服務(wù)器資源和帶寬,并且能夠更實時地進(jìn)行通訊合愈。
建立websocket
實現(xiàn)效果:點擊按鈕建立連接叮贩,頁面關(guān)閉時關(guān)閉連接。

<template>
    <div>
        <button @click="initSocket">建立websocket連接</button>
    </div>
</template>
<script>
    export default {
        data() {
            return {
                webSocket: null,
                url: '197.2.1.3:8088',
                types: '給后臺參數(shù)'
            }
        },
        methods: {
            // 建立連接
            initSocket() {
                // 有參數(shù)的情況下:
                let url = `ws://${this.url}/${this.types}`
                // 沒有參數(shù)的情況:接口
                // let url1 = 'ws://localhost:9998'
                this.webSocket = new WebSocket(url)
                this.webSocket.onopen = this.webSocketOnOpen
                this.webSocket.onclose = this.webSocketOnClose
                this.webSocket.onmessage = this.webSocketOnMessage
                this.webSocket.onerror = this.webSocketOnError

            },
            // 建立連接成功后的狀態(tài)
            webSocketOnOpen() {
                console.log('websocket連接成功');
            },
            // 獲取到后臺消息的事件佛析,操作數(shù)據(jù)的代碼在onmessage中書寫
            webSocketOnMessage(res) {
                // res就是后臺實時傳過來的數(shù)據(jù)
                console.log(res);
                 //給后臺發(fā)送數(shù)據(jù)
                this.webSocket.send("發(fā)送數(shù)據(jù)");
            },
            // 關(guān)閉連接
            webSocketOnClose() {
                this.webSocket.close()
                console.log('websocket連接已關(guān)閉');
            },
            //連接失敗的事件
            webSocketOnError(res) {
                console.log('websocket連接失敗');
                // 打印失敗的數(shù)據(jù)
                console.log(res);
            }
        },
        created() {
            // 頁面打開就建立連接益老,根據(jù)業(yè)務(wù)需要
            this.initSocket()
        },
        destroyed() {
            // 頁面銷毀關(guān)閉連接
            this.webSocket.close()
        },
    }
</script>

謹(jǐn)記:在生命周期結(jié)束的時候關(guān)閉websocket連接,除非業(yè)務(wù)需要可以不關(guān)寸莫,不然很耗內(nèi)存捺萌。

destroyed() {
            // 頁面銷毀關(guān)閉連接
         this.webSocket.close()
 },

axios 輪詢
實現(xiàn)效果:點擊按鈕,建立輪詢膘茎,3秒之后判斷狀態(tài)桃纯,成功就關(guān)閉,失敗就繼續(xù)發(fā)送請求披坏。

<template>
    <div>
        <button @click="getStatus">發(fā)請求拿數(shù)據(jù)</button>
        <span>狀態(tài):{{status}}</span>
    </div>
</template>
<script>
    export default {
        data() {
            return {
                status: ''
            }
        },
        computed: {
            // 計算屬性
            statusData() { return this.status }
        },
        watch: {
            statusData: function (newval) {
                // 當(dāng)返回的新值為創(chuàng)建中的時候,保持3秒輪詢
                if (newval == 'creating') {
                    var timer = setInterval(() => {
                        setTimeout(this.getStatus, 0)
                    }, 3000)
                }
                // 當(dāng)返回的新值為成功的時候,關(guān)閉定時器,結(jié)束輪詢
                if (newval == 'success') {
                    clearInterval(timer)
                }
                // 當(dāng)頁面關(guān)閉的時候,結(jié)束輪詢,否則就會一直發(fā)請求,
                //使用$once(eventName, eventHandler)一次性監(jiān)聽事件
                this.$once('hook:boforeDestory', () => {
                    clearInterval(timer)
                })
            }
        },
        methods: {
            getStatus() {
                getStatusApi().then(res => {
                    if (res.status == 200) this.$message.error('請求失敗')
                    this.status = res.data.status
                })
            }
        },
    }
</script>

注意:清除定時器的代碼不能寫在beforeDestory(){}中态坦,因為路由跳轉(zhuǎn),不會觸發(fā)beforeDestory

13.http請求跨域問題及解決方法棒拂,JSONP和ajax有什么區(qū)別

詳細(xì)內(nèi)容見文集《前后端通訊》=>《詳解跨域》
ajax是一種發(fā)送http請求與后臺進(jìn)行異步通訊的技術(shù)驮配。其原理是實例化xmlhttp對象,使用此對象與后臺通信着茸。
一個完整的AJAX請求一般包括以下步驟:
(1)實例化XMLHttpRequest對象
(2)連接服務(wù)器
(3)發(fā)送請求
(4)接收響應(yīng)數(shù)據(jù)
jsonp是一種可以實現(xiàn)跨域發(fā)送http請求的數(shù)據(jù)通信格式壮锻,可以嵌在ajax中使用。其原理是利用script標(biāo)簽可以跨域鏈接資源的特性涮阔。
JSONP由兩部分組成:回調(diào)函數(shù)和數(shù)據(jù)猜绣,回調(diào)函數(shù)一般是在瀏覽器控制,作為參數(shù)發(fā)往服務(wù)器端(當(dāng)然敬特,你也可以固定回調(diào)函數(shù)的名字掰邢,但客戶端和服務(wù)器端的名稱一定要一致)牺陶。當(dāng)服務(wù)器響應(yīng)時,服務(wù)器端就會把該函數(shù)和數(shù)據(jù)拼成字符串返回辣之。
JSONP的請求過程如下:
請求階段:瀏覽器創(chuàng)建一個 script 標(biāo)簽掰伸,并給其src 賦值。
發(fā)送請求:當(dāng)給script的src賦值時怀估,瀏覽器就會發(fā)起一個請求狮鸭。
數(shù)據(jù)響應(yīng):服務(wù)端將要返回的數(shù)據(jù)作為參數(shù)和函數(shù)名稱拼接在一起(格式類似”jsonpCallback({name: 'abc'})”)返回。當(dāng)瀏覽器接收到了響應(yīng)數(shù)據(jù)多搀,由于發(fā)起請求的是 script歧蕉,所以相當(dāng)于直接調(diào)用 jsonpCallback 方法,并且傳入了一個參數(shù)康铭。
最后:jsonp只支持get請求惯退,ajax支持get和post請求。
另外从藤,相對于CORS催跪,JSONP的優(yōu)勢在于不存在兼容性,支持幾乎所有的老瀏覽器夷野。

14.說下HTTP的報文結(jié)構(gòu)

對于 TCP 而言叠荠,在傳輸?shù)臅r候分為兩個部分:TCP頭和數(shù)據(jù)部分。
而 HTTP 類似扫责,也是header + body的結(jié)構(gòu),具體而言:
起始行 + 頭部 + 空行 + 實體
也可以是下面這種稱呼:

請求報文:
請求行逃呼,請求頭鳖孤,空行,請求體
響應(yīng)報文:
狀態(tài)行抡笼,響應(yīng)頭苏揣,空行,響應(yīng)體

由于 http 請求報文和響應(yīng)報文是有一定區(qū)別推姻,因此我們分開介紹平匈。
起始行
對于請求報文來說,起始行類似下面這樣:
GET /home HTTP/1.1
也就是方法 + 路徑 + http版本藏古。
對于響應(yīng)報文來說增炭,起始行一般張這個樣:
HTTP/1.1 200 OK
響應(yīng)報文的起始行也叫做狀態(tài)行。由http版本拧晕、狀態(tài)碼和原因三部分組成隙姿。
值得注意的是,在起始行中厂捞,每兩個部分之間用空格隔開输玷,最后一個部分后面應(yīng)該接一個換行队丝,嚴(yán)格遵循ABNF語法規(guī)范。
頭部
不管是請求頭還是響應(yīng)頭欲鹏,其中的字段是相當(dāng)多的机久,而且牽扯到http非常多的特性,這里就不一一列舉的赔嚎,重點看看這些頭部字段的格式:
1.字段名不區(qū)分大小寫
2.字段名不允許出現(xiàn)空格膘盖,不可以出現(xiàn)下劃線_
3.字段名后面必須緊接著:
空行
很重要,用來區(qū)分開頭部和實體尽狠。
問: 如果說在頭部中間故意加一個空行會怎么樣衔憨?
那么空行后的內(nèi)容全部被視為實體。
實體
就是具體的數(shù)據(jù)了袄膏,也就是body部分践图。請求報文對應(yīng)請求體, 響應(yīng)報文對應(yīng)響應(yīng)體。

15.說說Get和Post的區(qū)別

HTTP 中包括許多方法沉馆,Get 和 Post 是 HTTP 中最常用的兩個方法码党,基本上使用 HTTP 方法中有 99% 都是在使用 Get 方法和 Post 方法,所以有必要我們對這兩個方法有更加深刻的認(rèn)識斥黑。
get 方法一般用于請求揖盘,比如你在瀏覽器地址欄輸入 www.cxuanblog.com 其實就是發(fā)送了一個 get 請求,它的主要特征是請求服務(wù)器返回資源锌奴,而 post 方法一般用于表單的提交兽狭,相當(dāng)于是把信息提交給服務(wù)器,等待服務(wù)器作出響應(yīng)鹿蜀,get 相當(dāng)于一個是 pull/拉的操作箕慧,而 post 相當(dāng)于是一個 push/推的操作。
get 方法是不安全的茴恰,因為你在發(fā)送請求的過程中颠焦,你的請求參數(shù)會拼在 URL 后面,從而導(dǎo)致容易被攻擊者竊取往枣,對你的信息造成破壞和偽造伐庭;
/test/demo_form.asp?name1=value1&name2=value2
而 post 方法是把參數(shù)放在請求體 body 中的,這對用戶來說不可見分冈。

POST /test/demo_form.asp HTTP/1.1
Host: w3schools.com
name1=value1&name2=value2

get 請求的 URL 有長度限制圾另,而 post 請求會把參數(shù)和值放在消息體中,對數(shù)據(jù)長度沒有要求雕沉。
get 請求會被瀏覽器主動 cache盯捌,而 post 不會,除非手動設(shè)置蘑秽。
get 請求在瀏覽器反復(fù)的 回退/前進(jìn) 操作是無害的饺著,而 post 操作會再次提交表單請求箫攀。
get 請求在發(fā)送過程中會產(chǎn)生一個 TCP 數(shù)據(jù)包;post 在發(fā)送過程中會產(chǎn)生兩個 TCP 數(shù)據(jù)包幼衰。對于 get 方式的請求靴跛,瀏覽器會把 http header 和 data 一并發(fā)送出去,服務(wù)器響應(yīng) 200(返回數(shù)據(jù))渡嚣;而對于 post梢睛,瀏覽器先發(fā)送 header,服務(wù)器響應(yīng) 100 continue识椰,瀏覽器再發(fā)送 data绝葡,服務(wù)器響應(yīng) 200 ok(返回數(shù)據(jù))。

16.什么是無狀態(tài)協(xié)議腹鹉,HTTP 是無狀態(tài)協(xié)議嗎藏畅,怎么解決(JWT)

無狀態(tài)協(xié)議(Stateless Protocol) 就是指瀏覽器對于事務(wù)的處理沒有記憶能力。舉個例子來說就是比如客戶請求獲得網(wǎng)頁之后關(guān)閉瀏覽器功咒,然后再次啟動瀏覽器愉阎,登錄該網(wǎng)站,但是服務(wù)器并不知道客戶關(guān)閉了一次瀏覽器力奋。
HTTP 就是一種無狀態(tài)的協(xié)議榜旦,他對用戶的操作沒有記憶能力【耙螅可能大多數(shù)用戶不相信溅呢,他可能覺得每次輸入用戶名和密碼登陸一個網(wǎng)站后,下次登陸就不再重新輸入用戶名和密碼了猿挚。這其實不是 HTTP 做的事情咐旧,起作用的是一個叫做 小甜餅(Cookie) 的機(jī)制。它能夠讓瀏覽器具有記憶能力亭饵。
如果你的瀏覽器允許 cookie 的話,查看方式 chrome://settings/content/cookies
當(dāng)你向服務(wù)端發(fā)送請求時梁厉,服務(wù)端會給你發(fā)送一個認(rèn)證信息辜羊,服務(wù)器第一次接收到請求時,開辟了一塊 Session 空間(創(chuàng)建了Session對象)词顾,同時生成一個 sessionId 八秃,并通過響應(yīng)頭的 Set-Cookie:JSESSIONID=XXXXXXX 命令,向客戶端發(fā)送要求設(shè)置 Cookie 的響應(yīng)肉盹;客戶端收到響應(yīng)后昔驱,在本機(jī)客戶端設(shè)置了一個 JSESSIONID=XXXXXXX 的 Cookie 信息,該 Cookie 的過期時間為瀏覽器會話結(jié)束上忍;接下來客戶端每次向同一個網(wǎng)站發(fā)送請求時骤肛,請求頭都會帶上該 Cookie信息(包含 sessionId )纳本, 然后,服務(wù)器通過讀取請求頭中的 Cookie 信息腋颠,獲取名稱為 JSESSIONID 的值繁成,得到此次請求的 sessionId。這樣淑玫,你的瀏覽器才具有了記憶能力巾腕。
還有一種方式是使用 JWT 機(jī)制,它也是能夠讓你的瀏覽器具有記憶能力的一種機(jī)制絮蒿。與 Cookie 不同尊搬,JWT 是保存在客戶端的信息,它廣泛的應(yīng)用于單點登錄的情況土涝。
JSON Web Token (JWT)是一個開放標(biāo)準(zhǔn)(RFC 7519)佛寿,它定義了一種緊湊的、自包含的方式回铛,用于作為JSON對象在各方之間安全地傳輸信息狗准。該信息可以被驗證和信任,因為它是數(shù)字簽名的茵肃。
JWT 具有兩個特點
JWT 的 Cookie 信息存儲在客戶端腔长,而不是服務(wù)端內(nèi)存中。也就是說验残,JWT 直接本地進(jìn)行驗證就可以捞附,驗證完畢后,這個 Token 就會在 Session 中隨請求一起發(fā)送到服務(wù)器您没,通過這種方式鸟召,可以節(jié)省服務(wù)器資源,并且 token 可以進(jìn)行多次驗證氨鹏。
JWT 支持跨域認(rèn)證欧募,Cookies 只能用在單個節(jié)點的域或者它的子域中有效。如果它們嘗試通過第三個節(jié)點訪問仆抵,就會被禁止跟继。使用 JWT 可以解決這個問題,使用 JWT 能夠通過多個節(jié)點進(jìn)行用戶認(rèn)證镣丑,也就是我們常說的跨域認(rèn)證舔糖。
JWT的優(yōu)點:
1.可擴(kuò)展性好,JWT和session相比莺匠,session是保存在服務(wù)端的金吗,而jwt是保存在客戶端的,使用jwt可以讓服務(wù)端直接進(jìn)行平行擴(kuò)展。
2.無狀態(tài)摇庙,jwt不在服務(wù)端存儲任何狀態(tài)旱物,可以明顯降低服務(wù)器查詢數(shù)據(jù)庫的次數(shù)。
JWT的缺點:
1.安全性跟匆,由于jwt的payload是使用base64編碼的异袄,并沒有加密,因此jwt中不能存儲敏感數(shù)據(jù)玛臂。而session的信息是存在服務(wù)端的烤蜕,相對來說更安全。
2.性能迹冤,jwt太長讽营。由于是無狀態(tài)使用JWT,所有的數(shù)據(jù)都被放到JWT里泡徙,如果還要進(jìn)行一些數(shù)據(jù)交換橱鹏,那載荷會更大,經(jīng)過編碼之后導(dǎo)致jwt非常長堪藐,cookie的限制大小一般是4k莉兰,cookie很可能放不下,所以jwt一般放在local storage里面礁竞。并且用戶在系統(tǒng)中的每一次http請求都會把jwt攜帶在Header里面糖荒,http請求的Header可能比Body還要大。而sessionId只是很短的一個字符串模捂,因此使用jwt的http請求比使用session的開銷大得多捶朵。
3.一次性,無狀態(tài)是jwt的特點狂男,但也導(dǎo)致了這個問題综看,jwt是一次性的。想修改里面的內(nèi)容岖食,就必須簽發(fā)一個新的jwt红碑。

17.說說你了解的HTTP 的緩存策略

強(qiáng)緩存

服務(wù)器使用 Cache-Control 來設(shè)置緩存策略,常用 max-age 來表示資源的有效期泡垃。
(這里的 max-age 的時間計算起點是響應(yīng)報文的創(chuàng)建時刻析珊,而不是客戶端收到報文的時刻。)
(瀏覽器也可以發(fā)送 Cache-Control 字段兔毙,使用 max-age=0 或 no-cache 來刷新數(shù)據(jù))
如果想更精確的控制緩存策略唾琼,還可以使用 Cache-Control 的其他屬性:
no-store:不允許緩存 (用于秒殺頁面等變化頻率非常高的場景)
no-cache:可以緩存兄春,使用前必須要去服務(wù)端驗證是否過期澎剥,是否是最新版本
must-revalidate:如果緩存不過期就可以繼續(xù)使用,過期了就必須去服務(wù)端驗證
強(qiáng)制緩存除了Cache-Control ,還有Expires哑姚,但是由于Cache-Control的優(yōu)先級比expires祭饭,那么直接根據(jù)Cache-Control的值進(jìn)行緩存,意思就是說在600秒內(nèi)再次發(fā)起該請求叙量,則會直接使用緩存結(jié)果倡蝙,強(qiáng)制緩存生效。注:在無法確定客戶端的時間是否與服務(wù)端的時間同步的情況下绞佩,Cache-Control相比于expires是更好的選擇寺鸥,所以同時存在時,只有Cache-Control生效品山。

協(xié)商緩存

驗證資源是否失效就需要使用條件請求胆建。常用的是 If-Modified-Since 和 If-None-Match,收到 304 狀態(tài)碼就可以復(fù)用緩存里的資源肘交。
(If-None-Match 比 If-Modified-Since 優(yōu)先級更高)
驗證資源是否被修改的條件有兩個 Last-modified 和 ETag (ETag 比 Last-modified 的精確度更高)笆载,需要預(yù)先在服務(wù)端的響應(yīng)報文里設(shè)置,配合條件請求使用涯呻。

18.在你開發(fā)的過程中凉驻,什么情況下會遇到跨域問題,你是怎么解決的复罐?

  1. API跨域可以通過服務(wù)器上nginx反向代理
  2. 本地webpack dev server可以設(shè)置 proxy涝登,
  3. new Image, 設(shè)src 的時候,圖片需要設(shè)置Cors
    cors需要后臺配合設(shè)置HTTP響應(yīng)頭市栗,如果請求不是簡單請求(1. method:get缀拭,post,2. content-type:三種表單自帶的content-type填帽,3. 沒有自定義的HTTP header)蛛淋,瀏覽器會先發(fā)送option預(yù)檢請求,后端需要響應(yīng)option請求篡腌,然后瀏覽器才會發(fā)送正式請求褐荷,cors通過白名單的形式允許指定的域發(fā)送請求
    jsonp是瀏覽器會放過 img script標(biāo)簽引入資源的方式。所以可以通過后端返回一段執(zhí)行js函數(shù)的腳本嘹悼,將數(shù)據(jù)作為參數(shù)傳入叛甫。然后在前端執(zhí)行這段腳本。雙方約定一個函數(shù)的名稱杨伙。
    聯(lián)調(diào)的時候會需要跨域其监,線上前端站點域和后臺接口不一致也需要跨域,開發(fā)時跨域可以通過代理服務(wù)器來轉(zhuǎn)發(fā)請求限匣,因為跨域本身是瀏覽器對請求的限制抖苦,常見的跨域處理還有JSONP和cors,jsonp是利用腳本資源請求本身就可以跨域的特性,通過與請求一起發(fā)送回調(diào)函數(shù)名锌历,后臺返回script腳本直接執(zhí)行回調(diào)贮庞,但是由于資源請求是get類型,請求參數(shù)長度有限制究西,也不能進(jìn)行post請求窗慎。cors需要后臺配合設(shè)置HTTP響應(yīng)頭,如果請求不是簡單請求(1. method:get卤材,post遮斥,2. content-type:三種表單自帶的content-type墩朦,3. 沒有自定義的HTTP header)占键,瀏覽器會先發(fā)送option預(yù)檢請求,后端需要響應(yīng)option請求鸠补,然后瀏覽器才會發(fā)送正式請求晕拆,cors通過白名單的形式允許指定的域發(fā)送請求
    同源策略只是瀏覽器客戶端的防護(hù)機(jī)制藐翎,當(dāng)發(fā)現(xiàn)非同源HTTP請求時會攔截響應(yīng),但服務(wù)器依然處理了這個請求实幕。
    服務(wù)器端不攔截吝镣,所以在同源服務(wù)器下做代理,可以實現(xiàn)跨域昆庇。
    我之前這么看的node中間層處理跨域末贾。

19.什么是HTTP鏈接的管線化

在使用持久連接的情況下,某個連接上消息的傳遞類似于
請求1 => 響應(yīng)1 => 請求2 => 響應(yīng)2 => 請求3 => 響應(yīng)3
而管線化是建立在持久連接的基礎(chǔ)上的整吆,管線化不再單純的一次請求后立刻就進(jìn)行相應(yīng)拱撵,管線化下的持久連接變成了類似于下面這樣的:
請求1 => 請求2 => 請求3 => 響應(yīng)1 => 響應(yīng)2 => 響應(yīng)3
只有GET和HEAD請求可以進(jìn)行管線化,而POST則有所限制表蝙。

20.前后端通訊的主要方式

ajax是同源下的交互方式
websocket不限制源
cors是支持跨域拴测,也支持同源,是一種新的通信標(biāo)準(zhǔn)
cors是一個 W3C 標(biāo)準(zhǔn)府蛇,全稱是“跨域資源共享”(Cross-origin resource sharing)集索。它允許瀏覽器向跨域的服務(wù)器,發(fā)出XMLHttpRequest請求汇跨,從而克服了AJAX只能同源使用的限制务荆。

21.前端請求的常用觸發(fā)方式

1.form表單
一般表單提交通過type=submit實現(xiàn),input type="submit",瀏覽器顯示為button按鈕穷遂,通過點擊這個按鈕提交表單數(shù)據(jù)跳轉(zhuǎn)到action指定的路徑

<form action="/url.do" method="post">
   <input type="text" name="name"/>
   <input type="submit" value="提交">
</form>

2.Ajax
Ajax是發(fā)出異步HTTP請求的傳統(tǒng)方式函匕。
要在Ajax中進(jìn)行HTTP調(diào)用,首先需要初始化一個新XMLHttpRequest()方法的實例蚪黑,通過實例的open()方法將HTTP方法和URL端點綁定在一起盅惜,并調(diào)用該send()方法來觸發(fā)請求吸耿。 然后通過監(jiān)聽XMLHTTPRequest.onreadystatechange事件獲取readyState的狀態(tài),最后根據(jù)readyState的狀態(tài)進(jìn)行拿到返回數(shù)據(jù)的邏輯處理酷窥。(0.未初始化,1.載入伴网,2.載入完成蓬推,3.交互處理,4.完成)
3.Fetch
Fetch是ES6提供的數(shù)據(jù)請求的方法澡腾,它返回一個“Promise”沸伏,Promise允許我們以更優(yōu)雅的方式處理異步請求。
注意一點的是:Fetch不是Ajax的進(jìn)一步封裝动分,而是原生js毅糟,沒有使用XMLHttpRequest對象。
Fetch號稱是Ajax的替代品澜公,但是因為其一些缺點姆另,在Vue項目中,我們都會選用體積很小坟乾,對原生XHR封裝很完善的Axios
4.Axios
Axios 是一個基于Promise 用于瀏覽器和 Nodejs 的 HTTP 客戶端迹辐,本質(zhì)上也是對原生XHR的封裝,只不過它是Promise的實現(xiàn)版本甚侣,符合最新的ES規(guī)范明吩。

22.為什么TCP建立連接不能是兩次握手?

如果是兩次握手殷费,發(fā)送端可以確定自己發(fā)送的信息能對方能收到印荔,也能確定對方發(fā)的包自己能收到,但接收端只能確定對方發(fā)的包自己能收到 無法確定自己發(fā)的包對方能收到
并且兩次握手的話, 客戶端有可能因為網(wǎng)絡(luò)阻塞等原因會發(fā)送多個請求報文详羡,延時到達(dá)的請求又會與服務(wù)器建立連接仍律,浪費掉許多服務(wù)器的資源。

23.為什么TCP斷開連接揮手需要四次实柠?

服務(wù)端在收到客戶端斷開連接Fin報文后染苛,并不會立即關(guān)閉連接,而是先發(fā)送一個ACK包先告訴客戶端收到關(guān)閉連接的請求主到,只有當(dāng)服務(wù)器的所有報文發(fā)送完畢之后茶行,才發(fā)送FIN報文斷開連接,因此需要四次揮手登钥。

24.瀏覽器輸入localhost開頭的地址訪問會發(fā)生什么畔师?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市牧牢,隨后出現(xiàn)的幾起案子看锉,更是在濱河造成了極大的恐慌姿锭,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伯铣,死亡現(xiàn)場離奇詭異呻此,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)腔寡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門焚鲜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人放前,你說我怎么就攤上這事忿磅。” “怎么了凭语?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵葱她,是天一觀的道長。 經(jīng)常有香客問我似扔,道長吨些,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任炒辉,我火速辦了婚禮锤灿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘辆脸。我一直安慰自己但校,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布啡氢。 她就那樣靜靜地躺著状囱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪倘是。 梳的紋絲不亂的頭發(fā)上亭枷,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天,我揣著相機(jī)與錄音搀崭,去河邊找鬼叨粘。 笑死,一個胖子當(dāng)著我的面吹牛瘤睹,可吹牛的內(nèi)容都是我干的升敲。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼轰传,長吁一口氣:“原來是場噩夢啊……” “哼驴党!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起获茬,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤港庄,失蹤者是張志新(化名)和其女友劉穎倔既,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鹏氧,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡渤涌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了把还。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片实蓬。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖笨篷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瓣履,我是刑警寧澤率翅,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站袖迎,受9級特大地震影響冕臭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜燕锥,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一辜贵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧归形,春花似錦托慨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蔼紧,卻和暖如春婆硬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背奸例。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工彬犯, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人查吊。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓谐区,卻偏偏與公主長得像,于是被迫代替她去往敵國和親逻卖。 傳聞我的和親對象是個殘疾皇子卢佣,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容