好程序員 web 前端教程 JavaScript 系列之 HTTP : http 是我們前后臺(tái)交互的時(shí)候的傳輸協(xié)議(即超文本傳輸協(xié)議)
10年積累的做網(wǎng)站、網(wǎng)站設(shè)計(jì)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站制作后付款的網(wǎng)站建設(shè)流程,更有察哈爾右翼中旗免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。00001. 和服務(wù)器建立鏈接
00002. 建立鏈接后,發(fā)送一個(gè)請(qǐng)求給服務(wù)器(請(qǐng)求)
00003. 服務(wù)器接受到請(qǐng)求以后進(jìn)行相應(yīng)的處理并給出一個(gè)回應(yīng)(響應(yīng))
00004. 斷開于服務(wù)器的鏈接
· 怎么和服務(wù)器建立鏈接呢?
· 需要保證客戶端的接受和發(fā)送正常,服務(wù)器端的接受和發(fā)送正常
· 這里就涉及到一個(gè)東西叫做 TCP/IP 協(xié)議
· 建立鏈接的主要步驟叫做 三次握手
1、客戶端發(fā)送一個(gè)消息給到服務(wù)端
此時(shí): 服務(wù)端知道了 客戶端可以正常發(fā)送消息 服務(wù)端知道了 服務(wù)端可以正常接受消息
2、服務(wù)端回給客戶端一個(gè)消息
此時(shí):
服務(wù)端知道了 客戶端可以正常發(fā)送消息
服務(wù)端知道了 服務(wù)端可以正常接受消息
客戶端知道了 客戶端可以正常發(fā)送消息
客戶端知道了 客戶端可以正常接受消息
客戶端知道了 服務(wù)端可以正常接受消息
客戶端知道了 服務(wù)端可以正常發(fā)送消息
3、客戶端再回給服務(wù)端一個(gè)消息
此時(shí):
服務(wù)端知道了 客戶端可以正常發(fā)送消息
服務(wù)端知道了 服務(wù)端可以正常接受消息
客戶端知道了 客戶端可以正常發(fā)送消息
客戶端知道了 客戶端可以正常接受消息
客戶端知道了 服務(wù)端可以正常接受消息
客戶端知道了 服務(wù)端可以正常發(fā)送消息
服務(wù)端知道了 服務(wù)端可以正常發(fā)送消息
服務(wù)端知道了 客戶端可以正常接受消息
· 至此,依照 TCP/IP 協(xié)議的建立鏈接就建立好了
· 雙方都知道雙方可以正常收發(fā)消息
· 就可以進(jìn)入到第二步,通訊了
· 建立完鏈接以后就是發(fā)送請(qǐng)求的過程
· 我們的每一個(gè)請(qǐng)求都要把我們的所有信息都包含請(qǐng)求
· 每一個(gè)請(qǐng)求都會(huì)有一個(gè) 請(qǐng)求報(bào)文
· 在 請(qǐng)求報(bào)文 中會(huì)包含我們所有的請(qǐng)求信息(也就是我們要和服務(wù)端說的話都在里面)
· 我們的請(qǐng)求報(bào)文中會(huì)包含幾個(gè)東西
1、請(qǐng)求行
POST /user HTTP/1.1
# POST 請(qǐng)求方式
# /user 請(qǐng)求URL(不包含域名)
# HTTP/1.1 請(qǐng)求協(xié)議版本
2、請(qǐng)求頭(請(qǐng)求頭都是鍵值對(duì)的形式出現(xiàn)的)
user-agent : Mozilla /5 . 0 # 產(chǎn)生請(qǐng)求的瀏覽器信息 accept : application / json # 表示客戶端希望接受的數(shù)據(jù)類型 Content-Type : application / x-www-form-urlencoded # 客戶端發(fā)送的實(shí)體數(shù)據(jù)格式 Host : 127 . 0 . 0 . 1 # 請(qǐng)求的主機(jī)名( IP )
3、請(qǐng)求空行(請(qǐng)求頭和請(qǐng)求主體之間要留一個(gè)空白行)
# 就是一個(gè)空行
4、請(qǐng)求體(本次請(qǐng)求攜帶的數(shù)據(jù))
# GET 請(qǐng)求是沒有請(qǐng)求體數(shù)據(jù)的
# POST 請(qǐng)求才有請(qǐng)求體數(shù)據(jù)
· 接下來看一個(gè)完整的請(qǐng)求報(bào)文
POST /user HTTP/1.1 # 請(qǐng)求行
Host: www.user.com
Content-Type: application/x-www-form-urlencoded
accept: application/json
User-agent: Mozilla/5.0. # 以上是首部
#(此處必須有一空行) # 空行分割header和請(qǐng)求內(nèi)容
name=world # 請(qǐng)求體
· 客戶端的請(qǐng)求發(fā)送到服務(wù)端以后
· 服務(wù)端進(jìn)行對(duì)應(yīng)的處理
· 會(huì)給我們返回一個(gè)響應(yīng)
· 每一個(gè)響應(yīng)都會(huì)有一個(gè) 響應(yīng)報(bào)文
· 在 響應(yīng)報(bào)文 中會(huì)包含我們所有的響應(yīng)信息(也就是服務(wù)端在接受到客戶端請(qǐng)求以后,給我們的回信)
· 我們的 響應(yīng)報(bào)文 中會(huì)包含幾個(gè)信息
1、狀態(tài)行
HTTP/1.1 200 OK # HTTP/1.1 服務(wù)器使用的 HTTP 協(xié)議版本 # 200 響應(yīng)狀態(tài)碼 # OK 對(duì)響應(yīng)狀態(tài)碼的簡(jiǎn)單解釋
2、響應(yīng)頭
Date: Jan, 14 Aug 2019 12:42:30 GMT # 服務(wù)器時(shí)間 Server: Apache/2.4.23 (Win32) OpenSSL/1.0.2j PHP/5.4.45 # 服務(wù)器類型 Content-Type: text/html # 服務(wù)端給客戶端的數(shù)據(jù)類型 Content-Length: 11 # 服務(wù)端給客戶端的數(shù)據(jù)長(zhǎng)度
3、響應(yīng)體
hello world # 服務(wù)端給客戶端的響應(yīng)數(shù)據(jù)
· 之前我們的建立鏈接是基于 TCP/IP 協(xié)議的 三次握手
· 我們的斷開鏈接是基于 TCP/IP 協(xié)議的 四次揮手
00001. 客戶端發(fā)送一個(gè)我要斷開的消息給服務(wù)端
00002. 服務(wù)端接受到以后發(fā)送一個(gè)消息告訴客戶端我已經(jīng)進(jìn)入關(guān)閉等待狀態(tài)
00003. 服務(wù)端再次發(fā)送一個(gè)消息告訴客戶端,這個(gè)是我的最后一次消息給你,當(dāng)我再接受到消息的時(shí)候就會(huì)關(guān)閉
00004. 客戶端接受到服務(wù)端的消息以后,告訴服務(wù)器,我已經(jīng)關(guān)閉,這個(gè)是給你的最后一個(gè)消息
· 至此,一個(gè) HTTP 請(qǐng)求就完整的完成了
· 一個(gè) HTTP 請(qǐng)求必須要包含的四個(gè)步驟就是
00001. 建立鏈接
00002. 發(fā)送請(qǐng)求
00003. 接受響應(yīng)
00004. 斷開鏈接
· 在一個(gè) HTTP 請(qǐng)求中,請(qǐng)求的部分有請(qǐng)求報(bào)文,接受響應(yīng)的部分有響應(yīng)報(bào)文
· 請(qǐng)求報(bào)文包含
00001. 請(qǐng)求行
00002. 請(qǐng)求頭
00003. 請(qǐng)求空行
00004. 請(qǐng)求體
· 響應(yīng)報(bào)文
00001. 狀態(tài)行
00002. 響應(yīng)頭
00003. 響應(yīng)體
· 在一個(gè) HTTP 請(qǐng)求的響應(yīng)報(bào)文中的狀態(tài)行會(huì)有一個(gè)響應(yīng)狀態(tài)碼
· 這個(gè)狀態(tài)碼是用來描述本次響應(yīng)的狀態(tài)的
· 通常會(huì)出現(xiàn)五種狀態(tài)碼
00001. 100 ~ 199
00002. 200 ~ 299
00003. 300 ~ 399
00004. 400 ~ 499
00005. 500 ~ 599
· 一般我們看不到,因?yàn)楸硎菊?qǐng)求繼續(xù)
· 100: 繼續(xù)請(qǐng)求,前面的一部分內(nèi)容服務(wù)端已經(jīng)接受到了,正在等待后續(xù)內(nèi)容
· 101: 請(qǐng)求者已經(jīng)準(zhǔn)備切換協(xié)議,服務(wù)器頁(yè)表示同意
· 2 開頭的都是表示成功,本次請(qǐng)求成功了,只不過不一樣的狀態(tài)碼有不一樣的含義(語(yǔ)義化)
· 200: 標(biāo)準(zhǔn)請(qǐng)求成功(一般表示服務(wù)端提供的是網(wǎng)頁(yè))
· 201: 創(chuàng)建成功(一般是注冊(cè)的時(shí)候,表示新用戶信息已經(jīng)添加到數(shù)據(jù)庫(kù))
· 203: 表示服務(wù)器已經(jīng)成功處理了請(qǐng)求,但是返回的信息可能來自另一源
· 204: 服務(wù)端已經(jīng)成功處理了請(qǐng)求,但是沒有任何數(shù)據(jù)返回
· 3 開頭也是成功的一種,但是一般表示重定向
· 301: 永久重定向
· 302: 臨時(shí)重定向
· 304: 使用的是緩存的數(shù)據(jù)
· 305: 使用代理
· 4 開頭表示客戶端出現(xiàn)錯(cuò)誤了
· 400: 請(qǐng)求的語(yǔ)法服務(wù)端不認(rèn)識(shí)
· 401: 未授權(quán)(你要登錄的網(wǎng)站需要授權(quán)登錄)
· 403: 服務(wù)器拒絕了你的請(qǐng)求
· 404: 服務(wù)器找不到你請(qǐng)求的 URL
· 407: 你的代理沒有授權(quán)
· 408: 請(qǐng)求超時(shí)
· 410: 你請(qǐng)求的數(shù)據(jù)已經(jīng)被服務(wù)端永久刪除
· 5 開頭的表示服務(wù)端出現(xiàn)了錯(cuò)誤
· 500: 服務(wù)器內(nèi)部錯(cuò)誤
· 503: 服務(wù)器當(dāng)前不可用(過載或者維護(hù))
· 505: 請(qǐng)求的協(xié)議服務(wù)器不支持
· 每一個(gè) HTTP 請(qǐng)求在請(qǐng)求行里面會(huì)有一個(gè)東西叫做請(qǐng)求方式
· 不同的請(qǐng)求方式代表的含義不同
00001. GET: 一般用于獲取一些信息使用(獲取列表)
00002. POST: 一般用于發(fā)送一些數(shù)據(jù)給服務(wù)端(登錄)
00003. PUT: 一般用于發(fā)送一些數(shù)據(jù)給服務(wù)當(dāng)讓其添加新數(shù)據(jù)(注冊(cè))
00004. DELETE: 一般用域刪除某些數(shù)據(jù)
00005. HEAD: 類似于 GET 的請(qǐng)求,只不過一般沒有響應(yīng)的具體內(nèi)容,用于獲取報(bào)文頭
00006. CONNECT: HTTP/1.1 中預(yù)留的方式,一般用于管道鏈接改變?yōu)榇淼臅r(shí)候使用
00007. PATCH: 是和 PUT 方式類似的一個(gè)方式,一般用于更新局部數(shù)據(jù)
00008. OPTIONS: 允許客戶端查看服務(wù)端性能
· 我們比較常用的就是 GET 和 POST
· 參數(shù)以 querystring 的形式發(fā)送,也就是直接拼接在 請(qǐng)求路徑的后面
· GET 請(qǐng)求會(huì)被瀏覽器主動(dòng)緩存
· GET 請(qǐng)求根據(jù)不同的瀏覽器對(duì)長(zhǎng)度是有限制的
· IE: 2083 個(gè)字符
· FireFox: 65536 個(gè)字符
· Safari: 80000 個(gè)字符
· Opera: 190000 個(gè)字符
· Chrome: 8182 個(gè)字符
· APACHE(server): 理論上接受的大長(zhǎng)度是 8192 個(gè)字符(有待商榷)
· 對(duì)參數(shù)的類型有限制,只接受 ASCII 碼的格式
· GET 請(qǐng)求是明文發(fā)送,相對(duì)不安全
· 參數(shù)以 request body 的形式發(fā)送,也就是放在請(qǐng)求體中
· POST 請(qǐng)求不會(huì)被瀏覽器主動(dòng)緩存,除非手動(dòng)設(shè)置
· POST 請(qǐng)求理論上是沒有限制的,除非服務(wù)端做了限制
· 對(duì)參數(shù)類型沒有限制,理論上可以傳遞任意數(shù)據(jù)類型,只不過要和請(qǐng)求頭對(duì)應(yīng)
· POST 請(qǐng)求是密文發(fā)送,相對(duì)安全