iT邦幫忙

2025 iThome 鐵人賽

DAY 28
0

前情提要:上次 GET 已經 GET 到了吧?

上一篇我們已經聊過 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 登場

接下來就進入實戰。今天要示範的 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 或者是找錯地方。)

API Gateway 建立 POST method

首先,我們還是先來重現那經典流程:
跟前面做 GET 的時候一樣,先點到 lambda-api 的 resource 上再點擊 create method
https://ithelp.ithome.com.tw/upload/images/20251008/20141071MGmwRaEp54.png

  1. Method Type → 選 POST
  2. Integration Type → 選 Lambda function
  3. 千!萬!要記得勾!Lambda Proxy Integration
  4. Lambda 選擇剛剛建立的 lambda-api-post
  5. 然後就可以很開心地按下 Create Method
    https://ithelp.ithome.com.tw/upload/images/20251008/20141071vN0hkJEvqx.png
    這一連串看似簡單的步驟,卻是很多人掉坑的開端。
    因為「忘記勾 Proxy」這件事,就像是工程師界的交通違規——
    大家都知道不能不勾,但總有一天你會忘記一次,然後花三小時在 debug,最後發現 Lambda 裡面的 Event 怎麼空空的沒東西 。

建立完之後,左邊的 API Tree 會出現一個熟悉的新成員:
lambda-api 底下多了一個 POST method
這時候點右上角的 Deploy API → 選擇 prod → 按下 Deploy
https://ithelp.ithome.com.tw/upload/images/20251008/20141071Cdrl44RRgy.png

https://ithelp.ithome.com.tw/upload/images/20251008/201410718YCpXrl4r1.png

部署成功後,你會看到一個畫面,長得跟之前 GET 時幾乎一模一樣。
這時你一定會懷疑人生:「欸?URL 怎麼沒變?」
https://ithelp.ithome.com.tw/upload/images/20251008/20141071xkOMmNahe4.png
別懷疑,這是正常的。
因為 URL 是 Resource 的門牌,Method 才是你敲門的姿勢。

GET 是禮貌敲門:「嗨,可以給我資料嗎?」
POST 是直接衝進門內:「來,資料我幫你塞進去!」

所以 URL 當然一樣啊,差別只是你用的「手勢」不同。

測試:這次 Chrome 不夠力了

上次我們測試 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…
等那天真的遇到了再說吧!!


上一篇
Day 27 - API Gatway 與 Lambda 的參數傳遞指南 - GET 篇
下一篇
Day 29 - API Gateway、Lambda 與 Telegram 衝撞的火花 之 Telegram Bot 的建立
系列文
最適合小型工作室精打細算的服務使用法29
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言