GET和POST是網絡編程中,用的最多的請求方式了,但是這兩種方式有什么區別,有不少人都不一定能答的上來??戳讼旅孢@張圖就很明白了。
Paste_Image.png
由于簡書的文章寬度限制,折騰了半天,也沒法讓用markdown寫的表格完美顯示,只好用了圖片.....
其實GET和POST在本質上肯定是沒太大區別。通常看到的,POST攜帶body而GET沒有body,并不是他們的區別。因為GET請求也可以攜帶body,只是看服務器是否處理了。
上面的表格中,到最后還沒有結束。因為它們還有另外一個區別:
在瀏覽器中,GET請求產生一個TCP數據包;POST請求產生兩個TCP數據包。
對于GET方式的請求,瀏覽器會把header和data一并發送出去,服務器響應200(返回數據);
而對于POST,瀏覽器先發送header,服務器響應100后,continue,瀏覽器再發送data給服
務器,這樣就會發送2次包。所以,POST會相對慢一些,不過POST利用了TCP的傳輸校驗,使得
POST請求更`安全`一些。
不過因為不同的瀏覽器的處理方式不同,POST并不一定都會發送2次包。比如說Firefox在做POST
請求的時候,就只會發送一次包.
2次 != 2個
不過也不存在POST就一定比GET安全的說法,對于移動端應用來說,POST和GET的區別可以說微乎其微。想要絕對的安全也是不可能的,連HTTPS都不能防止中間人攻擊的。
如果用抓包工具,比如charles、wireshark等截獲網絡請求,所有的請求信息就都暴露了。也許你會發現HTTPS的內容都是亂碼,但是這并不是說明HTTPS就一定安全。如果你在你手機上安裝一個charles的SSL證書,然后再用charles去抓包,會發現HTTPS的請求也變成明文了。
但是HTTPS還是能防止中間人攻擊的,如果你購買了CA機構的證書放到server端,然后在client端對證書進行校驗,這樣charles等中間人就無法用自己的證書進行加解密,也就無法對你的請求進行修改來偽裝成正常的client。
曾經聽到有人說socket沒辦法攔截,這是因為你用的工具(比如說charles)沒有這樣的功能。如果你用wireshark這樣功能強大的工具,會發現所有的請求信息在你的眼前都暴露無遺。
所以說只要是通過網絡傳輸的信息就沒有絕對的安全。
其他 HTTP 請求方法
方法 | 描述 |
---|---|
HEAD | 與GET方法一樣,都是向服務器發出指定資源的請求。但是,服務器在響應HEAD請求時只回傳資源的摘要信息。 |
PUT | 向指定資源位置上傳其最新內容,PUT方法是冪等的方法。通過該方法客戶端可以將指定資源的最新數據傳送給服務器取代指定的資源的內容。 |
DELETE | 請求用于請求服務器刪除所請求URI(統一資源標識符,Uniform Resource Identifier)所標識的資源。DELETE請求后指定資源會被刪除,DELETE方法也是冪等的。 |
OPTIONS | 與HEAD類似,一般也是用于客戶端查看服務器的性能。 這個方法會請求服務器返回該資源所支持的所有HTTP請求方法,該方法會用'*'來代替資源名稱,向服務器發送OPTIONS請求,可以測試服務器功能是否正常。 |
CONNECT | HTTP/1.1協議預留的,能夠將連接改為管道方式的代理服務器。通常用于SSL加密服務器的鏈接與非加密的HTTP代理服務器的通信。 |
PATCH | 與PUT請求類似,同樣用于資源的更新。但PATCH一般用于資源的部分更新,而PUT一般用于資源的整體更新。當資源不存在時,PATCH會創建一個新的資源,而PUT只會對已在資源進行更新。 |
TRACE | 請求服務器回顯其收到的請求信息,主要用于測試或診斷。 |