重溫HTTP,你到底做了什么?
Java極客技術
Java 人的社區,專注 Java 一百年!
之前在回憶面試題的時候,面試官曾經問過我關于網絡協議的一些東西,回答的當時感覺自己很垃圾,然后面試結束之后,自行百度,翻閱書籍,然后做了細致的整理,現在我就來分享給大家。
HTTP 你到底是個什么鬼
HTTP 協議是 Hyper Text Transfer Protocol(超文本傳輸協議)的縮寫,是用于從萬維網服務器傳輸超文本到本地瀏覽器的傳送協議。HTTP 是基于 TCP/IP 協議通信協議來傳遞數據(HTML 文件、圖片文件、查詢結果等)。它不涉及數據包(packet)傳輸,主要規定了客戶端和服務器之間的通信格式,默認使用80端口。
這其實就是百度百科里面的精簡化的內容,雖然說不上太細致,但是已經算是對 HTTP 做了一個大概的描述,我們接下來就從以下的幾個方面來看一下這個HTTP 吧。
HTTP 報文
一般的,用于 HTTP 協議交互的信息被稱為 HTTP 報文,那么說到 HTTP 報文,我們做開發的,很多時候都理解成報文是由一行一行的簡單字符串,確實也是,因為 HTTP 報文都是純文本,所以,你就可以非常方便的進行讀寫。我們來看下圖:
上圖顯示的就是一個簡單的 HTTP 事務的報文,圖中分為了2部分,請求報文和響應報文。
請求報文、響應報文
從客戶端發往服務器的報文叫請求報文,也叫做request message?,服務器在接收到請求報文之后,不得象征性的給人家返回點東西?禮尚往來嘛,這時候,服務器端相應一下,發給客戶端一點東西,這就稱之為相應報文。
報文分為了三個層級,也算是三個東西,起始行,首部,主體,這三個東西我們必須得知道他們到底是干啥的,這樣被面試官問到之后,至少能說點東西出來。
起始行
圖片中的起始行中,請求報文和響應報文的起始行是不一樣的,【GET /test/hi-there.txt HTTP/1.0】,
GET 服務器通過 GET 方法獲取資源
/test/hi-there.txt 這是資源 get 請求就是獲取這個資源
HTTP1.0 就是指定的是 HTTP 協議版本為1.0
響應報文的起始行主要是說明服務器的響應情況 【HTTP/1.0 ?200 ?OK】
同樣的 HTTP1.0還是版本,而這個200表示的是狀態碼,OK 相應狀態沒問題。
以上的就是起始行的所有內容介紹了,是不是很清晰很透徹了?那我們來看這個首部。
首部
大家有沒有注意到首部都是鍵值對的形式存在的,就是都是 key:value 這種形式的,如下,
請求報文首部:
Accept:text/*
Accept-Language:en,fr
響應報文首部:
Content-Type:text/plain
Content-length:19
光這么看其實很沒意思是吧,看了半天還得靠自己的英文才知道是啥意思,我給大家找來個關于各種首部字段的說明。
通用首部字段 HTTP1.1
請求首部字段:
響應首部字段:
實體首部字段:
其實這么多首部字段,說白了就是一句話?使用首部字段是為了給瀏覽器和服務器提供報文主體大小、所使用的語言、認證信息等內容。
看就是這么簡單,方便,關于怎么去使用,本文先不做講解,不然這首部字段說起來,那就沒盡頭了,有興趣的小伙伴不妨可以手動去搜索一下把!
主體
大家可以回去看一下圖一,圖一中響應報文的主體,hi,I am message,實體的主體和報文的主體是一個可選的數據塊。與起始行和首部不同的是,主體中可包含文本或二進制數據,也可以為空如圖1中的請求報文主體,Content-type行說明了主體是一個純文本文檔,Content-length 說明了主體有19字節
其實有些人也會這么理解,Http報文包括請求報文和響應報文兩大部分,其中請求報文由請求行(request line)、請求頭(header)、空行和請求體四個部分組成。而響應報文由狀態行、響應頭部、空行和響應體四個部分組成。
給大家一幅圖,這個是我之前從別的地方看來的,感覺和這句話很搭配。
關于HTTP報文我們先告一段落,我們繼續往下看!
HTTP請求方式
開發人員都知道,請求方式最常用的就是 GET 和 POST,但是實際上不止這兩種,我之前竟然一點不知道,內心表示 HTTP 你還是我認識的 HTTP 么?
GET:請求指定的頁面信息,并返回實體主體。
HEAD:類似于get請求,只不過返回的響應中沒有具體的內容,用于獲取報頭。
POST:向指定資源提交數據進行處理請求(例如提交表單或者上傳文件)。數據被包含在請求體中。
PUT:從客戶端向服務器傳送的數據取代指定的文檔的內容。
DELETE:請求服務器刪除指定的頁面。
后來當我看到之后,內心接受了,原來是這么回事,HTTP1.0 定義了三種請求方法:GET, POST 和 HEAD 方法。HTTP1.1新增了五種請求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
關于 HTTP 請求就說這么多了,接下來就是 HTTP 狀態碼了,這三位數字描述了請求過程中所發生的情況。每個狀態碼的第一位數字用于描述狀態的一般類型(“成功”、“出錯”等)。
HTTP狀態碼
給大家送上兩個圖,之前在刷面試的時候無意間看到的圖,感覺特別的形象,幫助大家理解狀態碼有神奇的功效。
301—永久移動。被請求的資源已被永久移動位置;
302—請求的資源現在臨時從不同的 URI 響應請求;
305—使用代理。被請求的資源必須通過指定的代理才能被訪問;
307—臨時跳轉。被請求的資源在臨時從不同的URL響應請求;
400—錯誤請求;
402—需要付款。該狀態碼是為了將來可能的需求而預留的,用于一些數字貨幣或者是微支付;
403—禁止訪問。服務器已經理解請求,但是拒絕執行它;
404—找不到對象。請求失敗,資源不存在;
406—不可接受的。請求的資源的內容特性無法滿足請求頭中的條件,因而無法生成響應實體;
408—請求超時;
409—沖突。由于和被請求的資源的當前狀態之間存在沖突,請求無法完成;
410—遺失的。被請求的資源在服務器上已經不再可用,而且沒有任何已知的轉發地址;
413—響應實體太大。服務器拒絕處理當前請求,請求超過服務器所能處理和允許的最大值。
417—期望失敗。在請求頭 Expect 中指定的預期內容無法被服務器滿足;
418—我是一個茶壺。超文本咖啡罐控制協議,但是并沒有被實際的HTTP服務器實現;
420—方法失效。
422—不可處理的實體。請求格式正確,但是由于含有語義錯誤,無法響應;
500—服務器內部錯誤。服務器遇到了一個未曾預料的狀況,導致了它無法完成對請求的處理;
這個狀態碼的圖是在網上找的,鏈接送上【http://www.sohu.com/a/278045231_120014184】
以上就是我想給大家介紹的 HTTP,你到底是什么鬼,下一篇文章我將會給大家講述 HTTP1.0 和 HTTP1.1 的那些事!敬請期待呦!
我是懿,一個正在被打擊卻努力前進的碼農。
歡迎加入我們的知識星球,一起成長,交流經驗。加入方式,長按下方二維碼噢
最后,我想重復一句話:選擇和一群優秀的人一起成長,你成長的速度絕對會不一樣!
本文轉載自公眾號【純潔的微笑】
HTTP TCP/IP
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。