[Lab] Postman X Trello RESTful API Startup Lab

壹、前言與聲明

  • 本文為 Postman 的 Lab,使用 Trello RESTful API 作為範例
  • 撰寫本文的動機在於配合 RESTful API 課程 HW1 學習 Postman 的使用
  • 本文獨立於課程外,也是適合自行訓練的範例──不論您想入門的是 Postman 或 Trello RESTful API
  • 本頁面使用 JS 簡化操作,藉由輸入的資料自動組出 Lab 所需要的資料,本頁面不會傳輸你的 API Key 或 Token 到後端伺服器

貳、預處理

  1. https://trello.com 註冊並登入 Trello
  2. https://www.postman.com/ 下載、註冊並登入 Postman
    請不要使用 Chrome Plugin 的 Postman,該版本已經停止維護

參、參考資料

肆、Lab

Lab 01: 取得「API 金鑰」 與 「Token」

階段任務:取得可供 RESTful帳號授權,以備接下來的 Lab 使用

  1. https://trello.com/power-ups/admin 登入 Power-ups Admin
  2. https://trello.com/power-ups/admin 建立新的 Power-up
    圖片備份
    圖片備份
  3. https://trello.com/power-ups/admin 進入新建立的 Power-up
    > 進入 「API 金鑰」 分頁
    > 產生新的 API 金鑰
    >
    在這個欄位輸入 API Key:
    圖片備份
    圖片備份
    圖片備份
    圖片備份
    > 進入下一步前,請先回到上面,將得到的 API Key 輸入欄位中
  4. 請仔細觀察以下連結的組成
    > 連結的 query 標示了此連結的行為是「請求Token」、「Token效期1天」、「Token能讀能寫」、「Token依附在指定API Key下」
    > 請進入連結取得 Token :
    >
    在這個欄位輸入 Token:
    圖片備份
    圖片備份
    > 進入下一步前,請先回到上面,將得到的 token 輸入欄位中
  5. 進入以下連結確認 API Key, Token 運作正常
    > 看到 Json 格式資料表示 API Key 與 Token 正常
    > Trello RESTful API 取得 「Trello 使用者資訊」
    > 以上連結利用 Query 攜帶 API Key 跟 Token 來達成授權

Lab 02: 使用 Trello RESTful API

前置作業: 設定 Postman

  1. 在 Postman 匯入 本 Lab 的 Collection
  2. 確認 Environment Variable 有啟用,不是處於 No Environment 的狀態
    圖片備份
  3. 將 API Key 與 Token 加入 Global variable 或 Environment Variable
    圖片備份

任務清單

  • 建立看板(Board) myBoard
    • 驗證狀態碼 Status Code = 200
    • 驗證返回的 json 中 看板名稱 = myBoard
    • 驗證返回的 json 中 closed = false
  • 建立列表(List) TODO,在看板(Board) myBoard 中建立
    • 驗證狀態碼 Status Code = 200
    • 驗證返回的 json 中 列表名稱 = TODO
    • 驗證返回的 json 中 closed = false
    • 驗證返回的 json 中 列表所在看板 = myBoard
  • 建立列表(List) DONE,在看板(Board) myBoard 中建立
    • 驗證狀態碼 Status Code = 200
    • 驗證返回的 json 中 列表名稱 = DONE
    • 驗證返回的 json 中 closed = false
    • 驗證返回的 json 中 列表所在看板 = myBoard
  • 建立卡片(Card) Learn Postman,在列表(List) TODO 中建立
    • 驗證狀態碼 Status Code = 200
    • 驗證返回的 json 中 卡片名稱 = Learn Postman
    • 驗證返回的 json 中 closed = false
    • 驗證返回的 json 中 卡片所在列表 = TODO
    • 驗證返回的 json 中 卡片所在看板 = myBoard
    • 驗證返回的 json 中 卡片沒有投票 votes = false
    • 驗證返回的 json 中 卡片沒有附件 attachments = false
  • 移動卡片(Card) Learn Postman,由列表(List) TODO 移動到 DONE
    • 驗證狀態碼 Status Code = 200
    • 驗證返回的 json 中 卡片名稱 = Learn Postman
    • 驗證返回的 json 中 closed = false
    • 驗證返回的 json 中 卡片所在列表 = DONE
    • 驗證返回的 json 中 卡片所在看板 = myBoard
    • 驗證返回的 json 中 卡片沒有投票 votes = false
    • 驗證返回的 json 中 卡片沒有附件 attachments = false
  • 刪除卡片(Card) Learn Postman
    • 驗證狀態碼 Status Code = 200
  • 封存列表(List) TODO
    • 驗證狀態碼 Status Code = 200
    • 驗證返回的 json 中 列表名稱 = TODO
    • 驗證返回的 json 中 closed = true
    • 驗證返回的 json 中 列表所在看板 = myBoard
  • 封存列表(List) DONE
    • 驗證狀態碼 Status Code = 200
    • 驗證返回的 json 中 列表名稱 = DONE
    • 驗證返回的 json 中 closed = true
    • 驗證返回的 json 中 列表所在看板 = myBoard
  • 刪除看板(Board) myBoard
    • 驗證狀態碼 Status Code = 200
  • 確認看板(Board) myBoard 不存在
    • 驗證狀態碼 Status Code = 200

建立看板(Board) myBoard

在 Postman 中

  • 方法:POST
  • 目標:
  • 測試:
    // Parse Json
    let response = pm.response.json();
    
    // Save Response
    pm.environment.set("myBoard_id", response.id);
    
    // Confirm Result
    pm.test("Status code is 200", function () {
        pm.response.to.have.status(200);
    });
    pm.test("Board name is myBoard", function () {
        pm.expect(response.name).to.eql("myBoard");
    });
    pm.test("Board is not closed", function () {
        pm.expect(response.closed).is.false;
    });
  • 說明:
    • 因為是「建立」看板,所以使用 POST(建立)
    • 因為是建立「看板」、所以 Path 為 boards
    • 因為建立看板需要名稱,所以 Query 需攜帶新看板的名稱 myBoard
    • 因為不希望看板建立時產生預設的 List 跟 Label,所以 Query 需指定關閉預設 List 跟 Label
    • 因為行為需要授權,所以 Query 須包含 key 跟 token
    • 執行後會得到新看板的 id,將其記錄到環境變數 myBoard_id 供後續使用

建立列表(List) TODO,在看板(Board) myBoard 中建立

在 Postman 中

  • 方法:POST
  • 目標:
  • 測試:
    // Parse Json
    let response = pm.response.json();
    
    // Save Response
    pm.environment.set("TODO_id", response.id);
    
    // Confirm Result
    pm.test("Status code is 200", function () {
        pm.response.to.have.status(200);
    });
    pm.test("List name is TODO", function () {
        pm.expect(response.name).to.eql("TODO");
    });
    pm.test("List is not closed", function () {
        pm.expect(response.closed).is.false;
    });
    pm.test("List is in Board myBoard", function () {
        pm.expect(response.idBoard).to.eql(pm.environment.get("myBoard_id"));
    });
  • 說明:
    • 因為是「建立」列表,所以使用 POST(建立)
    • 因為是建立「列表」、所以 Path 為 lists
    • 因為建立列表需要名稱,所以 Query 需攜帶新列表的名稱 TODO
    • 因為列表層級是在看板中,所以需要提供看板 id 指定在哪個看板中建立。我們將直接帶入環境變數 myBoard_id
    • 因為行為需要授權,所以 Query 須包含 key 跟 token
    • 執行後會得到新列表的 id,將其記錄到環境變數 TODO_id 供後續使用

建立列表(List) DONE,在看板(Board) myBoard 中建立

在 Postman 中

  • 方法:POST
  • 目標:
  • 測試:
    // Parse Json
    let response = pm.response.json();
    
    // Save Response
    pm.environment.set("DONE_id", response.id);
    
    // Confirm Result
    pm.test("Status code is 200", function () {
        pm.response.to.have.status(200);
    });
    pm.test("List name is DONE", function () {
        pm.expect(response.name).to.eql("DONE");
    });
    pm.test("List is not closed", function () {
        pm.expect(response.closed).is.false;
    });
    pm.test("List is in Board myBoard", function () {
        pm.expect(response.idBoard).to.eql(pm.environment.get("myBoard_id"));
    });
  • 說明:
    • 因為是「建立」列表,所以使用 POST(建立)
    • 因為是建立「列表」、所以 Path 為 lists
    • 因為建立列表需要名稱,所以 Query 需攜帶新列表的名稱 DONE
    • 因為列表層級是在看板中,所以需要提供看板 id 指定在哪個看板中建立。我們將直接帶入環境變數 myBoard_id
    • 因為行為需要授權,所以 Query 須包含 key 跟 token
    • 執行後會得到新列表的 id,將其記錄到環境變數 DONE_id 供後續使用

建立卡片(Card) Learn Postman,在列表(List) TODO 中建立

在 Postman 中

  • 方法:POST
  • 目標:
  • 測試:
    // Parse Json
    let response = pm.response.json();
    
    // Save Response
    pm.environment.set("card_id", response.id);
    
    // Confirm Result
    pm.test("Status code is 200", function () {
        pm.response.to.have.status(200);
    });
    pm.test("Card name is Learn Postman", function () {
        pm.expect(response.name).to.eql("Learn Postman");
    });
    pm.test("List is in List TODO", function () {
        pm.expect(response.idList).to.eql(pm.environment.get("TODO_id"));
    });
    pm.test("List is in Board myBoard", function () {
        pm.expect(response.idBoard).to.eql(pm.environment.get("myBoard_id"));
    });
    pm.test("Card is not closed", function () {
        pm.expect(response.closed).is.false;
    });
    pm.test("Card have no votes", function () {
        pm.expect(response.badges.votes).to.eql(0);
    });
    pm.test("Card have no attachments", function () {
        pm.expect(response.badges.attachments).to.eql(0);
    });
  • 說明:
    • 因為是「建立」卡片,所以使用 POST(建立)
    • 因為是建立「卡片」、所以 Path 為 cards
    • 因為建立卡片需要名稱,所以 Query 需攜帶新列表的名稱 Learn Postman
    • 因為卡片層級是在清單中,所以需要提供清單 id 指定在哪個清單中建立。我們將直接帶入環境變數 TODO_id
    • 因為行為需要授權,所以 Query 須包含 key 跟 token
    • 執行後會得到新列表的 id,將其記錄到環境變數 card_id 供後續使用

移動卡片(Card) Learn Postman,由列表(List) TODO 移動到 DONE

在 Postman 中

  • 方法:PUT
  • 目標:
  • 測試:
    // Parse Json
    let response = pm.response.json();
    
    // Confirm Result
    pm.test("Status code is 200", function () {
        pm.response.to.have.status(200);
    });
    pm.test("Card name is Learn Postman", function () {
        pm.expect(response.name).to.eql("Learn Postman");
    });
    pm.test("List is in List DONE", function () {
        pm.expect(response.idList).to.eql(pm.environment.get("DONE_id"));
    });
    pm.test("List is in Board myBoard", function () {
        pm.expect(response.idBoard).to.eql(pm.environment.get("myBoard_id"));
    });
    pm.test("Card is not closed", function () {
        pm.expect(response.closed).is.false;
    });
    pm.test("Card have no votes", function () {
        pm.expect(response.badges.votes).to.eql(0);
    });
    pm.test("Card have no attachments", function () {
        pm.expect(response.badges.attachments).to.eql(0);
    });
  • 說明:
    • 因為是「移動」卡片,所以使用 PUT(修改)
    • 因為是移動「卡片」、所以 Path 為 cards,以卡片 id 為標的。我們將直接帶入環境變數 card_id
    • 因為移動卡片需要指定目標清單,所以 Query 需要指定目標的清單 id。我們將直接帶入環境變數 DONE_id
    • 因為行為需要授權,所以 Query 須包含 key 跟 token

刪除卡片(Card) Learn Postman

在 Postman 中

  • 方法:DEL
  • 目標:
  • 測試:
    // Parse Json
    let response = pm.response.json();
    
    // Confirm Result
    pm.test("Status code is 200", function () {
        pm.response.to.have.status(200);
    });
    pm.test("limits is empty", function () {
        pm.expect(response.limits).is.empty;
    });
  • 說明:
    • 因為是「刪除」卡片,所以使用 DEL(刪除)
    • 因為是刪除「卡片」、所以 Path 為 cards,以卡片 id 為標的。我們將直接帶入環境變數 card_id
    • 因為行為需要授權,所以 Query 須包含 key 跟 token

封存列表(List) TODO

在 Postman 中

  • 方法:PUT
  • 目標:
  • 測試:
    // Parse Json
    let response = pm.response.json();
    
    // Confirm Result
    pm.test("Status code is 200", function () {
        pm.response.to.have.status(200);
    });
    pm.test("List name is TODO", function () {
        pm.expect(response.name).to.eql("TODO");
    });
    pm.test("List is closed", function () {
        pm.expect(response.closed).is.true;
    });
    pm.test("List is in Board myBoard", function () {
        pm.expect(response.idBoard).to.eql(pm.environment.get("myBoard_id"));
    });
  • 說明:
    • 因為沒有提供刪除清單的 API,因此只進行封存清單
    • 因為是「封存」清單,所以使用 PUT(修改)
    • 因為是封存「清單」、所以 Path 為 lists,以清單 id 為標的,附加封存行為 closed。我們將直接帶入環境變數 TODO_id
    • 因為 Trello 將清單的封存狀態(封存/解封)整合為一個 API,所以 Query 需要指定目標的封存狀態
    • 因為行為需要授權,所以 Query 須包含 key 跟 token

封存列表(List) DONE

在 Postman 中

  • 方法:PUT
  • 目標:
  • 測試:
    // Parse Json
    let response = pm.response.json();
    
    // Confirm Result
    pm.test("Status code is 200", function () {
        pm.response.to.have.status(200);
    });
    pm.test("List name is DONE", function () {
        pm.expect(response.name).to.eql("DONE");
    });
    pm.test("List is closed", function () {
        pm.expect(response.closed).is.true;
    });
    pm.test("List is in Board myBoard", function () {
        pm.expect(response.idBoard).to.eql(pm.environment.get("myBoard_id"));
    });
  • 說明:
    • 因為沒有提供刪除清單的 API,因此只進行封存清單
    • 因為是「封存」清單,所以使用 PUT(修改)
    • 因為是封存「清單」、所以 Path 為 lists,以清單 id 為標的,附加封存行為 closed。我們將直接帶入環境變數 DONE_id
    • 因為 Trello 將清單的封存狀態(封存/解封)整合為一個 API,所以 Query 需要指定目標的封存狀態
    • 因為行為需要授權,所以 Query 須包含 key 跟 token

刪除看板(Board) myBoard

在 Postman 中

  • 方法:DEL
  • 目標:
  • 測試:
    // Parse Json
    let response = pm.response.json();
    
    // Confirm Result
    pm.test("Status code is 200", function () {
        pm.response.to.have.status(200);
    });
    pm.test("Value is null", function () {
        pm.expect(response._value).is.null;
    });
  • 說明:
    • 因為是「刪除」看板,所以使用 DEL(刪除)
    • 因為是刪除「看板」、所以 Path 為 boards,以看板 id 為標的。我們將直接帶入環境變數 myBoard_id
    • 因為行為需要授權,所以 Query 須包含 key 跟 token

確認看板(Board) myBoard 不存在

在 Postman 中

  • 方法:GET
  • 目標:
  • 測試:
    // Confirm Result
    pm.test("Status code is 404", function () {
        pm.response.to.have.status(404);
    });
  • 說明:
    • 因為是「確認」看板,所以使用 GET(取得)
    • 因為是確認「看板」、所以 Path 為 boards,以看板 id 為標的。我們將直接帶入環境變數 myBoard_id
    • 因為行為需要授權,所以 Query 須包含 key 跟 token

留言

這個網誌中的熱門文章

[教學] 手把手申報美國聯邦個人所得稅(file a tax return)