推薦學習:
如果將 HTTP協定當做一個人來比較的話,想要深入瞭解這個人的時候,肯定會先去了解對方的性格特徵等。那麼 HTTP協定 有什麼特徵呢?總的來說有以下幾個特點:
- 1、第一個特點:
HTTP協定支援 客戶/伺服器端 模式
;因為 HTTP 協定 是TCP、IP 協定簇的一員,與其他成員一樣
,用於使用者端與伺服器之間的通訊;而客戶/伺服器模式
的工作方式是由使用者端向伺服器發出請求,伺服器端響應請求,並進行響應的服務;所有的HTTP請求
都是從使用者端開始建立通訊,伺服器端在沒有接收到任何的使用者端請求之前是不會發出響應的;這就是 HTTP協定 的特點之一
。
- 2、第二個特點:
簡單快速
;使用者端向伺服器請求服務的時候,只需要傳入請求的方法和路徑;常用的請求方法有GET、HEAD、POST
(除了這三種之外,還有其他不那麼常用的方法,有興趣的小夥伴可以在 HTTP協定狀態及報文組成 一文進行拓展);由於 HTTP協定 簡單,使得 HTTP伺服器的程式規模小,因而通訊速度很快。
- 3、第三個特點:
靈活
;之所以靈活是因為 HTTP 允許傳輸任意型別的資料物件;傳輸的型別由Content-Type
加以標記內容型別,支援多種內容格式的傳輸。(相容性很強)
- 4、第四個特點:無連線;這裡的無連線可不是沒有連線的意思,而是限制每個連線只處理一個請求。伺服器處理完使用者端的請求並收到使用者端的應答之後,就斷開連線。採用如此的設計方式呢,能夠節省傳輸時間。
- 拓展:可能有同學認為一個頁面有很多個 HTTP 請求,來回這樣連線、斷開會效率很低。其實早期這麼做的原因是因為產生於網際網路,因此伺服器需要處理同時面向全世界 數十萬、上百萬 的網頁存取。但是每個使用者端(或者說瀏覽器)與伺服器之間交換資料的間歇性特別大,所以 HTTP 的傳輸是具備突發性與順時性的,大部分通道實際上會很空閒,無端的佔用資源比較浪費。因此呢, HTTP 的設計者有意使用這樣的特點將協定設計為
請求的時候建立連線,請求完就釋放連線。
儘快的將資源釋放出來服務給其他的使用者端,無論怎樣,對於同一個使用者端來說,還是每一次只處理一個請求,所以我們也能看出來 HTTP 協定的另外一個優點,它很專一。(*^▽^*)
- 5、最後一個特點:無狀態; 無狀態的意思就是說
HTTP協定對於事務的處理沒有記憶能力
;缺少狀態就意味著如果後續處理需要前面的資訊,則必須要重傳,這就很可能會導致每次連線傳送的資料量增大。另一方面,在伺服器不需要先前的資訊時它的響應就比較快。PS:所以 HTTP 的這些特性是既有優點也有缺點。
- 優點:優點在於解放伺服器,每一次請求點到為止不會造成不必要的連線佔用。
- 缺點:缺點在於每一次請求都會傳輸大量的重複內容資訊。
- 所以保持 HTTP 連線的兩種技術就應運而生了,那就是
cookie
與session
。
現在我們知道 HTTP協定 是一種請求與響應的模式,那麼就來一起認識一下 HTTP的請求和響應吧,先從 HTTP協定的請求說起。
請求
是傳送給介面的資料物件,包括介面的地址(也就是常說的 URL
)、請求的方法(get、post…)、引數、請求頭(Headers)、Cookies、資料等等… 見下圖:
上圖中的報文內容就是典型的 HTTP協定的 post 與 get 請求報文(忽略get請求報文的請求體,那是我瞎編的
。):
1、第一行就是請求行,包含有請求方法、請求URI、HTTP協定及版本(與第二行的 host屬性 相結合形成了完整的 請求URL )
2、中間的部分就是報文頭,包含有若干個屬性;格式就是圖中的
屬性名:屬性值
這樣的格式。伺服器端根據報文頭來獲取使用者端的資訊。3、最下面的部分就是報文體,報文體與報文頭之間必須有一個空行。在類似圖中這樣一個
post 請求
裡面將頁面表單裡的元件值通過name=admin&passwd=123456
這樣類似的鍵值對的格式編碼形成這樣的格式化串,承載多個請求引數的資料。(不僅僅是報文體可以傳輸資料,請求的 URL 在get 請求方法
的時候也是支援傳遞引數的。)在這裡可以看出主要的資訊是通過請求的方法、url、與報文的主體來進行傳遞的。這也是 HTTP 的特徵之一,簡單快速,同時也會發現報文頭裡也包含有很多種資訊,這些做一個瞭解即可。參考 HTTP協定狀態及報文組成 文末的請求頭報文。
熟悉了 HTTP 的請求,再來看一下響應。見下圖:
可以從響應報文的樣式看出,與請求的報文比較相像,他也分為三個部分:請求行對應響應行、請求頭對應響應頭、請求體對應著響應體。
- 1、響應行分為兩部分:報文協定版本及響應狀態碼。
- 2、響應頭也分為伺服器型別、相應資料型別響應時間等多個引數。
- 3、響應體就是我們真正想要的乾貨,就是請求的最終返回內容。主要針對這個內容進行解析,比如說請求的是一個頁面,這個時候請求的返回就是一個比較大的
HTML
。
更多內容參考 HTTP協定狀態及報文組成 一文的 HTTP請求方法
。
GET方法
用來請求存取已被 URI
識別的資源,指定的資源經伺服器端解析後返回響應內容。(見下圖)
POST方法
與 GET方法
功能類似,一般用來傳輸實體的主體;主要的目的不是為了獲取響應主體的內容,是向 WEB伺服器提供表單資料,尤其是大批次的資料
。
POST方法
其實是克服了 GET方法
的一些缺點,通過 POST
請求,資料就不是作為一個 URL 請求的一部分了,而是作為標準資料的格式來傳遞給 WEB伺服器
這也就克服了 GET方法
中資料無法保密且資料量有限制的缺點。
接下來就是一些不太常用的一些方法的介紹了。
- 從使用者端向伺服器傳送的資料取代指定的檔案的內容。
- PUT方法與POST方法最大的不同的是:PUT是冪等的,而POST是不冪等的。因此,更多的時候我們將
PUT方法用作傳輸資源。
開啟 PUT方法 需要控制許可權,否則會造成一定的安全隱患,比如向伺服器傳輸帶有惡意 payload 的攻擊指令碼。
HEAD方法
幾乎與GET
方法相同,只不過HEAD方法只請求訊息報文頭,返回的響應中沒有具體的內容,用於獲取報頭。
- 請求伺服器刪除指定的資源,也就是刪除檔案。(一般伺服器會控制此方法的許可權,否則會造成重大的安全漏洞。)
- 用來查詢針對請求的 URI 指定的資源支援的方法,就是詢問
請求的URL能夠支援什麼方法
。
該方法在實際工作中使用的是非常少的,在安全領域經常會被攻擊者、滲透測試工程師用於資訊收集。
- 用於回顯伺服器收到的請求,主要用於測試或診斷。(不常用)
- 在安全領域經常被用於跨站攻擊。
- 開啟與使用者端所請求的資源之間的雙向溝通的通道,所以更多的時候是用它來建立隧道。(使用代理的時候就是使用的這個方法)
在我們使用瀏覽覽器向WEB網頁所在伺服器發出請求時,當伺服器接收我們的請求並響應的情況下。瀏覽器會接收並顯示網頁,此網頁所在的伺服器會返回一個包含HTTP狀態碼的資訊頭(server header)用以響應我們在瀏覽器中的請求。
HTTP狀態碼的英文為HTTP Status Code。
下面是常見的HTTP狀態碼
分類 | 描述 |
---|---|
1** | 資訊,伺服器收到請求,需要請求者繼續執行操作 |
2** | 成功,操作被成功接收並處理 |
3** | 重定向,需要進一步的操作以完成請求 |
4** | 使用者端錯誤,請求包含語法錯誤或無法完成請求 |
5** | 伺服器錯誤,伺服器在處理請求的過程中發生了錯誤 |
狀態碼 | 英文名稱 | 中文描述 |
---|---|---|
100 | Continue | 繼續。使用者端應繼續其請求 |
101 | Switching Protocols | 切換協定。伺服器根據使用者端的請求切換協定。 只能切換到更高階的協定,例如,切換到HTTP的新版本協定 |
200 | OK | 請求成功。一般用於GET與POST請求 |
201 | Created | 已建立。成功請求並建立了新的資源 |
202 | Accepted | 已接受。已經接受請求,但未處理完成 |
203 | Non-Authoritative Information | 非授權資訊。請求成功。但返回的meta資訊不在原始的伺服器,而是一個副本 |
204 | No Content | 無內容。伺服器成功處理,但未返回內容。在未更新網頁的情況下,可確保瀏覽器繼續顯示當前檔案 |
205 | Reset Content | 重置內容。伺服器處理成功,使用者終端(例如:瀏覽器)應重置檔案檢視。 可通過此返回碼清除瀏覽器的表單域 |
206 | Partial Content | 部分內容。伺服器成功處理了部分GET請求 |
300 | Multiple Choices | 多種選擇。請求的資源可包括多個位置,相應可返回一個資源特徵與地址的列表 用於使用者終端(例如:瀏覽器)選擇 |
301 | Moved Permanently | 永久移動。請求的資源已被永久的移動到新URI,返回資訊會包括新的URI, 瀏覽器會自動定向到新URI。今後任何新的請求都應使用新的URI代替 |
302 | Found | 臨時移動。與301類似。但資源只是臨時被移動。使用者端應繼續使用原有URI |
303 | See Other | 檢視其它地址。與301類似。使用GET和POST請求檢視 |
304 | Not Modified | 未修改。所請求的資源未修改,伺服器返回此狀態碼時,不會返回任何資源。使用者端通常 會快取存取過的資源,通過提供一個頭資訊指出使用者端希望只返回在指定日期之後修改的資源 |
305 | Use Proxy | 使用代理。所請求的資源必須通過代理存取 |
306 | Unused | 已經被廢棄的HTTP狀態碼 |
307 | Temporary Redirect | 臨時重定向。與302類似。使用GET請求重定向 |
401 | Unauthorized | 請求要求使用者的身份認證 |
402 | Payment Required | 保留,將來使用 |
403 | Forbidden | 伺服器理解請求使用者端的請求,但是拒絕執行此請求 |
404 | Not Found | 伺服器無法根據使用者端的請求找到資源(網頁)。通過此程式碼,網站設計人員可 設定"您所請求的資源無法找到"的個性頁面 |
405 | Method Not Allowed | 使用者端請求中的方法被禁止 |
406 | Not Acceptable | 伺服器無法根據使用者端請求的內容特性完成請求 |
407 | Proxy Authentication Required | 請求要求代理的身份認證,與401類似,但請求者應當使用代理進行授權 |
408 | Request Time-out | 伺服器等待使用者端傳送的請求時間過長,超時 |
409 | Conflict | 伺服器完成使用者端的PUT請求是可能返回此程式碼,伺服器處理請求時發生了衝突 |
410 | Gone | 使用者端請求的資源已經不存在。410不同於404,如果資源以前有現在被永久刪除了可使用410程式碼, 網站設計人員可通過301程式碼指定資源的新位置 |
411 | Length Required | 伺服器無法處理使用者端傳送的不帶Content-Length的請求資訊 |
412 | Precondition Failed | 使用者端請求資訊的先決條件錯誤 |
413 | Request Entity Too Large | 由於請求的實體過大,伺服器無法處理,因此拒絕請求。為防止使用者端的連續請求,伺服器可能會 關閉連線。如果只是伺服器暫時無法處理,則會包含一個Retry-After的響應資訊 |
414 | Request-URI Too Large | 請求的URI過長(URI通常為網址),伺服器無法處理 |
415 | Unsupported Media Typ | 伺服器無法處理請求附帶的媒體格式 |
416 | Requested range not satisfiabl | 使用者端請求的範圍無效 |
417 | Expectation Failed | 伺服器無法滿足Expect的請求頭資訊 |
500 | Internal Server Erro | 伺服器內部錯誤,無法完成請求 |
501 | Not Implemented | 伺服器不支援請求的功能,無法完成請求 |
502 | Bad Gateway | 充當閘道器或代理的伺服器,從遠端伺服器接收到了一個無效的請求 |
503 | Service Unavailable | 由於超載或系統維護,伺服器暫時的無法處理使用者端的請求。延時的長度可包含在伺服器 的Retry-After頭資訊中 |
504 | Gateway Time-out | 充當閘道器或代理的伺服器,未及時從遠端伺服器獲取請求 |
505 | HTTP Version not supported | 伺服器不支援請求的HTTP協定的版本,無法完成處理 |
推薦學習:
以上就是Python介面自動化測試必備基礎之http協定詳解的詳細內容,更多請關注TW511.COM其它相關文章!