HTTP

從敲url到頁(yè)面的內(nèi)容,都是HTTP規(guī)定的。
規(guī)定了瀏覽器、服務(wù)器的一些行為。


1.URI和URL

  • URI:統(tǒng)一資源標(biāo)識(shí)符
  • URL:統(tǒng)一資源定位符
    URL是使用瀏覽器訪問(wèn)web頁(yè)面的時(shí)候,需要輸入的網(wǎng)頁(yè)地址
http://www.google.com

URI是更通用的資源標(biāo)識(shí)符,URL是它的一個(gè)子集。
URI有兩種主要子集組成
1.URL:通過(guò)描述資源的位置來(lái)描述資源
2.URN:通過(guò)名字來(lái)識(shí)別資源,和位置無(wú)關(guān)

URI

URI(Uniform Resource Identifier)

  • Uniform: 規(guī)定統(tǒng)一的格式,可方便處理各種不同類型的資源,而不用根據(jù)上下文環(huán)境來(lái)識(shí)別資源指定的訪問(wèn)方式,加入新的協(xié)議方案(HTTP,HTTOS,FTP等)也更容易。
  • Resource:資源的定義是“可以標(biāo)識(shí)的任何東西”,除了文檔文件、圖像或者服務(wù)(天氣預(yù)報(bào))等能夠區(qū)別于其他類型的,全都可以稱為資源,另外資源不僅可以是單一的,也可以是多數(shù)的集合體。
  • Identifier:表示可標(biāo)識(shí)的對(duì)象,也稱為標(biāo)識(shí)符。
    URI是某個(gè)協(xié)議方案表示的資源的定位標(biāo)識(shí)符,協(xié)議方案指訪問(wèn)資源所使用的協(xié)議類型名稱
    采用HTTP協(xié)議的時(shí)候,協(xié)議方案就是http,除此之外還有ftp、mailto、file等。
ftp://ftp.is.cd.za.rfc/rfc1808.txt
http://xxxx.github.io/f2e/js/ajax.html
mailto:xxx@gmail.com
telnet://192.0.2.16:80
URL格式

常見(jiàn)的URL主要有3部分組成:
1.協(xié)議
2.服務(wù)器路徑
3.資源路徑

http://xxxx.github.io/f2e/js/ajax.html

通用的URL有9部分組成:

<scheme>://<user>"<password>@<host>:<port>/<path>;<params>?<query>#<hash>
  • 對(duì)于web頁(yè)面來(lái)說(shuō)最常用的協(xié)議就是http和https
  • user和password現(xiàn)在不常見(jiàn)了,不會(huì)再URL明文書寫用戶名和密碼了,都是通過(guò)登錄的方式
  • 主機(jī)可以是IPO地址過(guò)著域名
  • 端口號(hào)用來(lái)區(qū)分主機(jī)上的進(jìn)程,方便找到web服務(wù)器,http默認(rèn)是80
  • path是資源的路徑,也就是存放位置,不一定和物理路徑完全對(duì)應(yīng),符合web服務(wù)器路由約定即可
  • params在一些協(xié)議中需要參數(shù)來(lái)訪問(wèn)資源,例如ftp是二進(jìn)制還是文本傳輸,參數(shù)是名值對(duì),用;隔開
  • query:這個(gè)是get請(qǐng)求最常用的傳遞參數(shù)方式了?a=1&b=2&c=3
  • hash也稱為片段,設(shè)計(jì)為標(biāo)識(shí)文檔的一部分,很多MVVM框架用作了路由功能

相對(duì)URL

相對(duì)URL是URL一部分,從路徑開始

./image/logo.png
../script/a.js
/css/main/css

2.客戶端向服務(wù)器發(fā)送請(qǐng)求方法

HTTP最大的作用就是客戶端發(fā)送請(qǐng)求,服務(wù)器給出響應(yīng),客戶端向服務(wù)器發(fā)送請(qǐng)求的方式有很多

1.GET(向服務(wù)器要資源)

GET是最常用的方法,通常用于請(qǐng)求服務(wù)器發(fā)送某個(gè)資源
在瀏覽器輸入頁(yè)面地址,就是給服務(wù)器發(fā)送一個(gè)get請(qǐng)求,希望得到這個(gè)網(wǎng)頁(yè)。

2.HEAD(查文件信息,而不是內(nèi)容時(shí))

HEAD方法和GET類似,但是在服務(wù)器的響應(yīng)中沒(méi)有資源的內(nèi)容,只有資源的一些基本信息,主要用于

  • 1.在不獲取資源的情況下獲取資源信息(類型、大小等)
  • 2.通過(guò)狀態(tài)碼查看資源是否存在
  • 3.通過(guò)查看首部,調(diào)試資源是否被修改了
3.PUT(往服務(wù)器上傳資源)

和GET從服務(wù)器獲取資源相反、PUT用于向服務(wù)器寫入資源。PUT的語(yǔ)義就是讓服務(wù)器用請(qǐng)求的主體部分創(chuàng)建一個(gè)請(qǐng)求URL命名的文檔,如果存在就替換
當(dāng)然處于安全原因,并不是所有的服務(wù)器都實(shí)現(xiàn)。

4.POST(想把一些信息交給服務(wù)器)

POST用于向服務(wù)器發(fā)送數(shù)據(jù),通常用來(lái)支持HTML的表單(input、select、textarea),表單中的數(shù)據(jù)會(huì)被發(fā)送到服務(wù)器。

5.TRACE(診斷,看看經(jīng)歷哪些節(jié)點(diǎn))

客戶端發(fā)送一個(gè)請(qǐng)求的時(shí)候,這個(gè)請(qǐng)求可能會(huì)穿過(guò)防火墻、代理、網(wǎng)關(guān)和一些其它應(yīng)用程序,每個(gè)中間節(jié)點(diǎn)都可能修改HTTP請(qǐng)求,TRACE方法允許客戶端在最終請(qǐng)求發(fā)往服務(wù)器的時(shí)候,看看它變成了什么樣子
TRACE請(qǐng)求會(huì)在目的服務(wù)器端發(fā)送一個(gè)“閉環(huán)”診斷,行程最后一站服務(wù)器會(huì)彈回一條TRACE響應(yīng),并在響應(yīng)主題中攜帶它收到的原始請(qǐng)求報(bào)文。

6.DELETE(發(fā)一個(gè)請(qǐng)求刪除一個(gè)資源)

DELETE方法用于請(qǐng)求服務(wù)器刪除請(qǐng)求的URL,和PUT一樣,服務(wù)器可能會(huì)不支持

7.OPTIONS(看看這么多方法,支持哪個(gè))

OPTIONS方法用于請(qǐng)求web服務(wù)器告知其支持的各種功能。
最常用的是GET和POST


3.狀態(tài)碼 Status Code

狀態(tài)碼被分為五個(gè)大類:

  1. 100-199 用于指定客戶端相應(yīng)的某些動(dòng)作
  2. 200-299 用于表示請(qǐng)求成功。
  3. 300-399 用于已經(jīng)移動(dòng)的文件并且常被包含在定位頭信息中指定新的地址信息。
  4. 400-499 用于指出客戶端的錯(cuò)誤。
  5. 500-599 用于支持服務(wù)器錯(cuò)誤。
常用狀態(tài)碼 表示
200 表示ok
206 部分已經(jīng)成功了
301 永久性移動(dòng)
302 臨時(shí)性移動(dòng)
304 請(qǐng)求的資源沒(méi)有變化,使用本地緩存就好。
403 沒(méi)有權(quán)限訪問(wèn)此站
404 所請(qǐng)求的頁(yè)面不存在或已被刪除
500 服務(wù)器出錯(cuò),不能完成客戶請(qǐng)求。
502 找不到網(wǎng)關(guān)
503 服務(wù)器出錯(cuò)
504 能找到網(wǎng)關(guān),但超時(shí)

Request Headers: 請(qǐng)求
Accept: //能接受的類型,MIME類型。
Accept-Encoding: //能接受的一些壓縮類型
Accept-Language: //能接受的哪種類型的語(yǔ)言,顯示出來(lái)。
Cookie: 鍵值對(duì)純文本,能發(fā)給服務(wù)器,客戶端的一些信息。在控制臺(tái)Resources => cookies 有詳細(xì)信息:Domain在哪個(gè)域名下,Path在哪個(gè)地址下,Expires/Max-Ag哪天失效,session當(dāng)前登錄期間有效,size多大。


報(bào)文

HTTP報(bào)文是在HTTP應(yīng)用程序之間發(fā)送的數(shù)據(jù)塊。這些數(shù)據(jù)塊以一些文本形式的元信息開頭,描述報(bào)文的內(nèi)容及含義,后面跟著可選的數(shù)據(jù)部分

組成

客戶端往服務(wù)器發(fā)的一個(gè)請(qǐng)求,服務(wù)器給客戶端的也是一個(gè)報(bào)文。有發(fā)過(guò)去的有發(fā)回來(lái)的,都是通過(guò)報(bào)文的格式。
HTTP報(bào)文是簡(jiǎn)單的格式化數(shù)據(jù)塊,每個(gè)報(bào)文都包含一條來(lái)自客戶端的請(qǐng)求或者一條來(lái)自服務(wù)器的響應(yīng),由3個(gè)部分組成

  • 對(duì)報(bào)文進(jìn)行描述的起始行 —— start line
  • 包含屬性的首部塊 —— header
  • 可選的包含數(shù)據(jù)的主體部分 —— body
//start line
HTTP/1.0 200 OK
//headers
content-type: text/plain
content-length: 19

//body
Hi, I'm a message

語(yǔ)法

HTTP報(bào)文分為兩類
向web服務(wù)器請(qǐng)求一個(gè)動(dòng)作

  • 請(qǐng)求報(bào)文:
<method><request-URL><version>
//get http://www.baidu.com http1.1
<headers>
//request Headers信息

<entity-body>
//不一定有
  • 響應(yīng)報(bào)文:
    把請(qǐng)求結(jié)果返回給客戶端
<version><status><reason-phrase>
//版本  狀態(tài)  短語(yǔ)(ok)
<headers>
//request Headers信息

<entity-body>
//響應(yīng)一般都有body,不一定是文本,也有可能是二進(jìn)制的。

通用首部Headers

客戶端和服務(wù)器都可以用的,都認(rèn)識(shí)的。

首部 描述
Connection 客戶端和服務(wù)器是否保持連接
Date 日期,報(bào)文創(chuàng)建時(shí)間
Update 給出了發(fā)送端可能想要升級(jí)使用新版本或協(xié)議
Via 顯示了報(bào)文經(jīng)過(guò)的中間節(jié)點(diǎn)(代理、網(wǎng)關(guān))
Trailer 如果報(bào)文采用分塊傳輸編碼方式,可以利用這個(gè)首部列出位于報(bào)文trailer部分的首部集合
Trailer-Encoding 告訴接收端對(duì)報(bào)文采用什么編碼格式
Cache-Control 隨報(bào)文傳送緩存指示
Pragma 早期的隨報(bào)文傳送指示方式 no-cache,這個(gè)頁(yè)面永遠(yuǎn)不用緩存,用最新的。

Connection:HTTP是一種無(wú)狀態(tài)協(xié)議,像QQ,可以持續(xù)的聊天,不用每次聊都要點(diǎn)一下連接。網(wǎng)頁(yè)確不行,比如說(shuō)訪問(wèn)百度,百度給我地址以后需要把客戶端和服務(wù)器之間的鏈接給斷開,因?yàn)榭赡芤找粌|多次請(qǐng)求,都連著不斷的話,資源就釋放不了了。無(wú)狀態(tài),一斷之后,下次連可能就不認(rèn)識(shí)了。這樣本身設(shè)計(jì)是沒(méi)問(wèn)題的,問(wèn)題在每次下次再找它特別累。所以HTTP1.1給加了新特性Connection,雖然TCP斷開了,但是中間的鏈路保持鏈接,下次不用重新找它了,直接連接就行了。
Update :web socket ,需要HTTP來(lái)實(shí)現(xiàn)的。



請(qǐng)求首部

首部 描述
Client-IP 客戶端IP
From 客戶端郵件地址
Host 接收請(qǐng)求的服務(wù)器的主機(jī)名和端口號(hào)
Referer 提供了包含當(dāng)前請(qǐng)求URI的文檔的URL,告訴服務(wù)器自己來(lái)源
User—Agent 發(fā)起請(qǐng)求的客戶端應(yīng)用程序
Accept 告訴服務(wù)器能夠發(fā)送那些媒體類型
Accept-Charset 告訴服務(wù)器能夠發(fā)送那些字符集
Accept-Encoding 告訴服務(wù)器能夠發(fā)送那些編碼
Accept-Language 告訴服務(wù)器能夠發(fā)送那些語(yǔ)言
Expect 允許客戶端列出請(qǐng)求所要求的服務(wù)器行為
If-Match 如果ETag和文檔當(dāng)前ETag匹配,就獲取文檔
If-Modified-Since 除非在某個(gè)指定日期之后修改過(guò),否則限制這個(gè)請(qǐng)求
If-None-Match 如果ETag和當(dāng)前文檔ETag不符合,獲取資源
If-Range 允許對(duì)文檔否個(gè)范圍內(nèi)的條件請(qǐng)求
If-Unmodified-Since 在某個(gè)指定日期之后沒(méi)有修改過(guò),否則現(xiàn)在請(qǐng)求
Cookie 客戶端字符串

響應(yīng)首部

首部 描述
Age 響應(yīng)持續(xù)時(shí)間
Server 服務(wù)器應(yīng)用軟件名稱和版本
Allow 列出了可用的請(qǐng)求方法
Location 告訴客戶端實(shí)在在哪里,用于301,302定向往哪里跳
Content-Base 解析主體中相對(duì)URL的基礎(chǔ)URL
Content-Encoding 主體編碼格式
Content-Language 解析主體時(shí)適用的語(yǔ)言
Content-Length 主體的長(zhǎng)度或尺寸
Content-Location 告訴資源實(shí)際位置在哪
Content-MD5 主體的MD5校驗(yàn)和
Content-Range 在整個(gè)資源中此實(shí)體部分的字節(jié)范圍
Content-Type 主體的MIME
ETag 主體的實(shí)體標(biāo)記
Expires 過(guò)期時(shí)間
Last-Modified 實(shí)體最后一次修改時(shí)間
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容