get與post請求簡單理解

2022-04-17 15:59:09 字數 4238 閱讀 6083

一般在瀏覽器中輸入**訪問資源都是通過get方式;在form提交中,可以通過method指定提交方式為get或者post,預設為get提交

http定義了與伺服器互動的不同方法,最基本的方法有4種,分別是get,post,put,delete

url全稱是資源描述符,我們可以這樣認為:乙個url位址,它用於描述乙個網路上的資源,而http中的get,post,put,delete就對應著對這個資源的查 ,改 ,增 ,刪 4個操作。到這裡,大家應該有個大概的了解了,get一般用於獲取/查詢 資源資訊,而post一般用於更新 資源資訊(比如提交表單的內容)(個人認為這是get和post的本質區別,也是協議設計者的本意,其它區別都是具體表現形式的差異)。

根據http規範,get用於資訊獲取,而且應該是安全的和冪等的 。

1.所謂安全的意味著該操作用於獲取資訊而非修改資訊。換句話說,get請求一般不應產生***。就是說,它僅僅是獲取資源資訊,就像資料庫查詢一樣,不會修改,增加資料,不會影響資源的狀態。

* 注意:這裡安全的含義僅僅是指是非修改資訊。

2.冪等的意味著對同一url的多個請求應該返回同樣的結果。這裡我再解釋一下冪等這個概念:

冪等(idempotent、idempotence)是乙個數學或計算機學概念,常見於抽象代數中。

冪等有以下幾種定義:

對於單目運算,如果乙個運算對於在範圍內的所有的乙個數多次進行該運算所得的結果和進行一次該運算所得的結果是一樣的,那麼我們就稱該運算是冪等的。 比如絕對值運算就是乙個例子,在實數集中,有abs(a) = abs(abs(a)) 。

對於雙目運算,則要求當參與運算的兩個值是等值的情況下,如果滿足運算結果與參與運算的兩個值相等,則稱該運算冪等,如求兩個數的最大值的函式,有在實數集中冪等,即max(x,x) = x 。

看完上述解釋後,應該可以理解get冪等的含義了。

但在實際應用中,以上2條規定並沒有這麼嚴格。引用別人文章的例子:比如,新聞站點的頭版不斷更新。雖然第二次請求會返回不同的一批新聞,該操作仍然被認為是安全的和冪等的,因為它總是返回當前的新聞。從根本上說,如果目標是當使用者開啟乙個鏈結時,他可以確信從自身的角度來看沒有改變資源即可。

上面大概說了一下http規範中,get和post的一些原理性的問題。但在實際的做的時候,很多人卻沒有按照http規範去做,導致這個問題的原因有很多,比如說:

1.很多人貪方便,更新資源時用了get,因為用post必須要到form(表單),這樣會麻煩一點。

2.對資源的增,刪,改,查操作,其實都可以通過get/post完成,不需要用到put和delete。

3.另外乙個是,早期的但是web mvc框架設計者們並沒有有意識地將url當作抽象的資源來看待和設計 。還有乙個較為嚴重的問題是傳統的web mvc框架基本上都只支援get和post兩種http方法,而不支援put和delete方法。

* 簡單解釋一下mvc:mvc本來是存在於desktop程式中的,m是指資料模型,v是指使用者介面,c則是控制器。使用mvc的目的是將m和v的實現**分離,從而使同乙個程式可以使用不同的表現形式。

以上3點典型地描述了老一套的風格(沒有嚴格遵守http規範),隨著架構的發展,現在出現rest(representational state transfer),一套支援http規範的新風格,這裡不多說了,可以參考《restful web services》。

二 表現形式區別

搞清了兩者的原理區別,我們再來看一下他們實際應用中的區別:

為了理解兩者在傳輸過程中的不同,我們先看一下http協議的格式:

http請求:

//http請求行

//http請求訊息報頭

// 回 車 換行

//http請求正文

在http請求中,第一行必須是乙個請求行(request line),用來說明請求型別、要訪問的資源以及使用的http版本。緊接著是乙個首部(header)小節,用來說明伺服器要使用的附加資訊。在首部之後是乙個空行,再此之後可以新增任意的其他資料[稱之為主體(body)]。

有了以上對http請求的了解和示例,我們再來看兩種提交方式的區別:

(1)get提交,請求的資料會附在url之後(就是把資料放置在http協議頭中),以?分割url和傳輸資料,多個引數用&連線;例 如:login.action?name=hyddd&password=idontknow&verify=%e4%bd%a0 %e5%a5%bd。如果資料是英文本母/數字,原樣傳送,如果是空格,轉換為+,如果是中文/其他字元,則直接把字串用base64加密,得出如: %e4%bd%a0%e5%a5%bd,其中%xx中的xx為該符號以16進製表示的ascii。

post提交:把提交的資料放置在是http包的包體中。上文示例中紅色字型標明的就是實際的傳輸資料

因此,get提交的資料會在位址列中顯示出來,而post提交,位址列不會改變

(2)傳輸資料的大小:首先宣告:http協議沒有對傳輸的資料大小進行限制,http協議規範也沒有對url長度進行限制。

而在實際開發中存在的限制主要有:

get:特定瀏覽器和伺服器對url長度有限制,例如 ie對url長度的限制是2083位元組(2k+35)。對於其他瀏覽器,如netscape、firefox等,理論上沒有長度限制,其限制取決於操作系 統的支援。

因此對於get提交時,傳輸資料就會受到url長度的 限制。

post:由於不是通過url傳值,理論上資料不受 限。但實際各個web伺服器會規定對post提交資料大小進行限制,apache、iis6都有各自的配置。

(3)安全性:

post的安全性要比get的安全性高。注意:這裡所說的安全性和上面get提到的「安全」不是同個概念。上面 「安全」的含義僅僅是不作資料修 改,而這 裡安全的含義是真正的security的含義,比如:通過get提交資料,使用者名稱和密碼將明文出現在url上,因為(1)登入頁面有可能被瀏覽器快取, (2)其他人檢視瀏覽器的歷史紀錄,那麼別人就可以拿到你的賬號和密碼了,除此之外,使用get提交資料還可能會造成cross-site request forgery攻擊

三 http響應

1.http響應格式:

//http響應狀態行

//http響應訊息報頭

//回車換行

//http響應正文

在響應中唯一真正的區別在於第一行中用狀態資訊代替了請求資訊。狀態行(status line)通過提供乙個狀態碼來說明所請求的資源情況。 

http響應例項:

2.最常用的狀態碼有:

◆200 (ok): 找到了該資源,並且一切正常。

◆304 (not modified): 該資源在上次請求之後沒有任何修改。這通常用於瀏覽器的快取機制。

◆401 (unauthorized): 客戶端無權訪問該資源。這通常會使得瀏覽器要求使用者輸入使用者名稱和密碼,以登入到伺服器。

◆403 (forbidden): 客戶端未能獲得授權。這通常是在401之後輸入了不正確的使用者名稱或密碼。

◆404 (not found): 在指定的位置不存在所申請的資源。

get和post是http的兩種提交請求的方式

get - 從指定的伺服器中獲取資料

post - 提交資料給指定的伺服器處理

什麼是http?

超文字傳輸協議(hypertext transfer protocol -- http)是乙個設計來使客戶端和伺服器順利進行通訊的協議。

http在客戶端和伺服器之間以request-response protocol(請求-回覆協議)工作。

由於web伺服器不儲存傳送請求的web瀏覽器程序的任何資訊,所以http是無狀態的。

get方法:

/test/demo_form.jsp?name1=value1&name2=value2

特點:post方法:

使用post方法時,查詢字串在post資訊中單獨存在,和http請求一起傳送到伺服器:

特點:

GET請求與POST請求 本質

get和post是http請求的兩種基本方法,要說它們的區別,接觸過web開發的人都能說出一二。最直觀的區別就是get把引數包含在url中,post通過request body傳遞引數。你可能自己寫過無數個get和post請求,或者已經看過很多權威 總結出的他們的區別,你非常清楚知道什麼時候該用什麼...

三 Get請求與Post請求

public static string sendget string url,string param 定義bufferedreader輸入流來讀取url的響應 in new bufferedreader new inputstreamreader connection.getinputstrea...

get與post請求區別

一 語義區別 http請求中get的語義是請求獲取資源,是安全 冪等 可快取的,報文主體沒有任何語義。post的語義處理資源是根據請求報文主體,對指定資源做處理,是不安全 不冪等 不可快取的 大部分 二 表現形式區別 1 get中請求引數是附在url裡,以?分割url和傳輸資料,引數之間以 相連。如...