一.http協議的定義:
http(Hypertext transfer protocol)超文本傳輸協議,通過瀏覽器和服務器進行數據交互,進行超文本(文本、圖片、視頻等)傳輸的規定。也就是說,http協議規定了超文本傳輸所要遵守的規則。
二.HTTP協議的特點:
1.HTTP協議是無狀態的
就是說每次HTTP請求都是獨立的,任何兩個請求之間沒有什么必然的聯系。但是在實際應用當中並不是完全這樣的,引入了Cookie和Session機制來關聯請求。
2.多次HTTP請求
在客戶端請求網頁時多數情況下並不是一次請求就能成功的,服務端首先是響應HTML頁面,然后瀏覽器收到響應之后發現HTML頁面還引用了其他的資源,例如,CSS,JS文件,圖片等等,還會自動發送HTTP請求這些需要的資源。現在的HTTP版本支持管道機制,可以同時請求和響應多個請求,大大提高了效率。
3.基於TCP協議
HTTP協議目的是規定客戶端和服務端數據傳輸的格式和數據交互行為,並不負責數據傳輸的細節。底層是基於TCP實現的。現在使用的版本當中是默認持久連接的,也就是多次HTTP請求使用一個TCP連接。
三、HTTP報文
1.請求報文
舉例:
GET /wxisme HTTP/1.1 Host: www.cnblogs.com User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; zh-CN; rv:1.8.1) Gecko/20061010 Firefox/2.0 Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 Accept-Language: en-us,zh-cn;q=0.7,zh;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Proxy-Connection: keep-alive Cookie: ASP.NET_SessionId=ey5drq45lsomio55hoydzc45 Cache-Control: max-age=0
簡單來說請求報文就是由請求行、請求頭、內容實體組成的,注意,每一行的末尾都有回車和換行,在內容實體和請求頭之間另有一個空行。其中請求行指定的是請求方法、請求URL、協議版本;請求頭是鍵值對的形式存在的,就是字段名:值;內容實體就是要傳輸的數據。稍后會對方法、請求頭字段做詳細的說明。
2.響應報文
舉例:
HTTP/1.1 200 OK Date: Tue, 12 Jul 2016 21:36:12 GMT Content-Length: 563 Content-Type: text/html <html> <body> Hello http! </body> </html>
簡單來說響應報文由狀態行、響應首部字段(響應頭)、響應實體組成,其中第一行是狀態行,依次包含HTTP版本,狀態碼和狀態短語組成;在一個回車換行之后是響應頭,也是鍵值對的形式,字段名:值;然后會有一個空行也包含回車換行,之后是響應實體,就是要傳輸的數據。在上面的例子當中就是一個非常簡單的HTML頁面。對於響應狀態碼,首部字段鍵值對稍后會有更加詳細的說明。
四、HTTP請求方法
請求方法是客戶端用來告知服務器其動作意圖的方法。就像下達命令一樣。在HTTP1.1版本中支持GET、POST等近10種方法。需要注意的是方法名區分大小寫,需要用大寫字母。下面詳細說明。
1.GET:獲取資源
GET方法用來請求訪問已被URI識別的資源。也就是指定了服務器處理請求之后響應的內容。
2.POST:傳輸實體主體
POST方法用來傳輸實體主體。POST與GET的區別之一就是目的不同,二者之間的區別會在文章的最后詳細說明。雖然GET方法也可以傳輸,但是一般不用,因為GET的目的是獲取,POST的目的是傳輸。
3.PUT:傳輸文件
PUT方法用來傳輸文件。類似FTP協議,文件內容包含在請求報文的實體中,然后請求保存到URL指定的服務器位置。
4.HEAD:獲得報文首部
HEAD方法類似GET方法,但是不同的是HEAD方法不要求返回數據。用於確認URI的有效性及資源更新時間等。
5.DELETE:刪除文件
DELETE方法用來刪除文件,是與PUT相反的方法。DELETE是要求返回URL指定的資源。
6.OPTIONS:詢問支持的方法
因為並不是所有的服務器都支持規定的方法,為了安全有些服務器可能會禁止掉一些方法例如DELETE、PUT等。那么OPTIONS就是用來詢問服務器支持的方法。
7.TRACE:追蹤路徑
TRACE方法是讓Web服務器將之前的請求通信環回給客戶端的方法。這個方法並不常用。
8.CONNECT:要求用隧道協議連接代理
CONNECT方法要求在與代理服務器通信時建立隧道,實現用隧道協議進行TCP通信。主要使用SSL/TLS協議對通信內容加密后傳輸。
匯總:
五、HTTP的響應狀態碼
狀態碼是用來告知客戶端服務器端處理請求的結果。憑借狀態碼用戶可以知道服務器是請求處理成功、失敗或者是被轉發;這樣出現了錯誤也好定位。狀態碼是由3位數字加原因短語組成。3位數字中的第一位是用來指定狀態的類別。共有5種。
HTTP狀態碼一共有60多種,但是不用全部都記住,因為大部分在工作當中是不經常使用的。經常使用的大概就是16種,下面來詳細介紹。(其實最最常用的也就8種,下面有背景色的就是)
1. 200:OK
這個沒有什么好說的,是代表請求被正常的處理成功了。
2. 204:No Content
請求處理成功,但是沒有數據實體返回,也不允許有實體返回。比如說HEAD請求,可能就會返回204 No Content,因為HEAD就是只獲取頭信息。這里簡單提一下205 Reset Content,和204 No Content的區別是不但沒有數據實體返回,而且還需要重置表單,方便用戶再次輸入。
3. 206:Partial Content
這是客戶端使用Content-Range指定了需要的實體數據的范圍,然后服務端處理請求成功之后返回用戶需要的這一部分數據而不是全部,執行的請求就是GET。返回碼就是206:Partial Content。
4. 301 : Moved Permanently
代表永久性定向。該狀態碼表示請求的資源已經被分配了新的URL,以后應該使用資源現在指定的URL。也就是說如果已經把資源對應的URL保存為書簽了,這是應該按照Location首部字段提示的URL重新保存。
5. 302:Found
代表臨時重定向。該狀態碼表示請求的資源已經被分配了新的URL,但是和301的區別是302代表的不是永久性的移動,只是臨時的。就是說這個URL還可能會發生改變。如果保存成書簽了也不會更新。
6. 303:See Other
和302的區別是303明確規定客戶端應當使用GET方法。
7. 304:Not Modified
該狀態碼表示客戶端發送附帶條件請求時,服務器端允許請求訪問資源,但是沒有滿足條件。304狀態碼返回時不包含任何數據實體。304雖然被划分在3XX中但是和重定向沒有關系。
8. 307:Temporary Redirect
臨時重定向,與302 Found相同,但是302會把POST改成GET,而307就不會。
9. 400:Bad Request
400表示請求報文中存在語法錯誤。需要修改后再次發送。
10. 401:Unauthorized
該狀態碼表示發送的請求需要有通過HTTP認證的認證信息。
11. 403:Forbidden
表明請求訪問的資源被拒絕了。沒有獲得服務器的訪問權限,IP被禁止等。
12. 404:Not Found
表明請求的資源在服務器上找不到。當然也可以在服務器拒絕請求且不想說明理由時使用。
13. 408:Request Timeout
表示客戶端請求超時,就是在客戶端和服務器建立連接后服務器在一定時間內沒有收到客戶端的請求。
14. 500:Internal Server Error
表明服務器端在執行請求時發生了錯誤,很有可能是服務端程序的Bug或者臨時故障。
15. 503:Service Unavailable
表明服務器暫時處於超負載或正在進行停機維護,現在無法處理請求。如果事先得知解除以上狀況需要的時間,最好寫入Retry-After字段再返回給客戶端。
16. 504:Getaway Timeout
網關超時,是代理服務器等待應用服務器響應時的超時,和408 Request Timeout的卻別就是504是服務器的原因而不是客戶端的原因