上一篇我們已經聊過 API Gateway + Lambda 的 GET 參數傳遞。
GET 的精神很簡單:想說什麼,直接寫在網址上讓全世界都看到。
舉例來說,
https://api.example.com/hello?name=小明&age=18
這就像你去便利商店買菸還大喊:「老闆,我 18 歲啦!」
傳遞資訊沒錯,但也太高調。
POST 的哲學是完全相反的。
它就像傳 LINE 密語:「我有事要說,不方便公開。」
資料不是掛在網址後面,而是藏在 Request Body 裡面。
這也就是為什麼很多 API 文件會寫:「請使用 POST 方法傳送參數」。
畢竟工程師不是每天都想讓 query string 把機密曝露在 log 裡。
(誰想被查 log 的時候看到自己曾傳過 "password=123456"
?)
接下來就進入實戰。今天要示範的 Lambda function 名叫:lambda-api-post
Runtime:Python 3.13
程式碼:
import json
def lambda_handler(event, context):
print(event)
if event.get('body'):
# API Gateway 會將 body 以字串形式傳入,需要解析
body = json.loads(event['body'])
# 取得 POST 參數
pname = body.get('name', '')
page = body.get('age', '')
print(f"接收到的參數: name={pname}, age={page}")
return {
'statusCode': 200,
'body': json.dumps(f'Hello, my name is e is {pname}, I am {page} years old. ')
}
這段程式碼就像是 Lambda 版本的櫃檯小姐。
API Gateway 把 request 轉交給它,它就會說:
「欸我看一下資料,喔~body 裡面有 name 跟 age 喔,那我幫你組一個句子回去。」
以前 GET 的版本,是從 event['queryStringParameters']
裡面撈資料;
而這次 POST 改從 event['body']
撈,因為 POST 的內容都藏在那裡。
這也是很多新手第一次卡關的地方:
他們明明有傳資料,卻在 Lambda 裡撈不到,
然後怒喊:「API Gateway 壞掉了!」
(結果是自己忘了加 json.loads
或者是找錯地方。)
首先,我們還是先來重現那經典流程:
跟前面做 GET 的時候一樣,先點到 lambda-api
的 resource 上再點擊 create method
lambda-api-post
建立完之後,左邊的 API Tree 會出現一個熟悉的新成員:
lambda-api
底下多了一個 POST method。
這時候點右上角的 Deploy API → 選擇 prod
→ 按下 Deploy
。
部署成功後,你會看到一個畫面,長得跟之前 GET 時幾乎一模一樣。
這時你一定會懷疑人生:「欸?URL 怎麼沒變?」
別懷疑,這是正常的。
因為 URL 是 Resource 的門牌,Method 才是你敲門的姿勢。
GET 是禮貌敲門:「嗨,可以給我資料嗎?」
POST 是直接衝進門內:「來,資料我幫你塞進去!」
所以 URL 當然一樣啊,差別只是你用的「手勢」不同。
上次我們測試 GET,只要在 Chrome 貼上 URL 就搞定,
瀏覽器直接幫你送出 Request,優雅又方便。
但 POST 呢?
抱歉,這次你要動用更硬派的工具:cURL。
對,就是那個藏在系統裡、平常只在 Stack Overflow 貼範例的東西。
現在終於派上用場了。
範例如下:curl -X POST https://b5ou0dlsdc.execute-api.us-east-1.amazonaws.com/prod/lambda-api -H "Content-Type: application/json" -d '{"name": "Mich", "age": "20"}'
按下 Enter,結果出現:"Hello, my name is e is Mich, I am 20 years old. "
恭喜你,這就是 Lambda 和 API Gateway 在 POST 模式下的浪漫互動。
如果你測試的環境是在Windows下的話,有可能會遇到錯誤訊息,八成是跟跳脫字元相關 。 可以用以下指令進行測試:curl -X POST --insecure https://b5ou0dlsdc.execute-api.us-east-1.amazonaws.com/prod/lambda-api -H "Content-Type: application/json" -d "{\"name\": \"Mich\", \"age\": 20}"
沒有意外的話應該就真的沒有意外了。
學會這兩個 Method,差不多你就可以自稱「API Gateway 實戰工程師」。
剩下的 PATCH、PUT、DELETE…
等那天真的遇到了再說吧!!