http權威指南第三章

http報文

重點:

  • 報文是如何流動的棕叫;
  • http報文的三個組成部分(起始行、首部奕删、和實體的主體部分)俺泣;
  • 請求和響應之間的區(qū)別;
  • 請求報文支持的各種功能完残;
  • 和請求報文一起返回的各種狀態(tài)碼伏钠;
  • 各種各樣的http首部都是用來做什么的;

報文流

http報文是在http應用程序之間發(fā)送的數(shù)據(jù)塊谨设。這些數(shù)據(jù)塊以一些文本形式的元信息(meta-information)開頭熟掂,這些信息報文描述了報文的內(nèi)容及含義,后面跟著可選數(shù)據(jù)部分扎拣。這些報文在客戶端赴肚、服務器和代理之間流動。術語 流入 流出 上游 下游 都是用來描述報文方向的二蓝。

3.11報文流入源端服務器

http使用流入(inbound)和流出(outbound)來描述事務處理(transation)的方向誉券。客戶端發(fā)向服務器為流入刊愚,服務器發(fā)向客戶端稱為流出踊跟。

3.1.2報文向下游流動

http會像河水一樣流動。不管是請求報文還是響應報文鸥诽,所有的報文都會向下游(downstream)流動商玫。所有報文發(fā)送者都在接受者的上游(upstream)。

3.2報文的組成部分

http報文是簡單的格式化數(shù)據(jù)塊牡借。每條報文都包含三個部分:對報文描述的起始行(start line)决帖,包含屬性的首部(header)塊,以及可選的蓖捶,包含數(shù)據(jù)主體(body)部分地回。

起始行和首部就是由行分隔的ascll文本。每行以回車換行符結(jié)束。主體是一個可選的數(shù)據(jù)塊刻像。與起始行不同的是畅买,主體可以包含文本或二進制數(shù)據(jù),也可以為空细睡。

3.2.1報文的語法

所有的http報文可以分為兩類:請求報文(request message)和響應報文(response message)請求報文會向web服務器請求一個動作谷羞。響應報文會將請求的結(jié)果返回給客戶端。

請求報文格式

<method><request-url><version>
<headers>

<entity-body>
響應報文格式
<version><status><reason-phrase>
<headers>

<entity-body>

  • 方法(method)
    客戶端希望服務器對資源執(zhí)行的動作溜徙。是一個單獨的詞湃缎,比如get post
  • 請求url(request url)
    命名了所請求資源,或者url路徑組件的完整url蠢壹。如果直接與服務器進行對話嗓违,只要url的路徑組件是資源的絕對路徑,通常不會有問題图贸。
  • 版本(version)
    報文所使用的http版本蹂季,其格式為:http/<major>.<minor>,其中主要版本號(major)和次要版本號(minor)都是整數(shù)
  • 狀態(tài)碼(status-code)
    這三個數(shù)字描述了請求過程中發(fā)生的情況。每個狀態(tài)碼的第一位數(shù)字用于描述狀態(tài)的一般類別(成功疏日、出錯等)
  • 原因短語(reason-phrase)
    數(shù)字狀態(tài)碼的可讀版本偿洁,包含行中止之前的所有文本。
  • 首部(header)
    可以有零個或多個首部沟优,每個首部包含一個名字涕滋,后面跟著一個冒號,然后一個可選空格挠阁,接著是一個值宾肺,最后是crlf。首部是一個crlf結(jié)束的鹃唯,有些http版本需要包含特定的首部
  • 實體的主體部分
    包含一個有任意數(shù)據(jù)組成的數(shù)據(jù)塊爱榕。

3.2.2起始行

所有的http報文都以一個起始行作為開始。請求報文的起始行說明了要做些什么坡慌,響應報文起始行說明發(fā)生了什么黔酥。

1.請求行
請求報文請求服務器對資源進行一些操作。請求報文的起始行洪橘,或者稱為請求行跪者,包含了一個方法和一個請求url,這個方法描述了服務器應該執(zhí)行的操作熄求,url描述了要對那個資源執(zhí)行這個方法渣玲。請求行還包含http版本,在http1.0以前不要求請求行包含http版本號弟晚。

2.響應行

響應報文承載了狀態(tài)信息和操作產(chǎn)生的所有結(jié)果數(shù)據(jù)忘衍,將其返回給客戶端逾苫。響應報文的起始行,或者稱為響應行枚钓,包含類響應報文的http版本铅搓。數(shù)字狀態(tài)碼,以及描述操作狀態(tài)的文本形式的原因短語搀捷。

3.方法

請求的起始行以方法作為開始星掰,方法用來告知服務器要做些什么。

方法 描述 是否包含主體
get 從服務器獲取一份文檔
head 只從服務器獲得文檔的首部
post 向服務器發(fā)送需要處理的數(shù)據(jù)
put 將請求的主體存儲在服務器上
trace 對可能經(jīng)過代理服務器的報文進行追蹤
options 決定可以在服務器執(zhí)行那些方法
delete 從服務器上刪除一份文檔

4.狀態(tài)碼

狀態(tài)碼用來告訴客戶端發(fā)生了什么嫩舟,狀態(tài)碼位于起始行的行中氢烘。

整體范圍 分類
1xx 信息提示
2xx 成功
3xx 重定向
4xx 客戶端錯誤
5xx 服務器錯誤

5.原因短語

響應起始行的最后一個組件,為狀態(tài)碼提供了一個文本解釋家厌。http沒有規(guī)定原因短語以何種方式出現(xiàn)播玖。

6版本號

版本號說明了應用程序支持的最高版本,但http1.0在解釋包含http1.1的響應時像街,會認為這個響應是個1.1響應黎棠。

版本號不會被當做分數(shù)處理晋渺,而是比較每個數(shù)字镰绎,http/2.22就比http/2.3高,因為22比3大木西。

3.2.3首部

1.首部分類

  • 通用首部
    既可以出現(xiàn)在請求報文中畴栖,也可以出現(xiàn)在響應報文中。
  • 請求首部
    提供更多有關請求的信息
  • 響應首部
    提供更多有關響應的信息
  • 實體首部
    描述主體的長度和內(nèi)容八千,或者資源自身
  • 擴展首部
    規(guī)范中沒有定義的新首部

2.首部延續(xù)行

將長的首部分為多行可以提高可讀性吗讶,多出來的每一行至少要有一個空格或制表符

3.2.4實體的主體部分

http報文的第三部分是可選的實體主體部分。實體的主體部分是http報文的負荷恋捆,就是http要傳輸?shù)膬?nèi)容照皆。

3.2.5版本0.9的報文

http/0.9也由請求和響應組成,但請求中只包含方法和請求url沸停,響應中只包含實體膜毁,它沒有版本信息,沒有狀態(tài)碼或原因短語愤钾,也沒有首部瘟滨。

3.3方法

不是每個服務器都實現(xiàn)了所有這些方法,如果一臺服務器要與http1.1兼容能颁,只要實現(xiàn)get杂瘸、head方法就可以了。

3.3.1安全方法

http定義了一組被稱為安全方法的方法伙菊。get和head都被認為是安全的方法败玉,這就意味著使用get或head方法的http請求不會產(chǎn)生什么動作敌土,安全方法不一定什么都不執(zhí)行的(這將由web開發(fā)者決定)

3.3.2get

get是最常用的方法。通常用于請求服務器發(fā)送某個資源运翼。

3.3.3head

head與get方法很相似纯赎,但服務器只返回首部。不會返回實體的主體部分南蹂。這就允許客戶端在未獲得實際資源的情況下對資源的首部進行檢查犬金。

3.3.4put

與get從服務器讀取文檔相反,普通方法會向服務器寫入文檔六剥。有些發(fā)布系統(tǒng)允許用戶創(chuàng)建web頁面晚顷,并用普通直接安裝到服務器上

put方法的語義就是讓服務器用請求的主體部分來創(chuàng)建一個由所請求的url命名的新文檔,或者如果url已存在疗疟,就用主體來替代它

3.3.5post

post起初是用來向服務器輸入數(shù)據(jù)的该默。實際上用它來支持html的表單。

3.3.6trace

客戶端發(fā)起一個請求這個請求可能要穿過防火墻策彤、代理栓袖、網(wǎng)關或其它一些程序。每個中間結(jié)點都有可能修改原始http請求店诗。trace方法允許客戶端在最終請求發(fā)送給服務器時看看它變成什么樣子裹刮。

trace請求會在目的服務器發(fā)起一個回環(huán)診斷。行程最后一站的服務器會彈回一條trace響應庞瘸,并在響應主體中攜帶它收到的原始請求報文捧弃。

3.3.7options

options方法請求web服務器告知其支持的功能〔聊遥可以查詢服務器通常支持那些方法违霞。

3.3.8delete

delete就是請求服務器刪除所請求的資源。但是客戶端應用無法保證刪除一定會被執(zhí)行瞬场。用為http協(xié)議允許服務器在不通知客戶端的情況下撤銷請求买鸽。

http被設計成字段可擴展的,這樣新特性就不會使老軟件失效了贯被。服務器會為他所管理的資源實現(xiàn)http服務眼五,這些方法為開發(fā)者提供了擴展http服務能力的手段。

方法 描述
lock 允許用戶鎖定資源刃榨,比如正在編輯
mkcol 允許別人創(chuàng)建資源
copy 便于在服務器復制資源
move 在服務器移動資源

并不是所有的方法都是正式規(guī)范中定義的弹砚,如果你定義了一個擴展方法,很可能大部分http應用程序都無法理解枢希。同樣你的http應用程序也有可能遇到一些其它應用程序正在使用桌吃,而并不理解的方法。

3.4狀態(tài)碼

多而雜苞轿,不抄了

3.5首部

3.5.1通用首部

有些首部提供了與報文相關的基本信息茅诱,被稱為通用首部逗物。

通用信息性首部

首部 描述
connection 允許客戶端和服務器指定與請求/響應連接相關的選項
date 提供日期和時間,說明報文是什么時間創(chuàng)建的
mime-version 給出了發(fā)送端的mime版本
trailer 如果報文采用了分塊傳輸編碼(chunked transfer encoding)方式就可以用這個首部列出位于報文拖掛(trailer)部分的首部集合
update 給出了發(fā)送端可能想要升級使用的新版本或協(xié)議
via 顯示報文經(jīng)過的中間結(jié)點

通用緩存首部

http1.0引入了第一個允許http應用緩存對象本地副本的首部瑟俭,這樣就不用總是從源服務器獲取了翎卓。

首部 描述
cache-control 用于報文傳送緩存指示
pragma 另一種報文傳送指示的方式,但并不用于緩存

3.5.2請求首部

請求首部是只在請求報文中有意義的首部摆寄。

請求的信息性首部

首部 描述
client-ip 提供了客戶端的ip地址
from 提供了客戶端的mail地址
host 給出了服務器的主機名和端口號
referer 提供了包含當前請求uri的文檔的url
ua-color 提供了客戶端顯示器顏色相關的信息
ua-cpu 客戶端的cpu類型或制造商
ua——disp 提供了顯示器能力相關的信息
ua-os 客戶端的操作系統(tǒng)名稱和版本
ua-pixels 客戶端的像素信息
user-agent 發(fā)起請求的程序名稱

1.accept首部

accept將客戶端的喜好和能力告知服務器的方式

首部 描述
accept 告訴服務器能夠發(fā)送哪些媒體類型
accept-charset 哪些字符集
accept-encoding 哪些編碼方式
accept-language 哪些語言
te 哪些擴展傳輸編碼

2.條件請求首部

客戶端為請求添加限制失暴。

首部 描述
expect 允許客戶端列出請求所要求的服務器行為
if-match 如果實體標記與文檔當前的標記相同就獲取這份文檔
if-modified-since 除非在日期后修改過,否則限制該請求
if-none-match 如果文檔的標記與實體標記不符微饥,獲取該文檔
if-range 允許對文檔的某個范圍進行條件請求
if-unmodified-since 除非在某個日期后沒有修改過逗扒,否則限制該請求
range 如果服務器支持范圍請求,就請求資源的指定范圍

3.安全請求首部

http本身支持一種簡單的機制欠橘,可以對請求進行質(zhì)詢/響應認證矩肩。這種機制要求,在獲取資源之前肃续,先對自身進行認證黍檩,這樣使事務稍微安全一些。

首部 描述
authorization 包含了客戶端提供給服務器始锚,以便對自身進行認證的數(shù)據(jù)
cookie 客戶端用它向服務器傳送一個令牌刽酱,它并不是真正的安全首部,但隱含了安全功能
cookie2 用來說明請求端支持的cookie版本

安全請求首部

首部 描述
authorization 包含了客戶端提供給服務器疼蛾,以便對自身進行認證的數(shù)據(jù)
cookie 客戶端用它向服務器傳送一個令牌肛跌,它并不是真正的安全首部艺配,但隱含了安全功能
cookie2 用來說明請求端支持的cookie版本

4.請求代理首部

首部 描述
max-forward 在通往源服務器的路徑上察郁,將請求轉(zhuǎn)發(fā)給其它代理或網(wǎng)關的最大次數(shù)-與trace方法一起使用。
proxy-authorization 與authorization首部相同转唉,但這個首部是在與代理認證時使用的
proxy-connection 與connection相同皮钠,但這個首部是在與代理認證時使用的

3.5.3響應首部

響應報文有自己的響應首部集。響應首部為客戶端提供了一些額外的信息赠法。

首部 描述
age 從最初創(chuàng)建開始的持續(xù)響應時間
public 服務器為資源提供的請求方法列表
retry-after 如果資源不可用麦轰,在此日期之后重試
server服務器應用程序的名稱和版本
title 對html文檔來說,就是html文檔的標題
warning 比原因短語中更詳細的警告報文

1.協(xié)商首部

如果資源有多種便是方法砖织,http1.1可以為客戶端和服務器提供對資源進行協(xié)商的能力

首部 描述
accept-ranges 對此資源來說服務器可接受的范圍類型
vary 服務器查看的其它首部的列表款侵,可能會使響應發(fā)生變化

2.安全響應首部

首部 描述
proxy-authenticate 來自代理的對客戶端的質(zhì)詢列表
set-cookie 不是真正的安全首部,但隱含安全功能侧纯,可以在客戶端設置一個令牌新锈,以方便服務器對客戶端的標示
set-cookie2 與set-cookie類似
www-authenticate 來自服務器對客戶端的質(zhì)詢列表

3.5.4實體首部

信息性首部

首部 描述
allow 列出了可以對實體執(zhí)行的請求方法
location 告知客戶端實際上位于何處

1.內(nèi)容首部

首部 描述
content-base 解析主體的相對url時使用的基礎url
content-encoding 對主體執(zhí)行的任意編碼方式
content-language 理解主體是最適宜使用的自然語言
content-length 主體的長度或尺寸
content-location 資源實際所在的位置
content-md5 主體的md5校驗和
content-range 在整個資源中此實體表示的字節(jié)范圍
content-type 主體的對象類型

2.實體緩存首部

通用的緩存首部說明了如何或什么時候進行緩存。實體的緩存提供了與被緩存實體有關的信息眶熬。

實體緩存

首部 描述
etag 榆次實體相關的實體標記
expires 實體不在有效妹笆,要從源端再次獲取次實體的日期和時間
last-modified 這個實體最后一次被修改的日期和時間
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末块请,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子拳缠,更是在濱河造成了極大的恐慌墩新,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窟坐,死亡現(xiàn)場離奇詭異海渊,居然都是意外死亡,警方通過查閱死者的電腦和手機哲鸳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門切省,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人帕胆,你說我怎么就攤上這事朝捆。” “怎么了懒豹?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵芙盘,是天一觀的道長。 經(jīng)常有香客問我脸秽,道長儒老,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任记餐,我火速辦了婚禮蝇闭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘缴守。我一直安慰自己眷射,他們只是感情好,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布雕沿。 她就那樣靜靜地躺著练湿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪审轮。 梳的紋絲不亂的頭發(fā)上肥哎,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天,我揣著相機與錄音疾渣,去河邊找鬼篡诽。 笑死,一個胖子當著我的面吹牛榴捡,可吹牛的內(nèi)容都是我干的杈女。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼碧信!你這毒婦竟也來了赊琳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤砰碴,失蹤者是張志新(化名)和其女友劉穎躏筏,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體呈枉,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡趁尼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了猖辫。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酥泞。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖啃憎,靈堂內(nèi)的尸體忽然破棺而出芝囤,到底是詐尸還是另有隱情,我是刑警寧澤辛萍,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布悯姊,位于F島的核電站,受9級特大地震影響贩毕,放射性物質(zhì)發(fā)生泄漏悯许。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一辉阶、第九天 我趴在偏房一處隱蔽的房頂上張望先壕。 院中可真熱鬧,春花似錦谆甜、人聲如沸垃僚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冈在。三九已至,卻和暖如春按摘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背纫谅。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工炫贤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人付秕。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓兰珍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親询吴。 傳聞我的和親對象是個殘疾皇子掠河,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

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

  • 本篇文章篇幅比較長亮元,先來個思維導圖預覽一下。 一唠摹、概述 1.計算機網(wǎng)絡體系結(jié)構分層 2.TCP/IP 通信傳輸流 ...
    滌生_Woo閱讀 54,952評論 24 557
  • 第一章爆捞、HTTP概述1、Web瀏覽器勾拉、服務器和相關的Web應用程序都是通過HTTP相互通信的煮甥,HTTP是現(xiàn)代全球因...
    橫沖直撞666閱讀 634評論 0 1
  • 本文是《圖解HTTP》讀書筆記的第二篇,主要包括此書的第六章內(nèi)容藕赞,因為第六章的內(nèi)容較多成肘,而且比較重要,所以單獨寫為...
    lijiankun24閱讀 1,357評論 0 6
  • 混亂斧蜕,昏暗双霍,混沌,聲音批销,物品店煞,光線…… 說著話,不知道在說什么 灑水 西瓜 不能表意的代碼 開門和關門的聲音 收拾...
    聽雷雷說閱讀 239評論 0 0
  • 1. 身在多倫多风钻,免不了接待秋季前來賞楓的親友顷蟀。即便沒有親友,自己也喜歡在這個迷人的季節(jié)到郊外走走骡技,讓身心融化在斑...
    北美之北閱讀 849評論 2 7