文章目錄
- 引言
- 建議目錄結構
- 新建請求
- 不同環境的變量配置
- 添加環境
- http-client.env.json
- http-client.private.env.json
- 引用變量
- 請求示例
- Get請求示例
- Post請求示例
- 鑒權示例
- 斷言示例
- Websocket請求示例
- 內置對象和動態變量
- 內置對象:
- 內置變量:
引言
在日常的 Web 服務開發和調試中,我們經常需要對接口進行調用和測試。無論是在與團隊內部協作開發時,還是在與第三方系統進行接口聯調時,接口調用是不可或缺的一環。而在這個過程中,許多開發者會首選一款功能強大且易用的工具,其中最常見的就是 Postman
—— 這是一款備受歡迎的接口調試工具,擁有豐富的功能和用戶友好的界面。
然而,隨著開發工具的不斷演進,一些集成開發環境(IDE)也提供了強大的工具來簡化和優化接口調用的過程。其中,IntelliJ IDEA
作為一款廣泛使用的 Java 開發工具,自帶了一個強大的 HTTP Client 接口調用插件,為開發者提供了一種替代 Postman
的選擇。
建議目錄結構
srcmaintest http├── AXXX.http # 調用A接口的文件├── BXXX.http # 調用B接口的文件├── http-client.env.json # 通用配置(接口地址等)├── http-client.private.env.json # 私有配置(密碼、Token等)
新建請求
- 入口一:工具欄(idea頂上的一行工具里面)->Tools->HTTP Client。創建的是臨時文件,不跟項目關聯。
- 入口二:點擊接口旁邊的這個圖標,可以自動生成接口的url請求。創建的是臨時文件,不跟項目關聯。
- 入口三:通過
cURL
創建請求,在xxx.http文件上,點擊右上角的Convert form cURL
按鈕,然后輸入 cURL 地址即可自動轉換。
- 入口四:可以在項目中測試目錄(或者其他目錄)下建一個
http
目錄,右擊New->HTTP Request,輸入文件名稱(.http結尾)即可創建。建議用這個,跟項目關聯
從http請求跳轉到接口層的代碼
光標放在url上面,然后 Ctrl + 鼠標左鍵
可以打開,可以從http請求跳轉到接口層的代碼。
請求結果
所有的請求結果,請求歷史記錄,cookies等信息會存放在 .idea
文件夾下,如下:
不同環境的變量配置
在 Spring Boot 項目中,我們通常使用 Profile 機制來實現在不同環境中應用不同的配置文件。類似地,在 IntelliJ IDEA 中使用 HTTP Client 插件時,我們也可以借助類似的機制,以便在不同環境下輕松管理和切換配置。
首先,我們可以創建一個名為 http-client.env.json
的配置文件,用于定義通用變量,例如 URL 地址、端口號等。這樣一來,我們可以通過在不同環境中使用不同的配置文件,輕松地適應不同的場景需求。
// http-client.env.json
{"url": "https://api.example.com","port": 8080,"commonHeader": "application/json"
}
其次,為了安全起見,我們還可以創建一個名為 http-client.private.env.json
的配置文件,專門用于存儲敏感變量,例如用戶名/密碼、訪問令牌等。請注意,由于這些信息屬于敏感數據,我們強烈建議不要將 http-client.private.env.json
提交到 Git 倉庫中,以免泄露敏感信息。
// http-client.private.env.json
{"username": "your_username","password": "your_password","token": "your_access_token"
}
最后,需要強調的是,確保將 http-client.private.env.json
添加到項目的 .gitignore
文件中,以防止不小心將敏感信息提交到版本控制系統中。
添加環境
可以設置不同環境的變量,比如dev、test、prod等。
http-client.env.json
{"dev": {"host": "localhost","port": 8080,"domain": "localhost:8080","cookie" : "cookieDev"},"test": {"host": "baidu.test.com","port": 8080,"domain": "baidu.test.com","cookie" : "cookieSit"},"prod": {"host": "baidu.com","port": 8080,"domain": "baidu.com","cookie" : "cookieDevProd"}
}
http-client.private.env.json
{"dev": {"username": "","password": ""},"test": {"username": "","password": ""},"prod": {"username": "","password": ""}
}
引用變量
要引用這些定義變量,只需要使用{{}} 這個符號即可。比如引用domain ,可以用 {{domain}}。
引用的環境變量如下:
POST http://{{domain}}/dangerWork/query
Content-Type: application/json
Cookie:{{cookie}}{"xxx": "xxx"
}
運行時,自行選擇運行環境。
請求示例
Get請求示例
### 帶有頭部的 GET 請求
GET https://httpbin.org/ip
Accept: application/json### 帶有參數的 GET 請求
GET https://httpbin.org/get?show_env=1
Accept: application/json### 使用環境變量的 GET 請求
GET {{host}}/get?show_env={{show_env}}
Accept: application/json### 禁用重定向的 GET 請求
# @no-redirect
GET http://httpbin.org/status/301### 帶有動態變量的 GET 請求
GET http://httpbin.org/anything?id={{$uuid}}&ts={{$timestamp}}### 禁止將請求保存到請求歷史記錄
// @no-log
GET example.com/api### 禁止將收到的 cookie 保存到 cookie jar
// @no-cookie-jar
GET example.com/api###
Post請求示例
### 第一行:POST請求,請求地址
### 第二 三行:請求頭信息,多個請求頭信息依次寫下去(第三行、第四行……)
### 第N行:寫具體的請求體,這里是JSON串,請求頭和請求體之間要空出一行
### 多個請求間用 ### 分割
### 可以用 ptr 快捷提示 form表單是 ptrp### 發送帶有 JSON 主體的 POST 請求
POST https://httpbin.org/post
Content-Type: application/json{"id": 999,"value": "content"
}### 發送將主體作為參數的 POST 請求
POST https://httpbin.org/post
Content-Type: application/x-www-form-urlencodedid=999&value=content### 發送包含文本和文件字段的表單
POST https://httpbin.org/post
Content-Type: multipart/form-data; boundary=WebAppBoundary--WebAppBoundary
Content-Disposition: form-data; name="element-name"
Content-Type: text/plainName
--WebAppBoundary
Content-Disposition: form-data; name="data"; filename="data.json"
Content-Type: application/json< ./request-form-data.json
--WebAppBoundary--### 發送帶有請求主體中動態變量的請求
POST https://httpbin.org/post
Content-Type: application/json{"id": {{$uuid}},"price": {{$randomInt}},"ts": {{$timestamp}},"value": "content"
}###
鑒權示例
### 基本授權。
GET https://httpbin.org/basic-auth/user/passwd
Authorization: Basic user passwd### 帶有變量的基本授權。
GET https://httpbin.org/basic-auth/user/passwd
Authorization: Basic {{username}} {{password}}### 摘要授權。
GET https://httpbin.org/digest-auth/realm/user/passwd
Authorization: Digest user passwd### 帶有變量的摘要授權。
GET https://httpbin.org/digest-auth/realm/user/passwd
Authorization: Digest {{username}} {{password}}### 令牌授權,第 1 部分。檢索并保存令牌。
POST https://httpbin.org/post
Content-Type: application/json{"token": "my-secret-token"
}> {% client.global.set("auth_token", response.body.json.token); %}### 令牌授權,第 2 部分。使用令牌進行授權。
GET https://httpbin.org/headers
Authorization: Bearer {{auth_token}}###
斷言示例
### 成功的測試:檢查響應狀態是否為 200
GET https://httpbin.org/status/200> {%
client.test("請求成功執行", function() {client.assert(response.status === 200, "響應狀態不是 200");
});
%}### 失敗的測試:檢查響應狀態是否為 200
GET https://httpbin.org/status/404> {%
client.test("請求成功執行", function() {client.assert(response.status === 200, "響應狀態不是 200");
});
%}### 檢查響應狀態和內容類型
GET https://httpbin.org/get> {%
client.test("請求成功執行", function() {client.assert(response.status === 200, "響應狀態不是 200");
});client.test("響應內容類型為 JSON", function() {var type = response.contentType.mimeType;client.assert(type === "application/json", "期望 'application/json',但收到 '" + type + "'");
});
%}### 檢查響應主體
GET https://httpbin.org/get> {%
client.test("存在 Headers 選項", function() {client.assert(response.body.hasOwnProperty("headers"), "在響應中找不到 'headers' 選項");
});
%}###
Websocket請求示例
### 簡單的 WebSocket 請求
// 可以直接從 Services 工具窗口向服務器發送消息
WEBSOCKET ws://{{$exampleServer}}/ws### 帶有客戶端消息的請求
// 可以在請求體中指定客戶端消息。使用 '===' 來分隔消息。
// 在消息上方添加 '=== wait-for-server',以在收到服務器響應后發送消息。
// 要等待 N 個響應,請添加 '=== wait-for-server' N 次。
WEBSOCKET ws://{{$exampleServer}}/ws
Content-Type: application/json // 我們使用它進行突出顯示===
{"message": "你好,服務器!","repeat": 3
}
=== wait-for-server
=== wait-for-server
{"message": "我們發送這條消息...","repeat": 0
}
===
{"message": "和這條消息一起","repeat": 1
}### 帶有腳本的請求
// 此外,我們還可以使用腳本向服務器發送消息并驗證服務器的消息。
WEBSOCKET ws://{{$exampleServer}}/ws
Content-Type: application/json{"message": "開始的消息"
}> {%var i = 0response.body.onEachMessage((message, unsubscribe, output) => {i++const jsonMessage = JSON.parse(message); // 我們知道我們的示例服務器返回 JSONclient.test("服務器發送了一個帶有 'message' 屬性的 JSON:" + i , () => {client.assert(jsonMessage.message !== undefined)});if (jsonMessage.message.includes("finish")) {unsubscribe() // 移除當前的監聽器return}if (i === 5) {output(JSON.stringify({message: "finish"}));} else {output(JSON.stringify({message: "腳本發送的消息:" + i}));}}, () => {client.log("我們停止了從當前 'onEachMessage' 調用中的 WebSocket 監聽!")});%}
內置對象和動態變量
IntelliJ IDEA 的 HTTP Client 插件內置了一些對象和變量,以便在請求和腳本中執行動態操作。以下是一些常見的內置對象和變量:
內置對象:
每個請求變量
< {%request.variables.set("firstname", "John")
%}
GET http://example.org/{{firstname}}
全局請求變量
GET https://httpbin.org/get> {%client.global.set("my_cookie", response.headers.valuesOf("Set-Cookie")[0]);
%}
request
對象client
對象crypto
對象
內置變量:
動態變量在每次運行請求時生成一個值。它們的名稱以 $ 開頭:
$uuid
或$random.uuid
:生成一個通用唯一標識符(UUID-v4)。$timestamp
:生成當前的UNIX時間戳。$isoTimestamp
:生成UTC時區的當前時間戳,以ISO-8601格式表示。$randomInt
:生成介于0和1000之間的隨機整數。$random.integer(from, to)
:生成介于from(包括)和to(不包括)之間的隨機整數,例如random.integer(100, 500)
。如果不提供參數,它將生成介于0和1000之間的隨機整數。$random.float(from, to)
:生成介于from(包括)和to(不包括)之間的隨機浮點數,例如random.float(10.5, 20.3)
。如果不提供參數,它將生成介于0和1000之間的隨機浮點數。$random.alphabetic(length)
:生成長度為 length(必須大于0)的大寫和小寫字母序列。$random.alphanumeric(length)
:生成長度為 length(必須大于0)的大寫和小寫字母、數字和下劃線序列。$random.hexadecimal(length)
:生成長度為 length(必須大于0)的隨機十六進制字符串。$random.email
:生成一個隨機電子郵件地址。$exampleServer
:被替換為IntelliJ IDEA內置的Web服務器,僅可通過HTTP Client訪問。此變量用于GraphQL和WebSocket示例中。
例如:
GET http://localhost/api/get?id={{$uuid}}
這些變量和對象允許你在請求執行期間執行條件檢查、日志記錄和動態操作。