Http:Get、Post、Put、Delete、Head、Options详解
2019獨角獸企業重金招聘Python工程師標準>>>
一、概述
????Http定義了與服務器交互的不同方法,最基本的方法有4種,分別是GET,POST,PUT,DELETE。URL全稱是資源描述符,我們可以這樣認為:一個URL地址,它用于描述一個網絡上的資源,而HTTP中的GET,POST,PUT,DELETE就對應著對這個資源的查,改,增,刪4個操作。還有兩個則為擴展型協議請求方法Head、Options。
二、請求方法含義
- Get:GET可以說是最常見的了,它本質就是發送一個請求來取得服務器上的某一資源。資源通過一組HTTP頭和呈現據(如HTML文本,或者圖片或者視頻等)返回給客戶端。GET請求中,永遠不會包含呈現數據。
- Head:HEAD和GET本質是一樣的,區別在于HEAD不含有呈現數據,而僅僅是HTTP頭信息。有的人可能覺得這個方法沒什么用,其實不是這樣的。想象一個業務情景:欲判斷某個資源是否存在,我們通常使用GET,但這里用HEAD則意義更加明確。
- Post:向服務器提交數據。這個方法用途廣泛,幾乎目前所有的提交操作都是靠這個完成。
- Put:這個方法比較少見。HTML表單也不支持這個。本質上來講, PUT和POST極為相似,都是向服務器發送數據,但它們之間有一個重要區別,PUT通常指定了資源的存放位置,而POST則沒有,POST的數據存放位置由服務器自己決定。
- Delete:刪除某一個資源。基本上這個也很少見,不過還是有一些地方比如amazon的S3云服務里面就用的這個方法來刪除資源。
- Options:這個方法很有趣,但極少使用。它用于獲取當前URL所支持的方法。若請求成功,則它會在HTTP頭中包含一個名為“Allow”的頭,值是所支持的方法,如“GET, POST”。
三、請求方法詳解
? ? 1.Get描述
????????根據HTTP規范,GET用于信息獲取,而且應該是安全的和冪等的,提交的數據最多只能是1024字節。
- 所謂安全的意味著該操作用于獲取信息而非修改信息。換句話說,GET請求一般不應產生副作用。就是說,它僅僅是獲取資源信息,就像數據庫查詢一樣,不會修改,增加數據,不會影響資源的狀態。這里安全的含義僅僅是指是非修改信息。
- 冪等的意味著對同一URL的多個請求應該返回同樣的結果。這里我再解釋一下冪等 這個概念
冪等(idempotent、idempotence)是一個數學或計算機學概念,常見于抽象代數中。
冪等有一下幾種定義:
- 單目運算:如果一個運算對于在范圍內的所有的一個數多次進行該運算所得的結果和進行一次該運算所得的結果是一樣的,那么我們就稱該運算是冪等的。比如絕對值運算就是一個例子,在實數集中,有abs(a)=abs(abs(a))。
- 雙目運算:則要求當參與運算的兩個值是等值的情況下,如果滿足運算結果與參與運算的兩個值相等,則稱該運算冪等,如求兩個數的最大值的函數,有在在實數集中冪等,即max(x,x)?=?x。
????但在實際應用中以上2條規定并沒有這么嚴格。?
????2.Post描述
????根據HTTP規范,POST表示可能修改變服務器上的資源的請求,理論上POST沒有限制,可傳較大量的數據,IIS4中最大為80KB,IIS5中為100KB。GET和POST的一些原理性的問題。但在實際的做的時候,很多人卻沒有按照HTTP規范去做,導致這個問題的原因有很多,比如說:??
- 很多人貪方便,更新資源時用了GET,因為用POST必須要到FORM(表單),這樣會麻煩一點。??
- 對資源的增,刪,改,查操作,其實都可以通過GET/POST完成,不需要用到PUT和DELETE。??
- 另外一個是,早期的但是Web MVC框架設計者們并沒有有意識地將URL當作抽象的資源來看待和設計 。還有一個較為嚴重的問題是傳統的Web MVC框架基本上都只支持GET和POST兩種HTTP方法,而不支持PUT和DELETE方法。??
????以上3點典型地描述了老一套的風格(沒有嚴格遵守HTTP規范),隨著架構的發展,現在出現REST,它出來一套支持HTTP規范的新風格,可以參考《RESTful Web Services》。?
四、表現形式
? ? 1.Get
- Get請求
- Get響應
? ? 2.Post
- Post請求
- Post響應
五、常見狀態碼
- 100?Continue:初始的請求已經接受,客戶應當繼續發送請求的其余部分
- 101?Switching?Protocols:服務器將遵從客戶的請求轉換到另外一種協議
- 200 OK:一切正常,對GET和POST請求的應答文檔跟在后面
- 201?Created:服務器已經創建了文檔,Location頭給出了它的URL。
- 202?Accepted:已經接受請求,但處理尚未完成。
- 203?Non-Authoritative?Information:文檔已經正常地返回,但一些應答頭可能不正確,因為使用的是文檔的拷貝
- 204?No?Content:沒有新文檔,瀏覽器應該繼續顯示原來的文檔。如果用戶定期地刷新頁面,而Servlet可以確定用戶文檔足夠新,這個狀態代碼是很有用的
- 205?Reset?Content:沒有新的內容,但瀏覽器應該重置它所顯示的內容。用來強制瀏覽器清除表單輸入內容
- 206?Partial?Content:客戶發送了一個帶有Range頭的GET請求,服務器完成了它
- 300?Multiple?Choices:客戶請求的文檔可以在多個位置找到,這些位置已經在返回的文檔內列出。如果服務器要提出優先選擇,則應該在Location應答頭指明。
- 301 ?Moved Permanently:客戶請求的文檔在其他地方,新的URL在Location頭中給出,瀏覽器應該自動地訪問新的URL。
- 302 Found:類似于301,但新的URL應該被視為臨時性的替代,而不是永久性的。
- 303 See?Other:類似于301/302,不同之處在于,如果原來的請求是POST,Location頭指定的重定向目標文檔應該通過GET提取
- 304?Not Modified:客戶端有緩沖的文檔并發出了一個條件性的請求(一般是提供If-Modified-Since頭表示客戶只想比指定日期更新的文檔)。服務器告訴客戶,原來緩沖的文檔還可以繼續使用。
- 305?Use?Proxy:客戶請求的文檔應該通過Location頭所指明的代理服務器提取
- 307?Temporary Redirect:和302(Found)相同。許多瀏覽器會錯誤地響應302應答進行重定向,即使原來的請求是 POST,即使它實際上只能在POST請求的應答是303時才能重定向。由于這個原因,HTTP?1.1新增了307,以便更加清除地區分幾個狀態代碼: 當出現303應答時,瀏覽器可以跟隨重定向的GET和POST請求;如果是307應答,則瀏覽器只能跟隨對GET請求的重定向。
- 400 Bad Request:請求出現語法錯誤。
- 401?Unauthorized:客戶試圖未經授權訪問受密碼保護的頁面。應答中會包含一個WWW-Authenticate頭,瀏覽器據此顯示用戶名字/密碼對話框,然后在填寫合適的Authorization頭后再次發出請求。
- 403?Forbidden:資源不可用。
- 404?Not Found:無法找到指定位置的資源
- 405?Method?Not?Allowed:請求方法(GET、POST、HEAD、Delete、PUT、TRACE等)對指定的資源不適用。
- 406?Not?Acceptable:指定的資源已經找到,但它的MIME類型和客戶在Accpet頭中所指定的不兼容。
- 407?Proxy?Authentication?Required:類似于401,表示客戶必須先經過代理服務器的授權。
- 408?Request?Timeout:在服務器許可的等待時間內,客戶一直沒有發出任何請求。客戶可以在以后重復同一請求。
- 409?Conflict:通常和PUT請求有關。由于請求和資源的當前狀態相沖突,因此請求不能成功。
- 410 Gone:所請求的文檔已經不再可用,而且服務器不知道應該重定向到哪一個地址。它和404的不同在于,返回407表示文檔永久地離開了指定的位置,而404表示由于未知的原因文檔不可用。
- 411 Length?Required:服務器不能處理請求,除非客戶發送一個Content-Length頭。
- 412 Precondition?Failed:請求頭中指定的一些前提條件失敗。
- 413 Request?Entity?Too?Large:目標文檔的大小超過服務器當前愿意處理的大小。如果服務器認為自己能夠稍后再處理該請求,則應該提供一個Retry-After頭。
- 414 Request?URI?Too?Long:URI太長
- 416?Requested?Range?Not?Satisfiable:服務器不能滿足客戶在請求中指定的Range頭
- 500?Internal Server Error:服務器遇到了意料不到的情況,不能完成客戶的請求
- 501?Not Implemented:服務器不支持實現請求所需要的功能。例如,客戶發出了一個服務器不支持的PUT請求
- 502?Bad?Gateway:服務器作為網關或者代理時,為了完成請求訪問下一個服務器,但該服務器返回了非法的應答
- 503?Service?Unavailable:服務器由于維護或者負載過重未能應答。例如,Servlet可能在數據庫連接池已滿的情況下返回503,服務器返回503時可以提供一個Retry-After頭
- 504?Gateway?Timeout:由作為代理或網關的服務器使用,表示不能及時地從遠程服務器獲得應答
- 505?HTTP?Version?Not?Supported:服務器不支持請求中所指明的HTTP版本。
轉載于:https://my.oschina.net/Clarences/blog/1529241
總結
以上是生活随笔為你收集整理的Http:Get、Post、Put、Delete、Head、Options详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《OpenGL编程指南(原书第9版)》—
- 下一篇: 结构体成员管理AVClass AVOpt