今天要探討的是網頁中GET和POST的差異。這類文章在網路上已有很多,但為了加深自己的理解並記錄學習過程,我決定寫下這篇文章。

對於網頁設計者來說,無論是前端或後端開發者,都會接觸到GET和POST。後端開發者尤其需要深入了解它們的差異及應用場景。我最初接觸這個問題是在撰寫網路爬蟲時,程式碼中需要選擇使用GET或POST。當時我只知道透過瀏覽器的開發者工具查看網頁元素,就能知道該網頁使用哪種方法,但並不清楚背後的原因。直到開始實際開發網頁後,才對這個問題產生興趣。

HTTP協定的基礎

早期撰寫網頁時,常見的寫法如下:

+form action="xxx.php" method="GET"+
    +input type="text" name="id"+
    +input type="submit" value="Submit"+
+/form+

後端獲取表單內容時,只需呼叫系統封裝好的方法,例如PHP的$_REQUEST或JAVA的getParameter()

然而,大多數網頁設計者似乎更傾向使用POST方法,認為POST較安全且能傳送更多資料。但POST是否真的比GET更好?讓我們繼續分析。

HTTP方法簡介

HTTP 1.1定義了八種方法:

  1. GET
  2. HEAD
  3. PUT
  4. OPTIONS
  5. POST
  6. TRACE
  7. DELETE
  8. CONNECT

本文主要探討GET和POST,其他方法在RESTful架構中可能會用到,有興趣的讀者可以自行研究。

GET與POST的差異

用現實生活中的寄信機制來比喻:

  • GET:像明信片,所有資訊都寫在信封(head)上,信封內不能裝信件(body)。價格較便宜,但資訊暴露在外。
  • POST:像傳統信件,信封(head)上寫基本資訊,信封內(body)可裝入更多資料或檔案。價格較貴,但資訊較隱密。

GET的運作方式

使用GET時,資料會以Query String(Key/Value編碼)附加在URL後面。例如:

http://xxx.toright.com/?id=010101

瀏覽器會將表單內容轉為Query String並加在URL中傳送。

POST的運作方式

使用POST時,網址列不會變化,表單內容會放在HTTP封包的body中傳送。這種方式在傳送檔案時會使用multi-part編碼,將檔案與其他表單資料一併放入body中。

安全性比較

  • GET:資料暴露在URL中,不適合傳送敏感資訊(如密碼)。
  • POST:資料藏在封包body中,相對安全,且能傳送更多內容。

總結

GET適合用於簡單的資料取得,而POST適合傳送敏感或大量資料。選擇哪種方法取決於具體需求,而非單純認為POST一定比GET好。


參考資料:
淺談HTTP Method:表單中的GET與POST有什麼差別?