IDEA之HTTP Client使用教程
介紹
IDEA RESTful WebServices是一個類似jmeter,postman的工具。可以使用純文本編輯。
官網介紹地址: https://www.jetbrains.com/help/idea/restful-webservices.html
該工具是idea的一個組件,在Tools->Http client
下;當然goland也是相同;低版本是Test Restful WebService
,新版本的idea已經提示改功能廢棄,建議使用new HTTP Client
也就是我們此教程要介紹的工具;
示例:
創建demo1.http
文件
GET https://www.baidu.com
###
點擊右側運行即可查看到結果
HTTP請求中使用變量
要在請求中提供變量,請將其括在雙花括號中,如 {{variable}} 。變量名稱只能包含字母,數字,下 劃線符號 _ 或連字符 - 。
預定義的動態變量
每次您運行請求時,動態變量都會生成一個值: $uuid :生成通用的唯一標識符(UUID-v4) $timestamp :生成當前的UNIX時間戳 $randomInt :生成介於0到1000之間的隨機整數。
GET http://localhost/api/get?id={{$uuid}}
創建環境變量
在項目內部,創建以下文件:
- 在rest-client.env.json(或http-client.env.json)是包含常見的變量,其目的是要與你的項目一起 分發的常規文件。
- 在rest-client.private.env.json(或http-client.private.env.json)是一個 私人 的文件可能包括密 碼,令牌,證書和其他敏感信息。默認情況下,此文件被添加到VCS忽略文件列表中。在httpclient.private.env.json文件中指定的變量的值將覆蓋環境文件中的值。
{
"dev": {
"host": "http://127.0.0.1:80",
"name": "zhangsan"
},
"prod": {
"host": "http://127.0.0.1:80",
"name":"lisi"
}
}
調用示例
GET http://{{host}}/api/get?name={{name}}
腳本設置環境變量
//設置環境變量
> {%
client.global.set("token", response.body.token);
%}
腳本檢測
可以對返回值進行打印,斷言;
# 登陸
POST http://{{host}}/system/login
Content-Type: application/x-www-form-urlencoded
username=admin&password=123456
> {%
client.log(JSON.stringify(response.body));
client.test("Request executed successfully", function() {
client.assert(response.status === 200, "Response status is not 200");
});
client.test("Response content-type is json", function() {
var type = response.contentType.mimeType;
client.assert(type === "application/json", "Expected 'application/json' but received '" + type + "'");
});
client.test("Request code success", function() {
client.assert(response.body.code === 0, "Response code is not 0");
client.global.set("token", response.body.data);
});
%}
###
類型介紹
-
client
- client.global
- set(varName, varValue) // 設置全局變量
- get(varName) // 獲取全局變量
- isEmpty // 檢查 global 是否爲空
- clear(varName) // 刪除變量
- clearAll // 刪除所有變量
- client.test(testName, func) // 創建一個名稱爲
testName
的測試 - client.assert(condition, message) // 校驗條件
condition
是否成立,否則拋出異常message
- client.log(text) // 打印日誌
- client.global
-
response
- response.body // 字符串 或 JSON (如果
content-type
爲application/json
.) - response.headers
- valueOf(headerName) // 返回第一個匹配 headerName 的值,如果沒有匹配的返回 null
- valuesOf(headerName) // 返回所有匹配 headerName 的值的數組,如果沒有匹配的返回空數組
- response.status // Http 狀態碼,如: 200 / 400
- response.contentType
- mimeType // 返回 MIME 類型,如:
text/plain
,text/xml
,application/json
. - charset // 返回編碼 UTF-8 等
- mimeType // 返回 MIME 類型,如:
- response.body // 字符串 或 JSON (如果
示例
test.http
###
# GET請求
GET http://{{host}}/api/get?name={{name}}
###
# POST請求
POST http://{{host}}/api/post/kv
Content-Type: application/x-www-form-urlencoded
name=zhangsan&age=11
###
# POST請求
POST http://{{host}}/api/post/json
Content-Type: application/json
referer: https://goframe.org/
cookie: name=zhangsan; age=11
{"name":"zhangsan","age":11}
###
test2.http
###
# 未登錄
POST http://{{host}}/system/user/info
> {%
client.log(JSON.stringify(response.body));
client.test("Request executed successfully", function() {
client.assert(response.status === 404, "Response status is not 200");
});
client.test("Response content-type is json", function() {
var type = response.contentType.mimeType;
client.assert(type === "application/json", "Expected 'application/json' but received '" + type + "'");
});
client.test("Request code fail", function() {
client.assert(response.body.code === -1, "Response code is not -1");
});
%}
###
# 登陸
POST http://{{host}}/system/login
Content-Type: application/x-www-form-urlencoded
username=admin&password=123456
> {%
client.log(JSON.stringify(response.body));
client.test("Request executed successfully", function() {
client.assert(response.status === 200, "Response status is not 200");
});
client.test("Response content-type is json", function() {
var type = response.contentType.mimeType;
client.assert(type === "application/json", "Expected 'application/json' but received '" + type + "'");
});
client.test("Request code success", function() {
client.assert(response.body.code === 0, "Response code is not 0");
client.global.set("token", response.body.data);
});
%}
###
# 登陸後訪問用戶信息
POST http://{{host}}/system/user/info
token: {{token}}
> {%
client.log(JSON.stringify(response.body));
client.test("Request executed successfully", function() {
client.assert(response.status === 200, "Response status is not 200");
});
client.test("Response content-type is json", function() {
var type = response.contentType.mimeType;
client.assert(type === "application/json", "Expected 'application/json' but received '" + type + "'");
});
client.test("Request code success", function() {
client.assert(response.body.code === 0, "Response code is not 0");
});
%}
###
# 登陸後訪問用戶年齡
POST http://{{host}}/system/user/age
token: {{token}}
> {%
client.log(JSON.stringify(response.body));
client.test("Request executed successfully", function() {
client.assert(response.status === 200, "Response status is not 200");
});
client.test("Response content-type is json", function() {
var type = response.contentType.mimeType;
client.assert(type === "application/json", "Expected 'application/json' but received '" + type + "'");
});
client.test("Request code success", function() {
client.assert(response.body.code === 0, "Response code is not 0");
});
%}
###
http-client.env.json
{
"dev": {
"host": "http://127.0.0.1:80",
"name": "zhangsan"
},
"prod": {
"host": "http://127.0.0.1:80",
"name":"lisi"
}
}
main.go
package main
import (
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/net/ghttp"
"github.com/gogf/gf/util/guuid"
)
var token string
func main() {
s := g.Server()
group := s.Group("/api")
// 默認路徑
// GET帶參數
group.GET("/get", func(r *ghttp.Request) {
r.Response.Writeln("Hello World!")
r.Response.Writeln("name:", r.GetString("name"))
})
// POST KV
group.POST("/post/kv", func(r *ghttp.Request) {
r.Response.Writeln("func:test")
r.Response.Writeln("name:", r.GetString("name"))
r.Response.Writeln("age:", r.GetInt("age"))
})
// POST JSON
group.POST("/post/json", func(r *ghttp.Request) {
r.Response.Writeln("func:test2")
r.Response.Writeln("name:", r.GetString("name"))
r.Response.Writeln("age:", r.GetString("age"))
h := r.Header
r.Response.Writeln("referer:", h.Get("referer"))
r.Response.Writeln("cookie:", h.Get("cookie"))
r.Response.Writeln(r.Cookie.Map())
})
// 模擬登陸
system := s.Group("/system")
// 登陸接口
system.POST("/login", func(r *ghttp.Request) {
if "admin" == r.GetString("username") &&
"123456" == r.GetString("password") {
token = guuid.New().String()
r.Response.WriteJson(g.Map{
"code": 0,
"data": token,
})
r.Exit()
}
r.Response.WriteJson(g.Map{
"code": -1,
"data": "",
})
})
// 獲取用戶信息
system.POST("/user/info", func(r *ghttp.Request) {
if token != r.Header.Get("token") || token == "" {
r.Response.WriteJson(g.Map{
"code": -1,
"data": "",
})
r.Exit()
}
// 返回用戶信息
r.Response.WriteJson(g.Map{
"code": 0,
"data": "zhangsan",
})
})
// 獲取用戶年齡
system.POST("/user/age", func(r *ghttp.Request) {
if token != r.Header.Get("token") || token == "" {
r.Response.WriteJson(g.Map{
"code": -1,
"data": "",
})
r.Exit()
}
// 返回用戶信息
r.Response.WriteJson(g.Map{
"code": 0,
"data": 11,
})
})
s.SetPort(80)
s.Run()
}
代碼地址
教程視頻
- bilibili教程地址:https://www.bilibili.com/video/BV12V411f7ab/
- 公衆號搜索:GoWeb學習之路