iT邦幫忙

2024 iThome 鐵人賽

DAY 11
0
Modern Web

後端菜雞仔想學 Laravel系列 第 11

測試 API:初次使用也能快速上手的 Postman

  • 分享至 

  • xImage
  •  

昨天指派店長(Controller)建立「新增產品」這區域的工作流程範例,並分配店員(Route),也給倉庫管理員(Model)訂一個工作規定。

當建立好一個區域的工作流程,也就是完成這個 API 時,我就會先測試這個 API 能不能正常使用,而不會等整個 CRUD 都建立完成才一個一個測試。
因為我覺得當這個 API 測試出來有問題的時候,我自己比較能快速找到是哪邊出現問題。(純粹我自己覺得XD)

小食譜05:測試 API

我使用 Postman 進行測試,覺得這個工具很新手友善,而且後續還能拿來產 API 文件,菜雞仔如我,初次使用也能快速上手,是一個非常方便好用的 API 測試工具。

第一步:啟動 Postman

如果還沒有安裝的小夥伴們,可先到 Postman 官網 進行下載安裝。

第二步:建立新請求

  1. 建立請求
    • 點選左上角 My Workspace 旁邊的 New 按鈕。
    • 選擇 HTTP
  2. 設定請求內容
    • 在方框欄中輸入請求的 URL(例如: 127.0.0.1:8000/api/products)。
    • 選擇請求方法(如 GET、POST、PUT、DELETE 等)。
    • 如果是 POST、PUT 或 PATCH 請求,需要在 Body 中加入傳送的資料。
    • 在 Headers 中設定 Key 跟 Value(如 Content-Type、Authorization 等)。

第三步:發送請求

  1. 發送請求:設定好請求後,點選藍色的 Send 按鈕發送請求。
  2. 查看回應:請求發送後,你可以在下方的區塊中查看伺服器的回應,包括 Http Status 及回傳資料。

Postman 基本的操作可以參考這篇文章:[工具] API測試工具 POSTMAN 基本操作


HTTP POST API 兩種傳資料方式的差別

因為有大量商品上架的經驗,所以在我的需求想像裡,「新增產品」除了商品文字資料,應該還有圖片。

進而讓我思考:根據我的需求,我應該要選擇哪種傳資料的方式?

方法1:
使用 HTTP POST API,先在 Headers 設定 Content-Type 為 application/json,然後切換到 Body,選擇 raw,並填入 JSON 格式的資料。

方法2:
使用 HTTP POST API,先在 Headers 設定 Accept 為 application/json,接著在 Body 選擇 form-data,輸入 key 跟 value。

以下整理 GPT 的建議

處理資料要存到資料庫時,選擇傳資料的方式有幾個考量:

  • 資料結構複雜度:
    如果資料很複雜,有很多層的結構,JSON 會比較適合,因為它能清楚表達這些層級。
  • 檔案上傳:
    如果有文件要上傳(圖片或 PDF),就一定要用 form-data,因為 JSON 無法處理文件。
  • API 標準:
    現代的 API 大多使用 JSON 格式來交換資料,所以通常 JSON 是最佳選擇。

HTTP POST API 傳資料方式選擇建議:

如果資料都是文字:

使用 JSON 格式(方法1)比較好,因為它傳輸結構化數據方便,又容易驗證。

設定方式:

  • 在 Headers 加入 Content-Type: application/json。
  • Body 選 raw,設定為 JSON 格式。
  • 填入 JSON 資料,例如:
{
    "name": "Lina",
    "email": "lina@example.com",
    "age": 30
}

如果要上傳文件(圖片或 PDF):

使用 form-data 格式(方法2),可以同時傳文件和文字。

設定方式:
在 Headers 可選 Accept: application/json(看 API 要求)。
Body 選 form-data,填入 key-value 資料,例如:

key: product_name       value: 杏仁瓦片
key: profile_picture    value: (上傳文件)

小結:

傳文字用 JSON,方便、簡單、符合現代 API 設計。
要上傳文件用 form-data,因為它能處理文件和文字。

所以根據我的需求,綜合以上建議,我選擇方法2:

  • 使用 HTTP POST API
  • Headers 設定 Accept 為 application/json
  • Body 選擇 form-data,輸入 key 跟 value

備註:

結果我在資料庫設計的時候,沒有思考到我的 products 表需要圖片的欄位哦!到這一步的時候才想到,我真的會被我自己氣死><
到現在還是菜雞仔的我,依然犯著低級的錯誤,我會告訴我自己這都是經驗的累積(拭淚)

所以以下 Postman 測試範例,雖然設定方法2,但先不傳圖片哦!
只是想給大家有個畫面感。

範例

https://ithelp.ithome.com.tw/upload/images/20240925/201693002Z0f8hU2vd.jpg

  • 使用 HTTP POST API
  • Headers 設定 Accept 為 application/json

https://ithelp.ithome.com.tw/upload/images/20240925/20169300G5UMuvmTxt.jpg

  • Body 選擇 form-data,輸入 key 跟 value
  • 按下 Send 送出
  • 狀態顯示 201 並出現資料內容為即新增成功!

延伸需求

大家可以在範例看到我的時間長得很奇怪,我希望它的格式是當下的日期+時間就好。

那我們來調整一下時間格式:
跟你的倉庫管理員(Model)新增一個工作規定。

使用 parent::toArray()

意思是使用 parent 呼叫父類 Model 的 toArray() 方法。
這個方法會將模型的所有屬性轉換成陣列格式,可以處理關聯資料和日期格式。

那什麼是 parent?

parent 關鍵字允許子類別中重複使用父類別的方法。
當你在子類別中覆寫了父類別的方法後,仍然可以使用 parent:: 呼叫父類別原本的方法或屬性。
如果需要對父類別方法進行擴展而不是完全覆蓋時,也可以使用。

  • 使用情境:
    • 方法繼承:在子類中覆寫父類方法,但仍希望呼叫父類中的原始方法。
    • 擴展行為:在子類中增加額外的邏輯,並在原邏輯上做更多操作。

官方文件參考:
Laravel Eloquent:Serializing to Arrays
PHP Official Documentation for parent

也可以使用 casts()

這個方法用於定義模型屬性的類型轉換,Laravel 會自動將資料從資料庫轉換為你在 casts 中指定的格式(例如日期、陣列、布林值等)。

官方文件參考:
Laravel Eloquent:Customizing the Date Format per Attribute

小結:

  • toArray() 方法讓你完全掌控資料輸出格式,自定義程度更高。
    像是指定 created_at 和 updated_at 的格式化操作。
  • casts() 方法用於定義資料類型轉換,能夠簡化一些常見的類型處理,但無法做到非常精細的格式化。

大家可以根據自己的需求選擇。


動手做做看

打開 Product.php

輸入以下程式碼:

public function toArray()
    {
        $array = parent::toArray();
        
        // 格式化 created_at 和 updated_at
        $array['created_at'] = $this->created_at->format('Y-m-d H:i');
        $array['updated_at'] = $this->updated_at->format('Y-m-d H:i');

        return $array;
    }

範例

https://ithelp.ithome.com.tw/upload/images/20240925/20169300eKNBrYHAcH.jpg

這樣時間格式就調整好囉!
如果有想調整時間格式的小夥伴們也可以試試看唷!


上一篇
Controller & Route:來指派店長跟分配店員吧!
下一篇
Git & GitHub:派遣你的時光機!
系列文
後端菜雞仔想學 Laravel13
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言