程序員都該懂點(diǎn) HTTP

本篇文章已授權(quán)為微信公眾號(hào) code小生 發(fā)布

作者:developerHaoz
Github 地址:developerHaoz
說(shuō)明:本文主要是對(duì) HTTP 基礎(chǔ)知識(shí)進(jìn)行總結(jié)和歸納录择,畢竟做 IT 的垄提,網(wǎng)絡(luò)這一塊還是很重要的

本文的主要內(nèi)容

  • HTTP 是什么
  • URL 詳解
  • HTTP 之請(qǐng)求篇
  • HTTP 之響應(yīng)篇

一膨报、HTTP是什么

1篙程、概述

HTTP 全稱是 HyperText Transfer Protocal 庆猫,即:超文本傳輸協(xié)議停局,從 1990 年開(kāi)始就在 WWW 上廣泛應(yīng)用稚茅,是現(xiàn)今在 WWW 上應(yīng)用最多的協(xié)議拷邢,HTTP 是應(yīng)用層協(xié)議袱院,當(dāng)你上網(wǎng)瀏覽網(wǎng)頁(yè)的時(shí)候,瀏覽器和 web 服務(wù)器之間就會(huì)通過(guò) HTTP 在 Internet 上進(jìn)行數(shù)據(jù)的發(fā)送和接收瞭稼。HTTP 是一個(gè)基于請(qǐng)求/響應(yīng)模式的忽洛、無(wú)狀態(tài)的協(xié)議。即我們通常所說(shuō)的 Request/Response

2环肘、特點(diǎn)

  • 支持客戶端/服務(wù)器模式
  • 簡(jiǎn)單快速:客戶向服務(wù)器請(qǐng)求服務(wù)時(shí)欲虚,只需傳送請(qǐng)求方法和路徑。由于 HTTP 協(xié)議簡(jiǎn)單廷臼,使得 HTTP 服務(wù)器的程序規(guī)模小苍在,因而通信速度很快
  • 靈活:HTTP 允許傳輸任意類型的數(shù)據(jù)對(duì)象绝页。正在傳輸?shù)念愋陀?Content-Type 加以標(biāo)記
  • 無(wú)連接:無(wú)連接的含義是限制每次鏈接只處理一個(gè)請(qǐng)求。服務(wù)器處理完哭護(hù)的請(qǐng)求寂恬,并收到客戶的應(yīng)答后续誉,即斷開(kāi)鏈接,采用這種方式可以節(jié)省傳輸時(shí)間
  • 無(wú)狀態(tài):HTTP 協(xié)議是無(wú)狀態(tài)協(xié)議初肉。無(wú)狀態(tài)是指協(xié)議對(duì)于事物處理沒(méi)有記憶能力酷鸦。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息,則它必須重傳牙咏,這樣可能會(huì)導(dǎo)致每次連接傳送的數(shù)據(jù)量增大臼隔。另一方面,在服務(wù)器不需要先前信息時(shí)它的應(yīng)答就較快

二妄壶、URL詳解

1摔握、簡(jiǎn)介

URL(Uniform Resource Locator)是統(tǒng)一資源定位符的簡(jiǎn)稱,有時(shí)候也被俗稱為網(wǎng)頁(yè)地址(網(wǎng)址)丁寄,如同是網(wǎng)絡(luò)上的門牌氨淌,是因特網(wǎng)上標(biāo)準(zhǔn)的資源的地址

2、基本組成

通用的格式:schema://host[:port#]/path/…/[?query-string][#anchor]

名稱 功能
schema 訪問(wèn)服務(wù)器以獲取資源時(shí)要使用哪種協(xié)議伊磺,比如盛正,http,https 和 FTP 等
host HTTP 服務(wù)器的 IP 地址或域名
port# HTTP 服務(wù)器的默認(rèn)端口是 80屑埋,這種情況下端口號(hào)可以省略豪筝,如果使用了別的端口,必須指明摘能,例如http://www.cnblogs.com:8080
path 訪問(wèn)資源的路徑
query-string 發(fā)給 http 服務(wù)器的數(shù)據(jù)
anchor

舉個(gè)例子:
http://www.mywebsite.com/sj/test/test.aspx?name=sviergn&x=true#stuff
其中

名稱 對(duì)應(yīng)的字段
scheme http
host www.mywebsite.com
path /js/test/test.aspx
Query-string name=sviergn&x=true
anchor stuff

再來(lái)張比較直觀的圖

URL 組成

三续崖、HTTP 之請(qǐng)求篇

HTTP 的請(qǐng)求報(bào)文分為三個(gè)部分:請(qǐng)求行請(qǐng)求頭徊哑、請(qǐng)求體

請(qǐng)求報(bào)文

1袜刷、請(qǐng)求行

請(qǐng)求行(Request line)分為三個(gè)部分:請(qǐng)求方法聪富、請(qǐng)求地址協(xié)議版本

請(qǐng)求方法

HTTP/1.1 協(xié)議中共定義了八種方法(也叫“動(dòng)作”)來(lái)以不同的方式操作指定的資源

方法名 功能
GET 向指定的資源發(fā)出“顯示”請(qǐng)求莺丑,使用 GET 方法應(yīng)該只用在讀取數(shù)據(jù)上,而不應(yīng)該用于產(chǎn)生“副作用”的操作中
POST 指定資源提交數(shù)據(jù)墩蔓,請(qǐng)求服務(wù)器進(jìn)行處理(例如提交表單或者上傳文件)梢莽。數(shù)據(jù)被包含在請(qǐng)求文本中。這個(gè)請(qǐng)求可能會(huì)創(chuàng)建新的資源或者修改現(xiàn)有資源奸披,或兩者皆有昏名。
PUT 向指定資源位置上傳其最新內(nèi)容
DELETE 請(qǐng)求服務(wù)器刪除 Request-URI 所標(biāo)識(shí)的資源
OPTIONS 使服務(wù)器傳回該資源所支持的所有HTTP請(qǐng)求方法。用*來(lái)代替資源名稱阵面,向 Web 服務(wù)器發(fā)送 OPTIONS 請(qǐng)求轻局,可以測(cè)試服務(wù)器功能是否正常運(yùn)作
HEAD 與 GET 方法一樣洪鸭,都是向服務(wù)器發(fā)出指定資源的請(qǐng)求,只不過(guò)服務(wù)器將不傳回資源的本文部分仑扑,它的好處在于览爵,使用這個(gè)方法可以在不必傳輸全部?jī)?nèi)容的情況下,就可以獲取其中關(guān)于該資源的信息(原信息或稱元數(shù)據(jù))
TRACE 顯示服務(wù)器收到的請(qǐng)求镇饮,主要用于測(cè)試或診斷
CONNECT HTTP/1.1 中預(yù)留給能夠?qū)⑦B接改為通道方式的代理服務(wù)器蜓竹。通常用于 SSL 加密服務(wù)器的鏈接(經(jīng)由非加密的 HTTP 代理服務(wù)器)

其中,最常見(jiàn)的是 GET 和 POST 方法储藐,如果是 RESful 接口的話一般會(huì)用到 PUT俱济、DELETE、GET钙勃、POST(分別對(duì)應(yīng)增刪查改)蛛碌,這里附上一篇有關(guān) REST 的文章 什么是 REST

2、請(qǐng)求頭

請(qǐng)求頭可用于傳遞一些附加信息辖源,格式為:鍵: 值左医,注意冒號(hào)后面有一個(gè)空格

請(qǐng)求頭

請(qǐng)求和響應(yīng)常見(jiàn)通用的 Header

名稱 作用
Content-Type 請(qǐng)求體/響應(yīng)體的類型,如:text/plain同木、application/json
Accept 說(shuō)明接收的類型浮梢,可以多個(gè)值,用,(英文逗號(hào))分開(kāi)
Content-length 請(qǐng)求體/響應(yīng)體的長(zhǎng)度彤路,單位字節(jié)
Content-Encoding 請(qǐng)求體/響應(yīng)體的編碼格式秕硝,如 gzip、deflate
Accept-Encoding 告知對(duì)方我方接受的 Content-Encoding
ETag 給當(dāng)前資源的標(biāo)識(shí)洲尊,和Last-Modified远豺、If-None-MatchIf-Modified-Since配合坞嘀,用于緩存控制
Cache-Control 取值一般為no-cache躯护、max-age=xx,xx為整數(shù)丽涩,表示資源緩存有效期(秒)

常見(jiàn)的請(qǐng)求 Header

名稱 作用
Authorization 用于設(shè)置身份認(rèn)證信息
User-Agent 用戶標(biāo)識(shí)棺滞,如:OS 和瀏覽器的類型和版本
If-Modified-Since 值為上一次服務(wù)器返回的Last-Modified值,用于確定某個(gè)資源是否被更改過(guò)矢渊,沒(méi)有更改過(guò)就從緩存中讀取
If-None-Match 值為上一次服務(wù)器返回的 ETag 值继准,一般會(huì)和If-Modified-Since
Cookie 已有的Cookie
Referer 標(biāo)識(shí)請(qǐng)求引用自哪個(gè)地址,比如你從頁(yè)面 A 跳轉(zhuǎn)到頁(yè)面 B 時(shí)矮男,值為頁(yè)面 A 的地址
Host 請(qǐng)求的主機(jī)和端口號(hào)

請(qǐng)求體

請(qǐng)求體(又叫請(qǐng)求正文)是 post 請(qǐng)求方式中的請(qǐng)求參數(shù)移必,以 key = value 形式進(jìn)行存儲(chǔ),多個(gè)請(qǐng)求參數(shù)之間用&連接毡鉴,如果請(qǐng)求當(dāng)中請(qǐng)求體崔泵,那么在請(qǐng)求頭當(dāng)中的 Content-Length 屬性記錄的就是該請(qǐng)求體的長(zhǎng)度

包含請(qǐng)求體的請(qǐng)求消息

根據(jù)應(yīng)用場(chǎng)景的不同秒赤,HTTP 請(qǐng)求的請(qǐng)求體有三種不同的形式

第一種:

移動(dòng)開(kāi)發(fā)者常見(jiàn)的,請(qǐng)求體是任意類型的憎瘸,服務(wù)器不會(huì)解析請(qǐng)求體倒脓,請(qǐng)求體的處理需要自己解析,如 POST JSON 的時(shí)候就是這類

HTTP請(qǐng)求含思,形式一

第二種:

第二種和第三種都有固定的格式崎弃,是服務(wù)器端開(kāi)發(fā)人員最先了解的兩種。這里的格式要求就是 URL 中 Query String 的格式要求:多個(gè)鍵值對(duì)之間用&連接含潘,鍵與值之間用=連接饲做,且只能用 ASCII 字符,非 ASCII 字符需使用UrlEncode編碼

HTTP 請(qǐng)求遏弱,形式二

第三種:

第三種請(qǐng)求體被分成多個(gè)部分盆均,文件上傳 時(shí)會(huì)被使用,這種格式最先是被用于郵件傳輸中漱逸,每個(gè)字段/文件都被 boundary(Content-Type中指定的)分成單獨(dú)的段泪姨,每段以--加 boundary 開(kāi)頭,然后是該段的描述頭饰抒,描述頭之后空一行接內(nèi)容肮砾,請(qǐng)求結(jié)束的標(biāo)識(shí)為 boundary 后面加--

HTTP 請(qǐng)求,形式三

區(qū)分是否被當(dāng)成文件的關(guān)鍵是 Content-Disposition 是否包含 filename袋坑,因?yàn)槲募胁煌念愋驼檀Γ赃€要使用 Content-Type 指示文件的類型,如果不知道是什么類型取值可以為 application/octet-stream 表示文件是一個(gè)二進(jìn)制的文件枣宫,如果不是文件則 Content-Type 可以省略

四婆誓、HTTP 之響應(yīng)篇

HTTP 響應(yīng)的格式上除狀態(tài)行(第一行)與請(qǐng)求報(bào)文的請(qǐng)求行不一樣之外,其他的就格式而言是一樣的也颤,但排除狀態(tài)行和請(qǐng)求行的區(qū)別洋幻,從 Header 上還是可以區(qū)分出 HTTP 請(qǐng)求和 HTTP 響應(yīng)的區(qū)別的,怎么區(qū)別就要看前面的 Header 啦

HTTP 響應(yīng)報(bào)文

1翅娶、響應(yīng)狀態(tài)行

狀態(tài)碼

狀態(tài)碼(就是上圖中的響應(yīng)碼)文留,如果想查看各種狀態(tài)碼具體的含義,可以看一下這篇文章HTTP狀態(tài)碼對(duì)照表故觅,當(dāng)然這么多狀態(tài)碼要想全部都記住的話厂庇,還是比較困難的。

在平時(shí)我們只要記住這些就差不多了

狀態(tài)碼 對(duì)應(yīng)的信息
1XX 提示信息—表示請(qǐng)求已接收输吏,繼續(xù)處理
2XX 用于表示請(qǐng)求已被成功接收、理解替蛉、接收
3XX 用于表示資源(網(wǎng)頁(yè)等)被永久轉(zhuǎn)移到其它 URL贯溅,也就是所謂的重定向
4XX 客戶端錯(cuò)誤—請(qǐng)求有語(yǔ)法錯(cuò)誤或者請(qǐng)求無(wú)法實(shí)現(xiàn)
5XX 服務(wù)器端錯(cuò)誤—服務(wù)器未能實(shí)現(xiàn)合法的請(qǐng)求

2拄氯、響應(yīng)頭

響應(yīng)頭同樣可用于傳遞一些附加信息

響應(yīng)頭

常見(jiàn)的響應(yīng) Header

名稱 作用
Date 服務(wù)器的日期
Last-Modified 該資源最后被修改的時(shí)間
Transfer-Encoding 取值一般為 chunked,出現(xiàn)在 Content-Length 不能確定的情況下它浅,表示服務(wù)器不知道響應(yīng)板體的數(shù)據(jù)大小译柏,一般同時(shí)出現(xiàn)Content-Encoding響應(yīng)頭
Set-Cookie 設(shè)置 Cookie
Location 重定向到另一個(gè) URL,如輸入瀏覽器就輸入 baidu.com 回車姐霍,會(huì)自動(dòng)跳轉(zhuǎn)到https://www.baidu.com 就是通過(guò)這個(gè)響應(yīng)頭控制的
Server 后臺(tái)服務(wù)器

3鄙麦、響應(yīng)體

響應(yīng)體也就是網(wǎng)頁(yè)的正文內(nèi)容,一般在響應(yīng)頭中會(huì)用 Content-Length 來(lái)明確響應(yīng)體的長(zhǎng)度镊折,便于瀏覽器接收胯府,對(duì)于大數(shù)據(jù)量的正文信息,也會(huì)使用 chunked 的編碼方式恨胚。


猜你喜歡

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末赃泡,一起剝皮案震驚了整個(gè)濱河市寒波,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌升熊,老刑警劉巖俄烁,帶你破解...
    沈念sama閱讀 223,207評(píng)論 6 521
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異级野,居然都是意外死亡猴娩,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,455評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門勺阐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)卷中,“玉大人,你說(shuō)我怎么就攤上這事渊抽◇≡ィ” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 170,031評(píng)論 0 366
  • 文/不壞的土叔 我叫張陵懒闷,是天一觀的道長(zhǎng)十减。 經(jīng)常有香客問(wèn)我,道長(zhǎng)愤估,這世上最難降的妖魔是什么帮辟? 我笑而不...
    開(kāi)封第一講書人閱讀 60,334評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮玩焰,結(jié)果婚禮上由驹,老公的妹妹穿的比我還像新娘。我一直安慰自己昔园,他們只是感情好蔓榄,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,322評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布并炮。 她就那樣靜靜地躺著,像睡著了一般甥郑。 火紅的嫁衣襯著肌膚如雪逃魄。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 52,895評(píng)論 1 314
  • 那天澜搅,我揣著相機(jī)與錄音伍俘,去河邊找鬼。 笑死勉躺,一個(gè)胖子當(dāng)著我的面吹牛癌瘾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赂蕴,決...
    沈念sama閱讀 41,300評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼柳弄,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了概说?” 一聲冷哼從身側(cè)響起碧注,我...
    開(kāi)封第一講書人閱讀 40,264評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎糖赔,沒(méi)想到半個(gè)月后萍丐,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,784評(píng)論 1 321
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡放典,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,870評(píng)論 3 343
  • 正文 我和宋清朗相戀三年逝变,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奋构。...
    茶點(diǎn)故事閱讀 40,989評(píng)論 1 354
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡壳影,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出弥臼,到底是詐尸還是另有隱情宴咧,我是刑警寧澤,帶...
    沈念sama閱讀 36,649評(píng)論 5 351
  • 正文 年R本政府宣布径缅,位于F島的核電站掺栅,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏纳猪。R本人自食惡果不足惜氧卧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,331評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望氏堤。 院中可真熱鬧沙绝,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,814評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)脚祟。三九已至谬以,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間由桌,已是汗流浹背为黎。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,940評(píng)論 1 275
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留行您,地道東北人铭乾。 一個(gè)月前我還...
    沈念sama閱讀 49,452評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像娃循,于是被迫代替她去往敵國(guó)和親炕檩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,995評(píng)論 2 361

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理捌斧,服務(wù)發(fā)現(xiàn)笛质,斷路器,智...
    卡卡羅2017閱讀 134,722評(píng)論 18 139
  • 一捞蚂、概念(載錄于:http://www.cnblogs.com/EricaMIN1987_IT/p/3837436...
    yuantao123434閱讀 8,375評(píng)論 6 152
  • HTTP概述 超文本傳輸協(xié)議(HTTP妇押,HyperText Transfer Protocol) 是互聯(lián)網(wǎng)上應(yīng)用最...
    曹淵說(shuō)創(chuàng)業(yè)閱讀 3,857評(píng)論 2 61
  • API定義規(guī)范 本規(guī)范設(shè)計(jì)基于如下使用場(chǎng)景: 請(qǐng)求頻率不是非常高:如果產(chǎn)品的使用周期內(nèi)請(qǐng)求頻率非常高,建議使用雙通...
    有涯逐無(wú)涯閱讀 2,559評(píng)論 0 6
  • Http協(xié)議詳解 標(biāo)簽(空格分隔): Linux 聲明:本片文章非原創(chuàng)姓迅,內(nèi)容來(lái)源于博客園作者M(jìn)IN飛翔的HTTP協(xié)...
    Sivin閱讀 5,227評(píng)論 3 82