[译]Bruno - 自由强大安全开源的 API 测试神器(文本管理/git友好/离线优先)- 脚本

761 阅读6分钟

天下苦 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 提供脚本支持,以帮助您向工具添加其他功能,例如数据生成、验证以及与其他工具和系统集成,包括发送中间请求、解析响应数据、更新环境变量等。

bru lang sample

Vars(变量)

Vars 可以让您在请求之前和响应之后设置变量。

Var 的范围限定在请求内,不能在请求外部访问。

注意:在 v1.20.0 之前,请求变量可以在集合范围内访问,但现在情况已不再如此。

Pre Request Variables 部分中,您可以编写任何字符串、数字或任何有效的 JavaScript 文本。

Post Response Variables 部分中,您可以编写任何有效的 JavaScript 表达式。res 对象可用,允许您以声明方式解析 response 并设置变量,而不是编写脚本来执行相同的操作。

要解析响应,您可以查看 response query,它允许您轻松查询响应。

示例:
bru vars

屏幕截图显示了如何在请求正文中使用定义的变量

响应查询

可以如下调用来查询 变量、 断言、 脚本 和 测试 上下文中可用的 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 方法(例如,GETPOST)。
  • mode :请求的模式(例如,nonecors)。
  • responseType :请求的预期响应类型(例如,textjson)。
  • 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 方法包括 GETPOSTPUTDELETE 等。该方法指示请求希望对资源执行的操作类型。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);

示例:
sync requests

内置库

Bruno 支持 CommonJS 语法 (require) 来导入库。ES 模块 (import/export) 目前不受支持。

以下是您可以在脚本中 require 的内置库列表。

注:  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 参照 - 掘金