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