Http協議

老早就學了Http協議,但是最開始學HTTP協議的時候,沒有從內心意識到他的地位之高,它的使用範圍之廣。那時候學習的時候,基本時聯繫到平時使用的Apache Http包或者Java HttpUrlConnection來考慮了。更多地是在應用,或者說是比較,但是最近接觸到的各種知識,像REST規範。以及使用的API各種接口。越來越覺得HTTP協議是簡單但重要的東西。以前對HTTP協議,是從應用來考慮的,而現在我覺得應該從協議上面來重新學習一下。

請求消息

平時使用最多的,接觸最多的,都是POST方式,GET方式請求,其實這只是HTTP協議中請求的Method而已。HTTP協議的第一行(請求行)就是包括下面這些內容:

METHOD URI  VERSION CRLF

example:

GET /index.html http/1.0 CRLF 

對應中文的解釋分別是:Http請求方法,uri路徑,http協議版本(有1.0和1.1),回車換行。而HTTP協議中,METHOD有GET,POST,HEAD,PUT,DELETE,TRACE。

在請求行之後,整個請求頭還有一系列的請求報頭,像Host(HTTP1.1中,Host是必須的),Accept,If-Modified-Since等等。在請求消息報頭後面,還有一個請求體,POST請求內容就放請求體中,而GET請求則放在url後面(?param1=1&param2=2)。

這是一個非常簡單的請求的例子:

GET /index.html http/1.1 CRLF
Host:localhost:8080
Accept:*/*

響應消息

響應消息是指HTTP協議返回的消息,包括狀態行,響應頭,響應體。狀態行格式如下所示:

HTTP-VERSION STATUS-Code RESULT-Phrase

比如:

http/1.1 200 ok

在狀態行之後就是響應頭,響應頭類似於請求頭,包含了響應的一些信息,以key:value的形式,其中包括諸如Allow,Date,Content-Length等。這個裏面每個響應頭都有重要用處,在平時的使用中,如果能夠理解這些,對於一些請求錯誤,會有非常大的幫助,就比如說Encoding,Language。亂碼就是來源於請求頭,和響應頭的這些信息不對。

在響應頭之後,就是響應體,HTTP返回的附加內容就是放在響應體當中。比如請求文件,那麼文件內容就在這個裏面。

GET與POST的區別

在平常對HTTP的使用當中,用的最多的就是這兩個了,這兩個大部分的區別平常基本是明瞭的:

  1. GET的參數放在url後面,而POST的參數放在body裏面。這樣GET的參數長度有限制(1024),而POST長度沒有限制。另外這樣,POST請求也更加安全。參數放在url中,會有紀錄。而被人查看到。
  2. GET沒有body,而POST有body
  3. 服務器解析GET參數是從Request.QueryString中解析,而POST是從Request.Form中解析。這一點需要特別注意,特別是在使用一些沒有對請求參數進行封裝的HTTP包的時候。

HTTP與具體代碼

很多人可能一開始接觸的不是協議,而是代碼。而現在很多應用包都非常好地封裝了HTTP協議。如果不去了解HTTP協議,對於這些封裝的API函數,顯然是無法徹底熟悉的。

其實從HTTP協議上面來看,那些對HTTP請求控制的API,可以分成三個部分,請求方法,請求頭內容設置,請求體寫入。同樣響應也是一樣的。從這個思路上去看HTTP請求與響應,對於HTTP的處理就會非常清晰明瞭。

我們使用最多的可能時響應行中的狀態碼,我們經常會遇到4開頭,5開頭的錯誤。遇到這種,從狀態碼就可以發現是什麼錯誤原因了。比如說503,那可能是服務器出現錯誤了,去查看服務器的日誌。如果404,就可以考慮是不是自己的url寫錯了某個字母。

除了狀態碼外,響應頭跟請求頭的對應也是非常重要。還有有時候,得到的響應內容是亂碼的,這個時候就要看客戶端解碼是否使用了正確的編碼,服務器端寫入是否採用了正確的編碼,根HTTP響應頭協議中的編碼格式是否一致。很快就可以查找出來,而不是拿着亂碼的錯誤,到處google,百度,搜索引擎很多時候都不如自己明白詳裏後,查找原因並且解決問題來的快。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章