Postman 進階技巧

来源:https://www.cnblogs.com/abmcode/archive/2023/01/03/postman_2nd_step.html
-Advertisement-
Play Games

大多數開發者可能都用過 Postman,根據其官網的介紹:Postman 是一個用於構建和使用 API 的 API 平臺,簡化了 API 生命周期的每個步驟,提供更便捷的團隊協作,因此可以更快地創建更好的 API。這裡的 API,除了我們常用的 HTTP API 之外,還包括 Websocket(B ...


大多數開發者可能都用過 Postman,根據其官網的介紹:Postman 是一個用於構建和使用 API 的 API 平臺,簡化了 API 生命周期的每個步驟,提供更便捷的團隊協作,因此可以更快地創建更好的 API。這裡的 API,除了我們常用的 HTTP API 之外,還包括 Websocket(BETA),gRPC。本文中,我們將以最常用的 REST API 作為例子。

假設我們在開發一個類似微博的項目,你是一個後端開發人員,前端分為手機端和網頁端,而由於採用了 RAD 或者敏捷開發方法,你隨時需要將在開發環境測試好的最新的 API 改動發佈至測試環境(或 Stage 環境),併為測試人員或者前端開發人員提供最新的 API 文檔。下麵我們看看在這個過程中,Postman 能如何幫助簡化 API 聲明周期以及提供更便捷的團隊協作。

開發階段

在這個階段,不管後端使用什麼語言開發,最終開放的是 REST API 介面,在本文的示例中,我們使用 Jmix 框架開發基於服務的 REST API。Postman 的最基本用法,就是開發人員可以在這一步建立一個 API 集合(Collection),其中包含項目的所有 API,這裡我們創建了一個叫 Corp 的集合,包含所有功能的 API:

單個請求

圖中重要的三個部分:

  1. API 集合
  2. 單個 API 的請求方式(POST)和請求地址
  3. 單個 API 請求體

到這一步為止,就是 Postman 的基礎用法了,我們創建一個 API 集合,而集合是支持導出的,可以導出為 JSON 文件,再發給其他同事,他們可以導入到 Postman 裡面使用。

使用變數做第一次優化

在上面的圖中,我們展示了集合中的第一個介面 - 獲取 Jmix 本地 token。而這個 token,我們需要在以後的每個請求中都用來做用戶認證。如下圖:

請求認證

這裡有一個問題,就是 token 會過期,比如我們今天拿到的 token,可能明天就沒法再次使用了。而我們需要再次獲取 token,然後挨個複製到每個請求中嗎?這個未免太麻煩了。Postman 提供了環境變數的機制。有三種類型的變數,分別是:

  1. 全局變數(Globals):顧名思義,這裡定義的變數在所有集合的所有 API 中都可使用。
  2. 集合變數:在集合中,有一個 Variables 標簽頁,可以定義集合級別的變數,這些變數,只能用於集合內的 API。
  3. 環境變數:需要建立一個環境變數的集合,這裡面可以定義一組該環境內的變數,可以用在任何集合。後面我們會說到用法。

Postman 變數定義

我們可以聲明一個名為 jmixToken 的集合變數存儲 token,至然後在請求中使用 {{jmixToken}} 的方式引用變數即可:

token 存儲

除了 token 之外,我們在 API 中使用的相同類型的參數也都可以聲明為變數,而變數可以用在請求的任何部分。例如,我們在發新帖的 API 中使用的請求體如下,我們分別使用了 Postman 提供的隨機生成 UUID 的 $guid 變數、集合中存儲測試用戶 Id 的 userId 變數,以及存儲我們博客地址 https://blog.abmcode.comblogUrl

{
    "postId":"{{$guid}}",
    "userId":"{{userId}}",
    "content":"歡迎訪問:{{blogUrl}}"
}

使用腳本進行第二次優化

經過了上面的第一輪優化後,我們的 API 裡面會多了許多變數。但是還存在一個問題,就是我們在拿到 token 後,仍然需要手動更新一下 jmixToken 這個變數,否則各個 API 仍然使用的是過期的 token。這還是有點麻煩。

好在 Postman 提供了測試腳本的功能,可以解決這個小麻煩,我們需要在獲取 token 的請求中編寫一個測試腳本,用於更新 jmixToken,這樣我們一旦重新獲取了 token,就可以保證其他 API 使用的是最新的 token。

編寫代碼的位置如下圖所示,在 API 的 Tests 標簽頁。並且更貼心的是,Postman 在右側給了一些常用的代碼片段,點擊即可使用,例如,獲取全局變數、設置集合變數等。

測試腳本

測試腳本是 JavaScript 的,可能需要有一點 JS 基礎,具體每行的作用,請參考註釋。這裡我們對返回結果做了兩個測試,分別是驗證 HTTP 狀態碼必須是 200 以及檢測返回結果中必須包含 access_token 這個屬性。需要註意的是,這兩個測試如果有任意一個失敗,都將拋出異常直接退出 JS 的執行,此時不會走最後一句設置變數的語句:

// pm.test 表示這是一個測試。
pm.test("Set Global variable jmixToken", function () {
    // 測試 1 - 返回狀態碼為 200
    pm.response.to.have.status(200);
    // 獲取返回結果的 json
    var jsonData = pm.response.json();
    // 測試 2 - 返回的 json 中必須有 access_token 欄位
    pm.expect(jsonData).to.have.property('access_token');
    // 設置全局變數 jmixToken
    pm.globals.set("jmixToken", jsonData.access_token);
})

這裡我們還可以做一點優化,那就是針對上面代碼中的 “測試 1”,我們檢查了 HTTP 的返回狀態碼為 200,其實針對所有的請求,我們可能都需要做這個檢查,那麼如果不複製粘貼代碼,有沒有簡化的方法呢?

有的,Postman 提供了集合級別的測試腳本,定義在集合中的測試腳本,會對每個 API 都適用。比如,我們可以把驗證 HTTP 狀態碼的測試放到集合中:

集合測試腳本

小結

到這裡,我們開發階段對於請求的優化就結束了,通過使用變數,可以優化 API 中的數據,將相同的數據都定義在變數中。通過測試腳本,我們可以對 API 進行測試,也可以更新各種變數,避免手動修改的麻煩。我們的示例中演示的更新 token 是最常見的腳本功能,除此之外,比方說我們要測試的發帖和回帖功能,可以在發帖後將帖子的 ID 保存在變數中,測試回帖功能時,直接使用變數存儲的帖子 ID,這些具體的業務場景,可以根據項目靈活變化。

測試階段

開發完成後,我們就需要將 API 部署至測試或者 Stage 環境,交給測試人員或者前端開發人員進行試集成了。那麼在這個階段,你或許想在測試人員工作前自己先測試一遍,或者如果測試有問題,而你作為後臺開發人員,也難免需要直接調用測試環境的 API 觀察輸出結果。這就有了一個新的問題:我們在之前的介面定義都是 http://localhost:8080 開頭的地址,怎麼能方便地切換到測試地址呢?

答案還是用變數。但是這一次,我們使用的是環境變數集合。

例如,我們可以創建兩套環境變數,分別為 env_devenv_prod,其中都定義了變數 jmixAppUrl,在 env_dev 中,該變數的值為 http://localhost:8080,而在 env_prod 中,該變數的值為 https://your.test.env.ip:test_port,然後修改每個請求,將原本的 http://localhost:8080 地址換成變數 {{jmixAppUrl}}

環境變數集合

使用時,通過右上角的環境變數集合切換功能,就可以切換不同的環境了。

發佈文檔

如果你的測試或者前端也使用 Postman,那麼可能導出 API 集合文件再交由同事導入,可能是比較方便的方法。但其實 Postman 在文檔發佈這個功能上,也做了不少工作。

右鍵點擊集合,有一個 View documentation 菜單,或者通過下圖的按鈕也可以查看集合的文檔

集合文檔

在查看文檔時,右上角有一個 Publish 按鈕,可以將你的文檔公開發佈,並提供一個 URL 地址用於訪問。這樣的話,其他同事如果不使用 Postman,只需要訪問該地址,就可以看到 API 的文檔。

發佈文檔

在發佈時,可以選擇環境變數集合,這樣會用集合內的變數值直接替換 API 中的所有變數,這樣一來,看文檔的人不會讀到看不懂的變數。下圖是一個發佈的文檔示例,前端用戶還可以根據編程語言,選擇對應的代碼樣例:

發佈的文檔

發佈後的文檔會實時更新,也就是說,任何你在 Postman 中對集合 API 的修改都會實時同步至文檔中。比如新增或刪除某個 API、修改 API 請求體等等。

項目級別優化

其實,我們最後還做了一個項目級別的優化,這個案例可能不具有通用性,但是也可以給大家一個思路:

公共 API 抽離

由於我們的項目後臺都是基於 Jmix/CUBA 框架開發的,因此,我們做瞭如下改動:

  1. 新建 Postman 集合 - Jmix/CUBA 通用介面,其中包含了 Jmix 和 CUBA 各自獲取本地 token 的 API,以及從我們 SSO IDP 獲取 token 的 API。
  2. 新建全局變數存儲 token,全局變數有 jmixTokencubaTokenssoToken。並且在上述三個介面的測試腳本中,分別更新這三個全局變數。

這樣做的好處是,不需要在每個項目中單獨提供獲取 token 的 API,並能保證獲取的 token 全局可用。

統一添加 Authorization 請求頭

在業務 API 集合中,我們為 Collection 添加了 Pre-request Script,這個腳本會在集合內的每個請求發出前先執行。我們就是用這個腳本為請求添加請求頭,代碼很簡單,例如,對於使用 ssoTokenjmixToken 的 Jmix 項目,我們是這樣做的:

請求頭腳本

因此,對於集合內的每個請求,不需要單獨設置 Authorization 請求頭了。

統一業務 API 返回結構

最後,我們在代碼層面對每個業務 API 的返回結構做了統一,都使用這樣的返回結構:

public class RestResult<T extends Serializable> implements Serializable {
    /**
     * 業務狀態碼
     */
    private int businessCode;

    /**
     * 提示信息
     */
    private String msg;

    /**
     * 數據
     */
    private T data;
    //...
}

我們為所有的成功返回都定義了同一個 businessCode,這樣的話,在 Postman 的 Tests 腳本中,可以添加代碼直接檢查業務層面的返回結果是否成功,例如,我們定義 10000 為業務結果正確的返回值:

pm.test("Success return", function () {
    pm.response.to.have.status(200);
    pm.expect(pm.response.json().businessCode).to.eql(10000);
})

結語

本文介紹了一些使用免費 Postman 的進階技巧:變數、腳本、文檔發佈。而現在 Postman 也在往 SaaS 方向發展,推出了團隊協作功能,像文檔發佈、API 導出導入這些功能在團隊模式下用不到了,因為 API 集合可以協作完成,文檔也可以團隊內共用。Postman 作為一款 API 平臺,確實能在一定程度上提升團隊的開發效率和協作。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在軟體研發過程中,往往隨著為了快速滿足業務要求的壓力,用戶需求的變更,軟體代碼的增多,以及版本的迭代,團隊成員的變化等等因素,導致一個軟體項目隨著時間推移,欠的技術債會越積越多,用戶使用容易出錯,部署流程也變得複雜。 ...
  • 摘要:究竟什麼樣的系統算是高併發系統?今天,我們就一起解密高併發業務場景下典型的秒殺系統的架構。 本文分享自華為雲社區《【高併發】秒殺系統架構解密,不是所有的秒殺都是秒殺(升級版)!!》,作者: 冰 河。 究竟什麼樣的系統算是高併發系統?今天,我們就一起解密高併發業務場景下典型的秒殺系統的架構。 電 ...
  • 流程式控制制 用戶交互Scanner Scanner類可以實現電腦與人的交互。java.util.Scanner 是 Java5 的新特征,我們可以通過 Scanner 類來獲取用戶的輸入。 Scanner 類的 next() 與 nextLine() 方法獲取輸入的字元串,在讀取前我們一般需要 使用 ...
  • 同步和非同步 同步和非同步是指程式的執行方式。在同步執行中,程式會按順序一個接一個地執行任務,直到當前任務完成。而在非同步執行中,程式會在等待當前任務完成的同時,執行其他任務。 同步執行意味著程式會阻塞,等待任務完成,而非同步執行則意味著程式不會阻塞,可以同時執行多個任務。 同步和非同步的選擇取決於你的程式需 ...
  • 摘要 本文主要講述了一個 http request 請求從發出到收到 response 的整個生命周期,希望可以通過對整個流程的一個描述來梳理清楚五層網路協議的定義以及各層之間是如何協作的。 使用Golang發起一個HTTP請求 對於後端來說通過 http 請求來進行遠程調用是再尋常不過的事了,以 ...
  • 1. 拷貝和拷貝構造函數 拷貝和複製是一個意思,對應的英文單詞都是copy。對於電腦來說,拷貝是指用一份原有的、已經存在的數據創建出一份新的數據,最終的結果是多了一份相同的數據。例如,將 Word 文檔拷貝到U盤去複印店列印,將 D 盤的圖片拷貝到桌面以方便瀏覽,將重要的文件上傳到百度網盤以防止丟 ...
  • 家居網購項目實現013 以下皆為部分代碼,詳見 https://github.com/liyuelian/furniture_mall.git 32.功能30-會員不能登錄後臺管理 32.1需求分析/圖解 管理員admin登錄後,可以訪問所有頁面 會員登錄後,不能訪問後臺管理相關頁面,其他頁面可以訪 ...
  • 大家好,我是車轍,我的掘金小冊《SkyWalking:應用監控和鏈路跟蹤》已經上線啦,這是我的第一本電子書,歡迎大家訂閱。 整整好是9月的最後一天下午,能按耐住衝動的是少之又少,至於原因嘛你懂的。趕高鐵的準備趕高鐵,沒趕高鐵的也假裝趕高鐵。特別是開發同學,腦門上就差貼張紙條:別打擾我。 現在離跑路時 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...