一、HTTP協議概述
HTTP是一個簡單的請求-響應協議,屬於應用層的面向對象的協議,由於其簡捷、快速的方式,適用於分布式超媒體信息系統。它通常運行在TCP之上。它指定了客戶端發送給服務器什么樣的消息得到什么樣的響應。
二、HTTP協議的主要特點可概括如下:
1、B/S結構(Browser/Server,瀏覽器/服務器模式),這種模式統一了客戶端,將系統功能實現的核心部分集中到服務器上,簡化了系統的開發、維護和使用。客戶機上只要安裝一個瀏覽器就可以訪問服務器。
2、簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、POST。每種方法規定了客戶與服務器聯系的類型不同。由於HTTP協議簡單,使得HTTP服務器的程序規模小,因而通信速度很快。
3、靈活:HTTP允許傳輸任意類型的數據對象。正在傳輸的類型由Content-Type加以標記。
4、無連接:每次連接只處理一個請求。服務器處理完客戶的請求,並收到客戶的應答后,即斷開連接。采用這種方式可以節省傳輸時間。
5、無狀態:HTTP無狀態協議,是指協議對於事務處理沒有記憶能力。缺少狀態意味着如果后續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。另一方面,在服務器不需要先前信息時它的應答就較快。
三、HTTP協議詳解之請求篇
http請求由三部分組成,分別是:請求行、消息報頭(請求頭)、請求正文(請求內容)。
1、請求行以一個方法符號開頭,以空格分開,后面跟着請求的URI和協議的版本。
格式如下:Method Request-URI HTTP-Version CRLF
Method:表示請求方法如GET,POST等;
Request-URI:是一個統一資源標識符如www.baidu.com;
HTTP-Version:表示請求的HTTP協議版本如/ HTTP/1.1 ;
CRLF:表示回車和換行(\r\n 除了作為結尾的CRLF外,不允許出現單獨的CR或LF字符)。
2、請求頭
accept:瀏覽器通過這個頭告訴服務器,它所支持的數據類型。
Accept-Charset:瀏覽器通過這個頭告訴服務器,它支持哪種字符集。
Accept-Encoding:瀏覽器通過這個頭告訴服務器,支持的壓縮格式。
Accept-Language:瀏覽器通過這個頭告訴服務器,它的語言環境。
Host:瀏覽器通過這個頭告訴服務器,想訪問哪台主機。
If-Modified-Since:瀏覽器通過這個頭告訴服務器,緩存數據的時間。
Referer:瀏覽器通過這個頭告訴服務器,客戶機是哪個頁面來的 防盜鏈。
Connection:瀏覽器通過這個頭告訴服務器,請求完后是斷開鏈接還是何持鏈接。
X-Requested-With:XMLHttpRequest 代表通過ajax方式進行訪問。
User-Agent:請求載體的身份標識。
3、請求方法(所有方法全為大寫)有多種,各個方法的解釋如下:
| 方法 | 描述 |
|---|---|
| GET | 請求獲取Request-URI所標識的資源(請求指定的頁面信息),並返回實體主體。 |
| HEAD | 類似於 GET 請求,只不過返回的響應中沒有具體的內容,響應消息報頭,用於獲取報頭 |
| POST | 向指定資源提交數據進行處理請求(例如提交表單或者上傳文件)。數據被包含在請求體中。POST 請求可能會導致新的資源的建立和/或已有資源的修改。 |
| PUT | 請求服務器存儲一個資源,從客戶端向服務器傳送的數據取代指定的文檔的內容。 |
| DELETE | 請求服務器刪除指定的頁面。 |
| CONNECT | HTTP/1.1 協議中預留給能夠將連接改為管道方式的代理服務器。 |
| OPTIONS | 請求查詢服務器的性能,或者查詢與資源相關的選項和需求,允許客戶端查看服務器的性能。 |
| TRACE | 請求服務器回顯服務器收到的請求,主要用於測試或診斷。 |
| PATCH | 是對 PUT 方法的補充,用來對已知資源進行局部更新 。 |
四、HTTP協議詳解之響應篇
在接收和解釋請求消息后,服務器返回一個HTTP響應消息。HTTP響應也是由三個部分組成,分別是:狀態行、消息報頭(響應頭)、響應正文。
1、狀態行
狀態行格式:HTTP-Version Status-Code Reason-Phrase CRLF
HTTP-Version:表示請求的HTTP協議版本如/ HTTP/1.1;
Status-Code:表示服務器發回的響應狀態代碼,如200表示請求響應成功;
Reason-Phrase:表示狀態代碼的文本描述。
狀態代碼有三位數字組成,第一個數字定義了響應的類別,且有五種可能取值,如下列表所示:
1xx
|
消息
|
描述
|
|---|---|
|
100 Continue
|
服務器僅接收到部分請求,但是一旦服務器並沒有拒絕該請求,客戶端應該繼續發送其余的請求。
|
|
101 Switching Protocols
|
服務器轉換協議:服務器將遵從客戶的請求轉換到另外一種協議。
|
2xx
|
消息
|
描述
|
|---|---|
|
200 OK
|
請求成功(其后是對GET和POST請求的應答文檔。)
|
|
201 Created
|
請求被創建完成,同時新的資源被創建。
|
|
202 Accepted
|
供處理的請求已被接受,但是處理未完成。
|
|
203 Non-authoritative Information
|
文檔已經正常地返回,但一些應答頭可能不正確,因為使用的是文檔的拷貝。
|
|
204 No Content
|
沒有新文檔。瀏覽器應該繼續顯示原來的文檔。如果用戶定期地刷新頁面,而Servlet可以確定用戶文檔足夠新,這個狀態代碼是很有用的。
|
|
205 Reset Content
|
沒有新文檔。但瀏覽器應該重置它所顯示的內容。用來強制瀏覽器清除表單輸入內容。
|
|
206 Partial Content
|
客戶發送了一個帶有Range頭的GET請求,服務器完成了它。
|
3xx
|
消息
|
描述
|
|---|---|
|
300 Multiple Choices
|
多重選擇。鏈接列表。用戶可以選擇某鏈接到達目的地。最多允許五個地址。
|
|
301 Moved Permanently
|
所請求的頁面已經轉移至新的url。
|
|
302 Found
|
所請求的頁面已經臨時轉移至新的url。
|
|
303 See Other
|
所請求的頁面可在別的url下被找到。
|
|
304 Not Modified
|
未按預期修改文檔。客戶端有緩沖的文檔並發出了一個條件性的請求(一般是提供If-Modified-Since頭表示客戶只想比指定日期更新的文檔)。服務器告訴客戶,原來緩沖的文檔還可以繼續使用。
|
|
305 Use Proxy
|
客戶請求的文檔應該通過Location頭所指明的代理服務器提取。
|
|
306
Unused
|
此代碼被用於前一版本。目前已不再使用,但是代碼依然被保留。
|
|
307 Temporary Redirect
|
被請求的頁面已經臨時移至新的url。
|
4xx
|
消息
|
描述
|
|---|---|
|
400 Bad Request
|
服務器未能理解請求。
|
|
401 Unauthorized
|
被請求的頁面需要用戶名和密碼。
|
|
401.1
|
登錄失敗。
|
|
401.2
|
服務器配置導致登錄失敗。
|
|
401.3
|
由於 ACL 對資源的限制而未獲得授權。
|
|
401.4
|
篩選器授權失敗。
|
|
401.5
|
ISAPI/CGI 應用程序授權失敗。
|
|
401.7
|
訪問被 Web 服務器上的 URL 授權策略拒絕。這個錯誤代碼為 IIS 6.0 所專用。
|
|
402 Payment Required
|
此代碼尚無法使用。
|
|
403 Forbidden
|
對被請求頁面的訪問被禁止。
|
|
403.1
|
執行訪問被禁止。
|
|
403.2
|
讀訪問被禁止。
|
|
403.3
|
寫訪問被禁止。
|
|
403.4
|
要求 SSL。
|
|
403.5
|
要求 SSL 128。
|
|
403.6
|
IP 地址被拒絕。
|
|
403.7
|
要求客戶端證書。
|
|
403.8
|
站點訪問被拒絕。
|
|
403.9
|
用戶數過多。
|
|
403.10
|
配置無效。
|
|
403.11
|
密碼更改。
|
|
403.12
|
拒絕訪問映射表。
|
|
403.13
|
客戶端證書被吊銷。
|
|
403.14
|
拒絕目錄列表。
|
|
403.15
|
超出客戶端訪問許可。
|
|
403.16
|
客戶端證書不受信任或無效。
|
|
403.17
|
客戶端證書已過期或尚未生效。
|
|
403.18
|
在當前的應用程序池中不能執行所請求的 URL。這個錯誤代碼為 IIS 6.0 所專用。
|
|
403.19
|
不能為這個應用程序池中的客戶端執行 CGI。這個錯誤代碼為 IIS 6.0 所專用。
|
|
403.20
|
Passport 登錄失敗。這個錯誤代碼為 IIS 6.0 所專用。
|
|
404 Not Found
|
服務器無法找到被請求的頁面。
|
|
404.0
|
(無)–沒有找到文件或目錄。
|
|
404.1
|
無法在所請求的端口上訪問 Web 站點。
|
|
404.2
|
Web 服務擴展鎖定策略阻止本請求。
|
|
404.3
|
MIME 映射策略阻止本請求。
|
|
405 Method Not Allowed
|
請求中指定的方法不被允許。
|
|
406 Not Acceptable
|
服務器生成的響應無法被客戶端所接受。
|
|
407 Proxy Authentication Required
|
用戶必須首先使用代理服務器進行驗證,這樣請求才會被處理。
|
|
408 Request Timeout
|
請求超出了服務器的等待時間。
|
|
409 Conflict
|
由於沖突,請求無法被完成。
|
|
410 Gone
|
被請求的頁面不可用。
|
|
411 Length Required
|
"Content-Length" 未被定義。如果無此內容,服務器不會接受請求。
|
|
412 Precondition Failed
|
請求中的前提條件被服務器評估為失敗。
|
|
413 Request Entity Too Large
|
由於所請求的實體的太大,服務器不會接受請求。
|
|
414 Request-url Too Long
|
由於url太長,服務器不會接受請求。當post請求被轉換為帶有很長的查詢信息的get請求時,就會發生這種情況。
|
|
415 Unsupported Media Type
|
由於媒介類型不被支持,服務器不會接受請求。
|
|
416 Requested Range Not Satisfiable
|
服務器不能滿足客戶在請求中指定的Range頭。
|
|
417 Expectation Failed
|
執行失敗。
|
|
423
|
鎖定的錯誤。
|
5xx
|
消息
|
描述
|
|---|---|
|
500 Internal Server Error
|
請求未完成。服務器遇到不可預知的情況。
|
|
500.12
|
應用程序正忙於在 Web 服務器上重新啟動。
|
|
500.13
|
Web 服務器太忙。
|
|
500.15
|
不允許直接請求 Global.asa。
|
|
500.16
|
UNC 授權憑據不正確。這個錯誤代碼為 IIS 6.0 所專用。
|
|
500.18
|
URL 授權存儲不能打開。這個錯誤代碼為 IIS 6.0 所專用。
|
|
500.100
|
內部 ASP 錯誤。
|
|
501 Not Implemented
|
請求未完成。服務器不支持所請求的功能。
|
|
502 Bad Gateway
|
請求未完成。服務器從上游服務器收到一個無效的響應。
|
|
502.1
|
CGI 應用程序超時。 ·
|
|
502.2
|
CGI 應用程序出錯。
|
|
503 Service Unavailable
|
請求未完成。服務器臨時過載或當機。
|
|
504 Gateway Timeout
|
網關超時。
|
|
505 HTTP Version Not Supported
|
服務器不支持請求中指明的HTTP協議版本。
|
2、消息報頭(常見響應頭)
Location:服務器通過這個頭,來告訴瀏覽器跳到哪里
Server:服務器通過這個頭,告訴瀏覽器服務器的型號
Content-Encoding:服務器通過這個頭,告訴瀏覽器,數據的壓縮格式
Content-Length:服務器通過這個頭,告訴瀏覽器回送數據的長度
Content-Language:服務器通過這個頭,告訴瀏覽器語言環境
Content-Type:服務器通過這個頭,告訴瀏覽器回送數據的類型
Refresh:服務器通過這個頭,告訴瀏覽器定時刷新
Content-Disposition:服務器通過這個頭,告訴瀏覽器以下載方式打數據
Transfer-Encoding:服務器通過這個頭,告訴瀏覽器數據是以分塊方式回送的
Expires:-1 控制瀏覽器不要緩存
Cache-Control:no-cache
Pragma:no-cache
3、響應體:根據客戶端指定的請求信息,發送給客戶端的指定數據
