天下苦 postman 久矣!
原文链接:
Scripting – Bruno Docs
Vars – Bruno Docs
Response Query – Bruno Docs
Response Object – Bruno Docs
Request Object – Bruno Docs
Sync requests – Bruno Docs
Inbuilt Libraries – Bruno Docs
External Libraries – Bruno Docs
Whitelisting Modules – Bruno Docs
脚本
Bruno 提供脚本支持,以帮助您向工具添加其他功能,例如数据生成、验证以及与其他工具和系统集成,包括发送中间请求、解析响应数据、更新环境变量等。
Vars(变量)
Vars 可以让您在请求之前和响应之后设置变量。
Var 的范围限定在请求内,不能在请求外部访问。
注意:在 v1.20.0 之前,请求变量可以在集合范围内访问,但现在情况已不再如此。
在 Pre Request Variables 部分中,您可以编写任何字符串、数字或任何有效的 JavaScript 文本。
在 Post Response Variables 部分中,您可以编写任何有效的 JavaScript 表达式。res 对象可用,允许您以声明方式解析 response 并设置变量,而不是编写脚本来执行相同的操作。
要解析响应,您可以查看 response query,它允许您轻松查询响应。
示例:
响应查询
可以如下调用来查询
变量、 断言、 脚本 和 测试 上下文中可用的 res 对象的数据。
把它想象成激素上的 lodash.get()
res('order.total')
示例
const data = {
customer: {
address: {
city: "bangalore"
},
orders: [
{
id: "order-1",
items: [
{ id: 1, amount: 10 },
{ id: 2, amount: 20 }
]
},
{
id: "order-2",
items: [
{ id: 3, amount: 30 },
{ id: 4, amount: 40 }
]
}
]
},
};
| 查询 | 输出 |
|---|---|
| res("customer.address.city") | bangalore |
| res("customer.orders.items.amount") | [10, 20, 30, 40] |
| res(""customer.orders.items.amount[0]") | 10 |
| res("..items.amount") | [10, 20, 30, 40] |
| res("..amount") | [10, 20, 30, 40] |
| res("..items.amount[0]") | 10 |
| res("..items[0].amount") | 10 |
| res("..items[5].amount") | undefined |
| res("..id") | ["order-1", 1, 2, "order-2", 3, 4] |
| res("customer.orders.foo") | undefined |
| res("..customer.foo") | undefined |
| res("..address") | [{ city: "bangalore" }] |
| res("..address[0]") | { city: "bangalore" } |
API
标准 点 表示法
示例:
res('customer.orders.items.amount')
深度导航..双点
示例:
res('..items.amount')
数组索引
示例:
res('..items[0].amount')
数组过滤 [?] 和相应的过滤函数
示例:
res('..items[?].amount', i => i.amount > 20)
数组映射 [?] 与相应的映射器函数
示例:
res('..items..amount[?]', amt => amt + 10)
响应对象
变量、 断言、 脚本 和 测试 上下文中可用的 res 对象可用于从响应正文、标头和状态中提取值。
请注意,res 对象仅在请求的上下文中可用。
您也可以使用 响应查询 来访问它。
对象结构
res 对象具有以下属性:
body:表示包含返回给客户端的数据的响应正文。headers:包含表示与响应关联的 HTTP 标头的键值对。status:表示指示请求结果的 HTTP 状态代码。
属性说明
body
res 对象的 body 属性包含发送到客户端的响应数据。它可以是字符串、对象或流,具体取决于应用进程的需要。
headers
headers 属性包含与响应关联的 HTTP 标头。这些标头提供有关响应的元数据,例如内容类型、编码和缓存指令。
status
status 属性表示响应的 HTTP 状态代码。它指示请求的结果,例如成功、重定向、客户端错误或服务器错误。
示例用法
// Example response object
const res = {
body: '{"message": "Hello, world!"}',
headers: {
'Content-Type': 'application/json',
'Cache-Control': 'no-cache',
},
status: 200,
};
// Accessing response properties
console.log(res.body); // Output: '{"message": "Hello, world!"}'
console.log(res.headers['Content-Type']); // Output: 'application/json'
console.log(res.status); // Output: 200
请求对象
req 对象表示向服务器发出的 HTTP 请求。它包含定义请求详细信息的各种属性。
req 子对象
req 子对象包含有关请求的详细信息。
assertions:一个数组,其中包含与请求关联的任何断言。参见 断言。auth:包含身份验证凭证 (如用户名和密码) 的对象。headers:一个子对象,表示与请求关联的 HTTP 标头。method:用于请求的 HTTP 方法(例如,GET、POST)。mode:请求的模式(例如,none、cors)。responseType:请求的预期响应类型(例如,text、json)。script:包含请求的脚本相关信息的对象。signal:用于中止请求的 signal 对象。url:请求的 URL。vars:包含与请求关联的任何变量的对象。参见 变量。
头部
req 对象的 headers 子对象包含表示与请求关联的 HTTP 标头的键值对。
// Example usage
console.log(req.headers);
/* Output: {
authorization: 'Bearer <token>',
'content-type': 'application/json',
accept: 'application/json',
// Add more headers as needed...
} */
方法
req 对象的 method 属性指定用于请求的 HTTP 方法。常见的 HTTP 方法包括 GET、POST、PUT、DELETE 等。该方法指示请求希望对资源执行的操作类型。method 属性的值应为表示请求所需的 HTTP 方法的字符串。
// Example usage
console.log(req.method); // Output: "GET"
URL
req 对象的 url 属性表示请求的统一资源定位符 (URL)。它指定客户端请求的资源的地址。用双大括号括起来的变量 ('{{...}}') 是占位符,可以在运行时替换为实际值。这些变量在 URL 字符串中不直接可见,通常在请求处理期间封装。
// Example usage
console.log(req.url); // Output: "{{base.url}}/users/2?queryTest=queryResult"
示例用法
// Example request object
const req = {
assertions: [],
auth: { username: 'myUsername', password: 'mySuperPassword' },
headers: {
authorization: 'Bearer <token>',
'content-type': 'application/json',
accept: 'application/json',
// Add more headers as needed...
},
method: 'GET',
mode: 'none',
responseType: 'arraybuffer',
script: {
req: "// Create an array of objects\nconst data = [\n { i…q);\nconst myVariable = bru.getEnvVar('password');"
},
signal: {},
url: '{{base.url}}/users/2?queryTest=queryResult',
vars: {}
};
// Accessing request properties
console.log(req.method); // Output: "GET"
console.log(req.url); // Output: "{{base.url}}/users/2?queryTest=queryResult"
console.log(req.headers.authorization); // Output: "Bearer <token>"
console.log(req.auth.username); // Output: "myUsername"
同步请求
您可以在 pre/post 脚本中发出同步请求。同步是指您可以在脚本代码中等待请求。
下面是一个使用 axios 库的内置示例。
const axios = require("axios");
const response = await axios.get("https://api.github.com/users/usebruno");
bru.setVar("avatarUrl", response.data.avatar_url);
示例:
内置库
Bruno 支持 CommonJS 语法 (
require) 来导入库。ES 模块(import/export)目前不受支持。
以下是您可以在脚本中 require 的内置库列表。
- ajv(opens in a new tab) - Ajv JSON 架构验证器
- axios(opens in a new tab) - 用于浏览器和 node.js 的基于 Promise 的 HTTP 客户端
- node-fetch(opens in a new tab) - 一个轻量级的模块,将 Fetch API 引入Node.js。
- atob(opens in a new tab) - 将 base64 编码的 ASCII 数据转换回二进制。
- btoa(opens in a new tab) - 将二进制数据转换为 base64 编码的 ascii。
- chai(opens in a new tab) - 用于 node.js 和浏览器的 BDD/TDD 断言库。
- lodash(opens in a new tab) - 一个现代化的JavaScript实用库,提供模块化、性能和额外功能。
- moment(opens in a new tab) - 在 JavaScript 中解析、验证、操作和显示日期和时间。
- uuid(opens in a new tab) - 用于创建RFC4122 UUID
- nanoid(opens in a new tab) - 一个用于 JavaScript 的小型、安全、URL 友好、唯一的字符串 ID 生成器。
- crypto-js(opens in a new tab) - 加密标准的 JavaScript 库。
注:
node-fetch在安全模式下不再可用。
示例:
const { nanoid } = require("nanoid");
req.setHeader("transaction-id", nanoid());
外部库
Bruno 支持加载任何 npm 模块以用于您的脚本工作流程。
您需要添加一个 package.json 文档来存储您的收藏。
{
"name": "github-rest-api-collection",
"version": "1.0.0",
"main": "index.js",
"homepage": "https://github.com/usebruno/github-rest-api-collection#readme",
"dependencies": {
"@faker-js/faker": "8.3.1"
}
}
然后在你的集合文件夹中运行 npm install
npm install
然后,您可以像往常一样在脚本中 require node 模块。示例:
const { faker } = require('@faker-js/faker');
const randomName = faker.name.fullName();
const randomEmail = faker.internet.email();
req.setBody({
name: randomName,
email: randomEmail
});
将模块列入白名单
出于安全原因,并非所有内置模块都可以在 Bruno 中开箱即用的脚本中访问。您可以通过修改 bruno.json 来手动启用/白名单这些模块。
示例:
要启用 child_process 模块,你可以在 bruno.json 文档中放入以下内容:
{
"scripts": {
"moduleWhitelist": ["child_process"],
"filesystemAccess": {
"allow": true
}
}
}
注意,child_process 需要 filesystemAccess 才能按预期工作。其他内置模块也可能需要这样做
JavaScript API 参照
[译]Bruno - 自由强大安全开源的 API 测试神器(文本管理/git友好/离线优先)- 脚本 - JavaScript API 参照 - 掘金