Http請求方法之Get、Post原理


什么是HTTP?

  HTTP,即超文本傳輸協議,是一種實現客戶端和服務器之間通信的響應協議,它是用作客戶端和服務器之間的請求。

  客戶端(瀏覽器)會向服務器提交HTTP請求;然后服務器向客戶端返回響應;其中響應包含有關請求的狀態信息,還可能包含請求的內容。

HTTP的常用方法

  1、GET方法

  GET方法用於使用給定的URI從給定服務器中檢索信息,即從指定資源中請求數據。使用GET方法的請求應該只是檢索數據,並且不應對數據產生其他影響。

  在GET請求的URL中發送查詢字符串(名稱/值對),需要這樣寫:/test/demo_form.php?name1=value1&name2=value2

  說明:GET請求是可以緩存的,我們可以從瀏覽器歷史記錄中查找到GET請求,還可以把它收藏到書簽中;且GET請求有長度限制,僅用於請求數據(不修改)。

  注:因GET請求的不安全性,在處理敏感數據時,絕不可以使用GET請求。

  2、POST方法

  POST方法用於將數據發送到服務器以創建或更新資源,它要求服務器確認請求中包含的內容作為由URI區分的Web資源的另一個下屬。

  POST請求永遠不會被緩存,且對數據長度沒有限制;我們無法從瀏覽器歷史記錄中查找到POST請求。

  3、HEAD方法

  HEAD方法與GET方法相同,但沒有響應體,僅傳輸狀態行和標題部分。這對於恢復相應頭部編寫的元數據非常有用,而無需傳輸整個內容。

  4、PUT方法

  PUT方法用於將數據發送到服務器以創建或更新資源,它可以用上傳的內容替換目標資源中的所有當前內容。

  它會將包含的元素放在所提供的URI下,如果URI指示的是當前資源,則會被改變。如果URI未指示當前資源,則服務器可以使用該URI創建資源。

  5、DELETE方法

  DELETE方法用來刪除指定的資源,它會刪除URI給出的目標資源的所有當前內容。

  6、CONNECT方法

  CONNECT方法用來建立到給定URI標識的服務器的隧道;它通過簡單的TCP / IP隧道更改請求連接,通常實使用解碼的HTTP代理來進行SSL編碼的通信(HTTPS)。

  7、OPTIONS方法

  OPTIONS方法用來描述了目標資源的通信選項,會返回服務器支持預定義URL的HTTP策略。

  8、TRACE方法

  TRACE方法用於沿着目標資源的路徑執行消息環回測試;它回應收到的請求,以便客戶可以看到中間服務器進行了哪些(假設任何)進度或增量。

 

GET和POST請求都有哪些區別:

  • GET請求在URL中傳送的參數是有長度限制的,而POST沒有。
  • GET比POST更不安全,因為參數直接暴露在URL上,所以不能用來傳遞敏感信息。而POST數據不會顯示在URL中。是放在Request body中。
  • 對參數的數據類型,GET只接受ASCII字符,而POST沒有限制。
  • GET請求參數會被完整保留在瀏覽器歷史記錄里;相反,POST請求參數也不會被瀏覽器保留。
  • GET請求只能進行url編碼(application/x-www-form-urlencoded),而POST支持多種編碼方式。
  • GET請求會被瀏覽器主動緩存,而POST不會,除非手動設置。
  • GET在瀏覽器回退時是無害的,而POST會再次提交請求。

Get請求有Request body么?如果有的話參數可以像Post請求一樣放在里面么?

  HTTP只是個行為准則,而GET和POST本質上就是TCP鏈接,並無差別。但是由於HTTP的規定和瀏覽器/服務器的限制,導致他們在應用過程中體現出一些不同。

  如果給GET加上request body,給POST帶上url參數,技術上是完全行的通的。

  如果你用GET服務,在request body偷偷藏了數據,不同服務器的處理方式也是不同的,有些服務器會幫你讀出數據,有些服務器直接忽略。所以,雖然GET可以帶request body,卻不能保證一定能被接收到。

URL中傳送參數的長度限制在Get和Post中都是怎么樣的呢?

  業界不成文的規定是,(大多數)瀏覽器通常都會限制url長度在2K個字節,而(大多數)服務器最多處理64K大小的url,超過的部分,恕不處理。如果你用GET服務,在request body偷偷藏了數據,不同服務器的處理方式也是不同的,有些服務器會幫你卸貨,讀出數據,有些服務器直接忽略。

  所以,雖然GET可以帶request body,卻不能保證一定能被接收到

那GET 方法參數寫法是固定的嗎?

  在約定中,我們的參數是寫在 ? 后面,用 & 分割。如下:http://ip:port/project/getUserInfo?username=chenhhaha&age=26&sex=2

  我們知道,解析報文的過程是通過獲取 TCP 數據,用正則等工具從數據中獲取 Header 和 Body,從而提取參數。

  比如header請求頭中添加token,來驗證用戶是否登錄等權限問題。

  也就是說,我們可以自己約定參數的寫法,只要服務端能夠解釋出來就行,萬變不離其宗。

有人說POST 比 GET 安全,因為數據在地址欄上不可見

  從傳輸的角度來說,他們都是不安全的,因為 HTTP 在網絡上是明文傳輸的,只要在網絡節點上捉包,就能完整地獲取數據報文。

  其實,要想安全傳輸,就只有加密,也就是 HTTPS。

Get、Post請求發送的數據包有什么不同嗎?

  GET請求時產生一個TCP數據包;POST請求時產生兩個TCP數據包。

  • GET:瀏覽器會把http header和data一並發送出去,服務器響應200(返回數據)
  • POST:瀏覽器先發送header,服務器響應100 continue,瀏覽器再發送data,服務器響應200 OK(返回數據)

  因為POST需要兩步,理論上時間上消耗的要多一點,看起來GET比POST更有效,但並不是。

  1. GET與POST都有自己的語義,不能隨便混用。
  2. 據研究,在網絡環境好的情況下,發一次包的時間和發兩次包的時間差別基本可以無視。而在網絡環境差的情況下,兩次包的TCP在驗證數據包完整性上,有非常大的優點。
  3. 並不是所有瀏覽器都會在POST中發送兩次包,Firefox就只發送一次。我去年用Chrome瀏覽器測試發現也是只發送一次,所以我認為Get、POST性能差可以人為忽略。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM