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