本文為 AJAX 基本介紹系列文,第 1 篇:
- 初學者指南:什麼是HTTP 方法? 👈進度
- 網頁狀態碼(HTTP Status Code)指南:從分類到常見應用
- 新手指南:什麼是同步與非同步?
- 新手指南:什麼是 AJAX?
- 新手指南:什麼是 XMLHttpRequest?
- 初學者指南:了解 JavaScript 的 fetch 函數
- 深入理解Fetch 函數的第二個參數
- 初學者指南:了解JavaScript 的Promise 物件
- JavaScript 中的await 關鍵字:從fetch 到現代非同步處理
- 初學者指南:了解JavaScript 中的Promise 和await
- fetch 方法到底取得的東西是什麼?
- 新手指南:什麼是 JSON?
當你在瀏覽網頁或與網站互動時,你的瀏覽器和伺服器之間其實正在進行大量的通訊。
而這些通訊,是通過一種叫做 HTTP 方法(HTTP Methods) 的操作來完成的。
HTTP 方法是指,瀏覽器用來告訴伺服器,我們想要進行什麼操作的一組標準化命令。
這篇文章將幫助你,了解最常見的 HTTP 方法,並說明它們的作用和用途。
什麼是 HTTP 方法?
HTTP(Hypertext Transfer Protocol) ,是用於在客戶端(例如你的瀏覽器)和伺服器之間傳輸資料的協議。
而 HTTP 方法,則用於指示伺服器應該如何處理特定的資源。
例如,當你在瀏覽器中輸入一個網址並按下 Enter,瀏覽器會發送一個 HTTP 請求到伺服器,請求對應頁面的資料。
HTTP 方法可以幫助定義這些請求的操作類型,以下是一些最常見的 HTTP 方法:
GET 方法
GET 是最常用的 HTTP 方法之一,主要用於從伺服器中獲取資源或資料。
當你在瀏覽器中輸入一個網址並請求網頁時,其實就是在使用 GET 方法。
- 用途:請求並獲取伺服器上的資料。
- 特點:GET 請求的參數會顯示在 URL 中,因此不適合傳輸敏感資訊。
範例:
GET /products HTTP/1.1
Host: example.com這個請求會向伺服器請求所有商品的資料。
POST 方法
POST 用於將新的資料提交到伺服器,例如提交表單、上傳檔案等。
POST 方法的請求資料會包含在請求體中,而不是顯示在 URL 中。
- 用途:提交新的資料或創建資源。
- 特點:通常用於提交表單、創建帳戶等操作,資料不會顯示在 URL 中,安全性相對較高。
範例:
POST /products HTTP/1.1
Host: example.com
Content-Type: application/json
{
"name": "新商品",
"price": 100
}這個請求會向伺服器提交一個新商品的資料。
PUT 方法
PUT 用於更新伺服器上的現有資源或創建資源。
如果資源不存在,伺服器通常會創建一個新的資源。
PUT 方法比較常用於整體更新資源的情況。
- 用途:更新或替換伺服器上的資源。
- 特點:請求通常包含完整的資源資訊,適合替換現有的資料。
範例:
PUT /products/1 HTTP/1.1
Host: example.com
Content-Type: application/json
{
"name": "更新後的商品",
"price": 150
}這個請求會更新商品 ID 為 1 的資訊。
PATCH 方法
PATCH 也用於更新資源,但與 PUT 不同的是,PATCH 只會更新資源的部分內容,而不是整體替換。
因此,當你只需要修改資源的某個字段時,使用 PATCH 更為合適。
- 用途:部分更新資源。
- 特點:只需包含需要修改的部分,不用傳整個資源。
範例:
PATCH /products/1 HTTP/1.1
Host: example.com
Content-Type: application/json
{
"price": 120
}這個請求會僅更新商品 ID 為 1 的價格資訊。
DELETE 方法
DELETE 用於刪除伺服器上的資源。
例如,如果你想刪除某個資料記錄或文件,可以使用 DELETE 方法。
- 用途:刪除伺服器上的資源。
- 特點:直接刪除指定的資源,通常不會有請求體。
範例:
DELETE /products/1 HTTP/1.1
Host: example.com這個請求會刪除商品 ID 為 1 的資料。
常見應用場景
不同的 HTTP 方法適用於不同的場景,以下是一些常見的應用場景:
- GET:當你想要從伺服器獲取資料,例如查詢所有使用者的列表。
- POST:當你需要創建一個新的使用者帳戶時,使用 POST 方法提交表單資料。
- PUT:如果你需要替換現有的使用者資料,可以使用 PUT 方法。
- PATCH:如果你只需要修改使用者的部分資訊,例如更改 email,則使用 PATCH 方法更為高效。
- DELETE:當你想要移除某個使用者的帳戶時,可以使用 DELETE 方法。
關於 GET 與 POST,你可能誤會的事
初學者常常會有一個疑問:
既然 GET 是「取得」資料,POST 是「送出」資料,那 GET 是不是不能帶任何資料給伺服器?
其實不是的。
GET 也可以攜帶資料,只是資料必須放在 URL 的 Query 參數 中。
範例:
GET /products?category=electronics&sort=price HTTP/1.1
Host: example.com在這個例子中,category=electronics 和 sort=price 就是透過 GET 請求傳送給伺服器的資料。
那我可以用 GET 來新增資料嗎?
技術上,可以。
這是因為 HTTP 方法本身只是一個「標籤」,它告訴伺服器:「嘿,這是一個 GET 請求。」但伺服器收到請求之後,要怎麼處理完全是由後端程式碼決定的。
舉個例子,假設有人發送了這樣的請求:
GET /add-product?name=iPhone&price=30000 HTTP/1.1
Host: example.com後端工程師完全可以這樣寫程式:
// 這是一個「技術上可行,但不應該這樣做」的範例
app.get('/add-product', (req, res) => {
const name = req.query.name;
const price = req.query.price;
// 把資料寫入資料庫
database.insert({ name, price });
res.send('商品新增成功');
});這段程式碼會正常運作,商品確實會被新增到資料庫。
所以問題不在於「能不能做到」,而是「這樣做會帶來什麼問題」。
為什麼不建議用 GET 來新增資料?
雖然技術上做得到,但實務上強烈不建議這麼做,原因如下:
瀏覽器會快取 GET 請求
瀏覽器預設會對 GET 請求進行快取。
這意味著,如果使用者短時間內發送相同的 GET 請求,瀏覽器可能會直接使用快取的回應,根本不會真的把請求送到伺服器。
結果就是:使用者以為資料新增成功了,但其實什麼都沒發生。
網頁爬蟲會自動訪問連結
搜尋引擎的爬蟲(如 Google Bot)會自動抓取網頁上的所有連結。
如果你的「新增商品」功能是一個 GET 連結,爬蟲一爬到就會觸發新增動作。
想像一下:Google 爬蟲每天來你的網站逛一圈,每次都幫你「新增」幾筆假資料,這會是多大的災難。
使用者可能會意外重複觸發
GET 請求的 URL 可以被:
- 加入書籤
- 分享給朋友
- 出現在瀏覽紀錄中
- 被使用者不小心重新整理
每一次訪問這個 URL,都會執行一次新增。使用者可能只是想回顧一下之前的操作,結果又新增了一筆重複的資料。
違反 HTTP 規範的語意
根據 HTTP 規範,GET 方法被定義為「安全」(Safe)且「冪等」(Idempotent) 的:
- 安全:這個操作不應該改變伺服器上的資料狀態
- 冪等:執行一次和執行多次的結果應該相同
新增資料明顯違反了這兩個原則。雖然伺服器不會阻止你這麼做,但這會讓其他開發者、工具、甚至瀏覽器對你的 API 行為產生錯誤的預期。
敏感資料會暴露在 URL 中
GET 的參數會直接顯示在 URL 上,這意味著:
- 會出現在瀏覽器的網址列和歷史紀錄
- 會被記錄在伺服器的 access log
- 可能被中間的代理伺服器快取或記錄
如果你用 GET 傳送密碼或信用卡號,這些敏感資料就會到處留下痕跡。
GET 跟 POST 的本質差異
那為什麼我們還是說「GET 取得、POST 送出」呢?這其實是指它們的設計目的:
- GET:設計上是用來「請求」資源,附帶的參數通常是查詢或篩選條件。
- POST:設計上是用來「提交」資料,讓伺服器進行處理。
簡單來說:
GET 帶的資料是為了「告訴伺服器我要找什麼」
POST 帶的資料是為了「告訴伺服器我要它做什麼」
POST 的應用場景
POST 的應用其實很廣泛,不只是「新增一筆資料到資料庫」這麼單純。常見的使用情境包括:
- 提交表單:註冊帳號、登入、填寫問卷、送出留言
- 上傳檔案:圖片、文件、影片
- 觸發動作:發送 Email、產生 PDF 報表、啟動某個背景任務
- 第三方整合:呼叫金流 API 進行付款、呼叫簡訊 API 發送驗證碼
這些操作的共同點是:你希望伺服器根據你提交的資料「做某件事」,而不只是單純地回傳資料給你。
小結
| 面向 | GET | POST |
|---|---|---|
| 資料放在哪裡 | URL 的 Query 參數 | 請求的 Body 中 |
| 設計目的 | 請求 / 查詢資源 | 提交資料讓伺服器處理 |
| 是否應改變伺服器狀態 | 否(Safe) | 是 |
| 可以用來新增資料嗎 | 技術上可以,但不建議 | 適合 |
| 敏感資料 | 不適合(會暴露在 URL) | 相對適合 |
記住:HTTP 方法的選擇不只是技術問題,更是一種約定俗成的語意規範。
遵守這些規範,可以讓你的 API 更容易被理解、維護,也能避免許多意想不到的問題。
總結
HTTP 方法是網頁和伺服器之間進行通訊的基本方式,每個方法都有其特定的用途和特點。
最常見的 HTTP 方法包括 GET、POST、PUT、PATCH 和 DELETE,它們分別用於獲取、創建、更新和刪除資源。
理解這些 HTTP 方法,對於掌握 Web 開發和 API 交互至關重要。
希望這篇文章能幫助你,更好地理解 HTTP 方法的基本概念,並為你未來的開發工作,打下堅實的基礎!