易混淆對照

GET 請求跟 POST 請求差在哪?一個是借書一個是寄包裹

GET 是向伺服器索取資料,不改變伺服器上的任何東西,參數放在網址後面;POST 是把資料打包送過去,會讓伺服器新增或改變內容,參數放在請求主體裡。判斷方式只有一句:這個請求會不會改變伺服器的狀態。
GET 請求跟 POST 請求差在哪?一個是借書一個是寄包裹:文章重點卡

GET 請求跟 POST 請求差在哪?一個是借書一個是寄包裹

串接 API 的時候,文件上寫的第一個字通常就是 GET 或 POST。選錯不只是不專業,還可能把帳號密碼直接暴露在網址列上。

這兩個詞用一個比喻就分得清:GET 是去圖書館借書,POST 是去郵局寄包裹。

你將學到什麼

GET 索取資料

純讀取,不改變伺服器狀態,參數放在網址後面。

POST 送出資料

會寫入或改變狀態,參數放在請求主體裡。

判斷方式

問一句:這個請求會不會改變伺服器上的東西。

定義

GET 請求是向伺服器要資料,但不改變伺服器裡的任何東西。查天氣、讀股價、取得用戶資料、抓公開網頁內容,都屬於這一類。

POST 請求是把資料打包送過去,讓伺服器產生變動或新增內容。新增訂單、上傳檔案、發送訊息、儲存用戶資料,都屬於這一類。

白話比喻

GET 像去圖書館借書。你跟櫃檯說想借這本,對方把書給你,圖書館的藏書內容並沒有因此改變。

POST 像去郵局寄包裹。你把東西交出去,郵局收下並產生一筆新的處理紀錄。兩件事的性質完全不同。

GET 跟 POST 差在哪?

比較項目GET 索取資料POST 送出資料
目的讀取資料寫入、修改、送出資料
資料位置網址的查詢字串請求主體 Request Body
可見性可見,會出現在網址列不可見,隱藏在主體裡
長度限制有,受網址長度限制無明確上限,可傳大量資料
快取可被快取、書籤與分享不會被快取
安全性較低,容易被記錄或看到較高,適合傳送敏感資料
可重複性安全,重複執行結果相同可能造成重複寫入

對應到 增刪查改 的話,查詢與取得走 GET,新增、更新、刪除、送出走 POST 或其他寫入類的方法。

請求長什麼樣子

GET 的參數直接掛在網址後面,問號之後就是查詢字串。

GET https://api.example.com/search?keyword=AI&page=1&limit=10

POST 的網址很乾淨,資料放在主體裡,不會出現在網址上。

POST https://api.example.com/orders

{
  "email": "hello@example.com",
  "product": "AI Starter Course",
  "amount": 1990
}

這也是為什麼把帳號密碼放在網址參數裡是嚴重的資安錯誤,那串內容會被完整記在好幾個地方。

新手最常犯的錯

  • 用 GET 傳敏感資料:帳號、密碼、金鑰出現在網址參數裡。
  • 用 GET 做寫入:拿 GET 去建立、更新或刪除資料,違反基本原則。
  • 網址塞太長:參數過多導致請求被伺服器拒絕。
  • POST 忘了設標頭:沒指定內容型別,伺服器解析不出資料。
  • JSON 格式錯誤:少一個逗號或引號,直接換來一個 400 錯誤。

串接任何 API 之前,先確認方法、資料位置與標頭這三件事,可以省掉大半的除錯時間。

常見誤解最常見的誤解是以為 POST 就等於安全。POST 只是不把資料放在 網址 上,內容本身仍是明文傳輸,真正的保護來自加密連線。另一個誤解是以為看不到就沒事,其實用瀏覽器的開發者工具一樣看得到請求內容,該加密的還是要加密。
本文源起本文內容出自酒Ann 的「AI 實戰陪跑班」課程教材,由酒Ann 編寫成彙編條目。想系統性搞懂 AI 名詞,歡迎追蹤 酒Ann 的 Facebook

延伸學習

把這篇文章分享給需要的人FacebookLINEThreadsX

常見問答

為什麼帳號密碼不能用 GET 傳?
因為 GET 的參數會出現在網址裡,而網址會被瀏覽器歷史、伺服器日誌與中間的代理層記錄下來,旁邊的人也可能直接看到。敏感資料一律走 POST。
GET 有長度限制嗎?
有。網址長度受瀏覽器與伺服器限制,實務上常見的安全值約在兩千個字元上下,超過就可能被拒絕。要傳大量資料就該用 POST。
重複送出同一個請求會怎樣?
GET 可以安全地重複執行,結果不變。POST 重複送出可能造成重複寫入,例如下了兩筆一樣的訂單,所以表單送出後要做防重複處理。