從敲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è)大類:
-
100-199用于指定客戶端相應(yīng)的某些動(dòng)作 -
200-299用于表示請(qǐng)求成功。 -
300-399用于已經(jīng)移動(dòng)的文件并且常被包含在定位頭信息中指定新的地址信息。 -
400-499用于指出客戶端的錯(cuò)誤。 -
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í)間 |