Http
http協議:Hyper Text Transfer Protocl,即插我文本傳輸協議,是用於萬維網www服務器傳輸超文本到本地瀏覽器的傳輸協議。Http協議是基於TCP/IP協議來進行傳遞數據的
主要特點
Http協議是屬於應用層的面向對象的協議,有着一下特點
-
簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規定了客戶與服務器聯繫的類型不同。由於HTTP協議簡單,使得HTTP服務器的程序規模小,因而通信速度很快。
-
靈活:HTTP允許傳輸任意類型的數據對象。正在傳輸的類型由Content-Type加以標記。
-
無連接:無連接的含義是限制每次連接只處理一個請求。服務器處理完客戶的請求,並收到客戶的應答後,即斷開連接。採用這種方式可以節省傳輸時間。
-
無狀態:HTTP協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺少狀態意味着如果後續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。另一方面,在服務器不需要先前信息時它的應答就較快。
-
支持B/S及C/S模式。
一次Http請求
1、客戶端連接到Web服務器
一個HTTP客戶端,通常是瀏覽器,點擊某個鏈接,與Web服務器的HTTP端口(默認爲80)建立一個TCP套接字連接
2、發送HTTP請求
通過TCP套接字,客戶端向Web服務器發送一個文本的請求報文,一個請求報文由請求行、請求頭部、空行和請求數據
4部分組成
3、服務器接受請求並返回HTTP響應
Web服務器解析請求,定位請求資源。服務器將資源複本寫到TCP套接字,由客戶端讀取。一個響應由狀態行、響應頭部、空行和響應數據4部分
組成
4、釋放連接TCP連接
若connection 模式爲close,則服務器主動關閉TCP鏈接,客戶端被動關閉連接,釋放TCP鏈接;若connection 模式爲keepalive,則該連接會保持一段時間,在該時間內可以繼續接收請求;
5、客戶端瀏覽器解析HTML內容
客戶端瀏覽器首先解析狀態行,查看錶明請求是否成功的狀態代碼。然後解析每一個響應頭,響應頭告知以下爲若干字節的HTML文檔和文檔的字符集。客戶端瀏覽器讀取響應數據HTML,根據HTML的語法對其進行格式化,並在瀏覽器窗口中顯示。
HTTP請求Request
發出的請求信息(message request)包括以下幾個:
POST / HTTP1.1//請求行
Host:www.xxxxx.com//請求頭部
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36
Content-Type:application/json
Content-Length:40
Connection: Keep-Alive//請求頭部,中間都是的
//空行
name=xxxxx//請求數據
-
請求行,用來說明請求類型,要訪問的資源以及所使用的HTTP版本(例如GET /images/logo.gif HTTP/1.1,表示從/images目錄下請求logo.gif這個文件)
-
請求頭,用來說明服務器要使用的附加信息(例如Accept-Language: en或者User-Agent等)
-
空行,請求頭部後面的空行是必須的,即使第四部分的請求數據爲空,也必須有空行。
-
請求數據,也叫主體,可以添加任意的其他數據,也可以爲空。
HTTP響應Response
HTTP/1.1 200 OK//狀態行
Date: Fri, 22 May 2009 06:07:21 GMT//消息報頭
Content-Type: text/html; charset=UTF-8//消息報頭
//空行
<html>//以下爲響應徵文
<head></head>
<body>
<!--body goes here-->
</body>
</html>
- 狀態行,由HTTP協議版本號, 狀態碼, 狀態消息 三部分組成
- 消息報頭,用來說明客戶端要使用的一些附加信息, Date:生成響應的日期和時間;Content-Type:指定了MIME類型的HTML(text/html),編碼類型是UTF-8
- 空行,消息報頭後面的空行是必須的
- 響應正文,服務器返回給客戶端的文本信息。
HTTP常見請求頭和響應頭
圖片來自《深入分析Java Web技術內幕》
HTTP之狀態碼
狀態代碼的第一個數字代表當前響應的類型:
- 1xx消息——請求已被服務器接收,繼續處理
- 2xx成功——請求已成功被服務器接收、理解、並接受
- 3xx重定向——需要後續操作才能完成這一請求
- 4xx請求錯誤——請求含有詞法錯誤或者無法被執行
- 5xx服務器錯誤——服務器在處理某個正確請求時發生錯誤
常用的狀態碼
200 OK //客戶端請求成功
400 Bad Request //客戶端請求有語法錯誤,不能被服務器所理解
401 Unauthorized //請求未經授權,這個狀態代碼必須和WWW-Authenticate報頭域一起使用
403 Forbidden //服務器收到請求,但是拒絕提供服務
404 Not Found //請求資源不存在,eg:輸入了錯誤的URL
500 Internal Server Error //服務器發生不可預期的錯誤
503 Server Unavailable //服務器當前不能處理客戶端的請求,一段時間後可能恢復正常
更多狀態碼可查看更多狀態碼
GET和POST請求的區別
- GET提交的數據會放在URL之後,以?分割URL和傳輸數據,參數之間以&相連,如/api/v1/fitz?name=fitz&pwd=123456。 POST方法是把提交的數據放在HTTP包的Body中.
- GET提交的數據大小有限制(因爲瀏覽器對URL的長度有限制),而POST方法提交的數據沒有限制.
- GET方式需要使用Request.QueryString來取得變量的值,而POST方式通過Request.Form來獲取變量的值。
- GET方式提交數據,會帶來安全問題,比如一個登錄頁面,通過GET方式提交數據時,用戶名和密碼將出現在URL上,如果頁面可以被緩存或者其他人可以訪問這臺機器,就可以從歷史記錄獲得該用戶的賬號和密碼.