postman变量和脚本功能介绍

1、基本概念——global、collection、environment

在postman中,为了更好的管理各类变量、测试环境以及脚本等,创建了一些概念,包括:globals、collection、environment。其实在postman中,最上层还有一个Workspaces的概念,不过大多数情况我们都使用一个workspace,这里就不多介绍了。

1.1)请求组(collection):

可以将多个请求保存到一个请求组(Collections)中, 好处是: 增加额外Collection变量作用域, 增加公共的PreRequest和Test脚本, 批量执行Collection下的请求, 定义Collection内请求的顺序。

上图中可以看到,左上角“+”可以创建新的collection;点击collection的右侧“。。。”可以Edit现有collection,以及Run、Add folder等功能。

说明Collection下还可以建文件夹,对请求进一步划分,比如:用户模块、订单模块。

1.2)环境(environment):

通常一个系统具备多个环境,比如:测试、线上。

如上图,点击左上角“+”可以新建一个environment;鼠标指向现有environment,点击右侧“。。。”可以进行编辑。值得提醒的是,当运行时,需要在右上角选中我们想要的环境。

变量有两个value(不光是环境变量,其他变量也是一样的),二者的区别:

  • INITAL_VALUE:初始值是在定义变量的元素(集合、环境或全局变量)中设置的值。此值将同步到 Postman 的服务器,并在您共享该元素时与您的团队共享
  • CURRENT_VALUE:这些是本地值,不会同步到 Postman 的服务器。如果您更改当前值,它将不会保留在原始共享集合、环境或全局变量中。

1.3)golbal:

细心的朋友已经发现,在environment中,左上角出现了Golbals:

2、变量

变量,在postman中最常见的一个功能,包括设置、读取、作用域等。

2.1)变量作用域:

postman中变量有多个作用域, 越往内的作用域优先级越高(global < collection < environment < …), 举例来说, 如果global作用域和Environment作用域里都有一个变量叫username, 那么最终使用的是Environment作用域里的变量值。

 

 不同作用域变量设置方法:

2.2)定义、使用变量

从上面图可以看到,在UI界面上可以管理globals变量,后面也会降到使用API方式设置、读取globes变量(会同步出现在UI界面上);同样的,对于environment变量也是一样的。(如上面1.2和1.3)

1)通过界面定义变量:

选中某个值,然后点击弹出的菜单点击"Set as new variable":

 

然后这只变量名、和作用域:

 

2)管理Collections变量:

选择某个Collection后,点击右侧的“。。。”,然后选择Edit,在右侧界面上会显示Variables。

3)使用变量:

在不同作用域定义好变量后, 然后在某个请求中引用该变量, 从而做到变量复用和统一管理。

 使用"{{变量名}}"来引用变量。

2.3)在脚本中操作变量

// 不同作用域设置变量
pm.globals.set("username", "golbals_name");
pm.globals.set("username1", "golbals_name1");
pm.collectionVariables.set("username", "collection_name");
pm.environment.set("username", "environment_name");
pm.variables.set("username", "variable_username"); //临时覆盖, 优先级最高, 请求结束后失效// 获取变量值
console.log(pm.globals.get("username")); //从globals作用域中查询变量
console.log(pm.collectionVariables.get("username"));
console.log(pm.environment.get("username"));
var k = pm.variables.get("username1"); //依次从各个作用域查找
console.log("username:" + k);// 判断
pm.variables.has("username");
pm.environment.has("username");
pm.globals.has("username");// 清理
pm.environment.unset("username");

2.4)data作用域的变量

在UI界面上,选择Collection的Run,在界面中可以选择一个文件

 

然后准备一个文件,内容如下:(必须是json或者csv格式)

[{"path": "post","value": "1"
}, {"path": "post","value": "2"
}, {"path": "post","value": "3"
}, {"path": "post","value": "4"
}]

另外,在脚本里访问data文件可以使用如下AIP:

pm.iterationData.get("value");

3、脚本

postman API文档:Home - Postman Documentation

3.1)脚本相关概念:

1)脚本执行顺序:

执行每个请求时会依次执行如下脚本:

  1. Collection级别的pre-request脚本
  2. Folder级别的pre-request脚本
  3. Request级别的pre-prequest脚本
  4. Request级别的test脚本
  5. Folder级别的test脚本
  6. Collection级别的test脚本

 

2)在界面上输入脚本信息: 

最常见的就是request级别的脚本,可以在Scripts页签下输入,如下:

可以看到,脚本分两个:pre-request和post-reponse,分别对应请求前处理和请求后处理。

在Collection级别上也可以创建脚本,如下:

同样,如果在Collection下有folder,那么folder上也可以创建scripts。 

3.2)常用脚本代码

1)操作变量:

// 设置全局变量
pm.globals.set('variable_key', 'variable_value');
var variable_key = pm.globals.get('variable_key');// 获取全局变量
pm.globals.unset('variable_key');// unset 全局变量// 设置环境变量
pm.environment.set('variable_key', 'variable_value');
var variable_key = pm.environment.get('variable_key');// 获取环境变量
pm.environment.unset('variable_key');// unset 环境变量// 设置临时变量
pm.variables.set('variable_key', 'variable_value');
var variable_key = pm.variables.get('variable_key');// 获取临时变量
pm.variables.unset('variable_key');// unset 临时变量// 将对象或数组(非字符串)写入环境变量
var array = [1, 2, 3, 4];
pm.environment.set('array', JSON.stringify(array));
var obj = { a: [1, 2, 3, 4], b: { c: 'val' } };
pm.environment.set('obj', JSON.stringify(obj));
// 转换回来
try {var array = JSON.parse(pm.environment.get('array'));var obj = JSON.parse(pm.environment.get('obj'));
} catch (e) {// 处理异常
}

2)前置读取/修改接口信息:

// ================= URL ===================
// 获取 url 对象
var urlObject = pm.request.url;// 获取完整接口请求 URL,包含 query 参数
var url = urlObj.toString();// 获取协议(http 或 https)
var protocol = urlObj.protocol;// 获取 端口
var port = urlObj.port;// ================= Header ===================
// 获取 Header 参数对象
var headers = pm.request.headers;// 获取 key 为 field1 的 header 参数的值
var field1 = headers.get('field1');// 已键值对象方式获取所有 query 参数
var headersObject = headers.toObject();// 遍历整个 query
headers.each(item => {console.log(item.key); // 输出参数名console.log(item.value); // 输出参数值
});// 增加 header 参数
headers.add({key: 'field1',value: 'value1',
});// 修改 query 参数(如不存在则新增)
headers.upsert({key: 'field2',value: 'value2',
});// ================= Query ===================
// 获取 Query 参数对象
var queryParams = pm.request.url.query;// 获取 key 为 field1 的 query 参数的值
var field1 = queryParams.get('field1');// 已键值对象方式获取所有 query 参数
var quertParamsObject = queryParams.toObject();// 遍历整个 query
queryParams.each(item => {console.log(item.key); // 输出参数名console.log(item.value); // 输出参数值
});// 增加 query 参数
queryParams.add({key: 'field1',value: 'value1',
});// 修改 query 参数(如不存在则新增)
queryParams.upsert({key: 'field2',value: 'value2',
});// ================= Body ===================
// Body 参数来自pm.request.body,pm.request.body 是一个RequestBody 实例。
// Body 参数在只能读取,不能直接修改。如需修改 Body 里的数据,请在 Body 里引用变量,然后在脚本里设置变量的值,以达到修改的目的。// --------------------- body 类型为 form-data ------------------
// 当 body 类型为 form-data 时,从 pm.request.body.formdata 获取请求参数
var formData = pm.request.body.formdata;// 获取 key 为 field1 的 form-data 参数的值
var field1 = formData.get('field1');
console.log(field1); // 控制台打印 field1// 已键值对象方式获取所有 formdata 参数
var formdataObject = formData.toObject();
console.log(formdataObject); // 控制台打印 formdataObject// 遍历整个 form-data 数据
formData.each(item => {console.log(item.key); // 控制台打印参数名console.log(item.value); // 控制台打印参数值
});// --------------------- body 类型为 x-www-form-urlencode ------------------
// 当 body 类型为 x-www-form-urlencode** 时,从 pm.request.body.urlencoded 获取请求参数
var formData = pm.request.body.urlencoded;// 获取 key 为 field1 的 form-data 参数的值
var field1 = formData.get('field1');// 已键值对象方式获取所有 formdata 参数
var formdataObject = formData.toObject();// 遍历整个 form 数据
formData.each(item => {console.log(item.key); // 控制台打印参数名console.log(item.value); // 控制台打印参数值
});// --------------------- body 类型为 JSON ------------------
try {var jsonData = JSON.parse(pm.request.body.raw);console.log(jsonData); // 控制台打印参整个 json 数据
} catch (e) {console.log(e);
}// --------------------- body 类型为 raw ------------------
var raw = pm.request.body.raw;
console.log(raw); // 控制台打印参整个 raw 数据

3)常用后置脚本:

pm.test("响应状态码为200", function () {pm.response.to.have.status(200);pm.expect(pm.response.code).to.eql(200);
});// GET https://gank.io/api/v2/banners
pm.test("成功响应且有数据", function() {pm.expect(pm.response.code).to.eql(200);const respJson = pm.response.json();pm.expect(respJson.data).to.length.gt(0);
})// GET https://gank.io/api/v2/data/category/GanHuo/type/iOS/page/1/count/10
pm.test("分页数据满页", function() {const respJson = pm.response.json();pm.expect(respJson.data.length).to.eq(10);pm.expect(respJson.data).to.have.lengthOf(10);
})// 在脚本中发送请求
pm.sendRequest("https://gank.io/api/v2/banners", function(err, resp) {console.log(resp.json())
})// 响应数据转换
// json
const responseJson = pm.response.json();
// xml
const responseJson = xml2Json(pm.response.text());
// csv
const parse = require('csv-parse/lib/sync');
const responseJson = parse(pm.response.text());
// html https://cheerio.js.org
const $ = cheerio.load(pm.response.text());
console.log($.html());
console.log($(".header"));
// 纯文本
pm.expect(pm.response.text()).to.include("customer_id");
pm.response.to.have.body("whole-body-text");// 将 jsonData.token 的值写入环境变量
pm.environment.set('token', jsonData.token);

4)常用断言:

// response assertions 示例
pm.test('返回结果没有错误', function() {pm.response.to.not.be.error;pm.response.to.have.jsonBody('');pm.response.to.not.have.jsonBody('error');
});// pm.response.to.be* 示例
pm.test('返回结果没有错', function() {// assert that the status code is 200pm.response.to.be.ok; // info, success, redirection, clientError,  serverError, are other variants// assert that the response has a valid JSON bodypm.response.to.be.withBody;pm.response.to.be.json; // this assertion also checks if a body  exists, so the above check is not needed
});// -----------  状态码  -------------
pm.test('Status code is 200', function() {pm.response.to.have.status(200);
});
// 检查 HTTP 状态码名称是否包含某个字符串
pm.test('Status code name has string', function() {pm.response.to.have.status('Created');
});
// 是否正确的 POST 请求状态码
pm.test('Successful POST request', function() {pm.expect(pm.response.code).to.be.oneOf([201, 202]);
});// --------- 请求头  ---------
pm.expect(pm.response.headers.get('Content-Type')).to.eql('application/json');
pm.test('Content-Type header is present', function() {pm.response.to.have.header('Content-Type');
});// ---------  cookie  ---------
pm.expect(pm.cookies.has('JSESSIONID')).to.be.true;
pm.expect(pm.cookies.get('isLoggedIn')).to.eql('1');// ---------  响应时间 ms  ---------
pm.test('Response time is less than 200ms', function() {pm.expect(pm.response.responseTime).to.be.below(200);
});// ---------------  请求体验证  -----------------
const jsonData = pm.response.json();
pm.expect(jsonData.name).to.eql("Jane");
// 响应值等于某个预先定义的变量值
pm.expect(jsonData.name).to.eql(pm.environment.get("name"));// 检查 response body 是否包含某个字符串
pm.test('Body matches string', function() {pm.expect(pm.response.text()).to.include('string_you_want_to_search');
});// 检查 response body 是否包含等于字符串
pm.test('Body is correct', function() {pm.response.to.have.body('response_body_string');
});// 检查 json 值
pm.test('Your test name', function() {var jsonData = pm.response.json();pm.expect(jsonData.value).to.eql(100);
});// 断言数据类型
pm.expect(jsonData).to.be.an("object");
pm.expect(jsonData.name).to.be.a("string");
pm.expect(jsonData.age).to.be.a("number");
pm.expect(jsonData.hobbies).to.be.an("array");
pm.expect(jsonData.website).to.be.undefined;
pm.expect(jsonData.email).to.be.null;// 数组属性
pm.expect(jsonData.errors).to.be.empty;
pm.expect(jsonData.errors).to.be.an('array').that.is.empty;
pm.expect(jsonData.areas).to.include("goods");
const contactSettings = jsonData.settings.find(m => m.type === "contact");
pm.expect(contactSettings).to.be.an("object", "找不到联系方式配置信息");
pm.expect(contactSettings.detail).to.have.members(["email", "sms"]);// 对象
pm.expect({a: 1, b: 2}).to.have.all.keys('a', 'b');
pm.expect({a: 1, b: 2}).to.have.any.keys('a', 'b');
pm.expect({a: 1, b: 2}).to.not.have.any.keys('c', 'd');
pm.expect({a: 1}).to.have.property('a');
pm.expect({a: 1, b: 2}).to.be.an('object').that.has.all.keys('a', 'b');
pm.expect({a: 1, b: 2}).to.deep.include({a:1});	// 包含部分属性
// 集合
pm.expect({"a": 1, "b": 123}.a).to.be.oneOf([1, 123]);// 字符串
pm.expect('').to.be.empty;

5)脚本里发送请求:

pm.sendRequest('https://postman-echo.com/get', (error, response) => {if (error) {console.log(error);} else {console.log(response);pm.environment.set('variable_key', 'new_value');}
});// 完整的 request 参数示例
const echoPostRequest = {url: 'https://postman-echo.com/post',method: 'POST',header: {headername1: 'value1',headername2: 'value2',},body: {mode: 'raw',raw: JSON.stringify({ key: 'this is json' }),},
};
pm.sendRequest(echoPostRequest, function(err, res) {console.log(err ? err : res.json());
});// 对返回结果进行断言
pm.sendRequest('https://postman-echo.com/get', function(err, res) {if (err) {console.log(err);}pm.test('response should be okay to process', function() {pm.expect(err).to.equal(null);pm.expect(res).to.have.property('code', 200);pm.expect(res).to.have.property('status', 'OK');});
});

在Runner中运行collection下的请求时, 可以通过postman.setNextRequest(请求名) 或者 postman.setNextRequest(请求id)来指定下一个请求, 这样可以构建起一个调用工作流, 比如先请求数据列表接口, 然后从响应中获取数据id, 再请求数据详情接口. 

原文:postman | Tonny's Blog

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/60739.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java NIO 核心知识总结

NIO 简介 在传统的 Java I/O 模型&#xff08;BIO&#xff09;中&#xff0c;I/O 操作是以阻塞的方式进行的。也就是说&#xff0c;当一个线程执行一个 I/O 操作时&#xff0c;它会被阻塞直到操作完成。这种阻塞模型在处理多个并发连接时可能会导致性能瓶颈&#xff0c;因为需要…

Qwen2.5-Coder-32B-Instruct Docker 部署openai接口

Qwen2.5-Coder-32B-Instruct 模型下载,国内快捷方式: conda create -n modelscope python=3.10 conda activate modelscopepip install modelscopemodelscope download --model Qwen/Qwen2.5-Coder-32B-Instruct --local_dir /ssd/xiedong/Qwen/Qwen2.5-Coder-32B-I

基于STM32的智能语音识别饮水机系统设计

功能描述 1、给饮水机设定称呼&#xff0c;喊出称呼&#xff0c;饮水机回答&#xff1a;我在 2、语音进行加热功能&#xff0c;说&#xff1a;请加热&#xff0c;加热片运行 3、饮水机水位检测&#xff0c;低于阈值播报“水量少&#xff0c;请换水” 4、检测饮水机水温&#xf…

电子应用产品设计方案-10:全自动智能门禁系统设计方案

一、系统概述 本全自动智能门禁系统旨在提供高效、安全、便捷的人员进出管理解决方案。通过融合先进的生物识别技术、传感器技术、网络通信技术和自动化控制技术&#xff0c;实现门禁的自动识别、授权、记录和管理。 二、系统组成 1. 前端识别设备 - 人脸识别模块&#xff1a;采…

聊聊Flink:Flink的分区机制

一、前言 flink任务在执行过程中&#xff0c;一个流&#xff08;stream&#xff09;包含一个或多个分区&#xff08;Stream partition&#xff09;。TaskManager中的一个slot的subtask就是一个stream partition&#xff08;流分区&#xff09;&#xff0c;一个Job的流&#xf…

IO流实用案例:用字节流--输入流(Inpustream)、输出流(OutputStream)写一个拷贝图片的案例--超简单!

案例背景&#xff1a; 我的电脑桌面有一张白敬亭的照片&#xff0c;我们需要把这张照片拷贝到我的电脑D:\学习软件\copyBJT目录下&#xff0c;当前我们这个目录是没有东西的。 代码演示以及注释&#xff1a; ublic class StreamCopy {public static void main(String[] args)…

ArkTS学习笔记:ArkTS起步

ArkTS是HarmonyOS的主力应用开发语言&#xff0c;基于TypeScript扩展&#xff0c;强化了静态检查和分析&#xff0c;旨在提升程序稳定性和性能。它采用静态类型&#xff0c;禁止运行时改变对象布局&#xff0c;并对UI开发框架能力进行扩展&#xff0c;支持声明式UI描述和自定义…

卡尔曼滤波:从理论到应用的简介

卡尔曼滤波&#xff08;Kalman Filter&#xff09;是一种递归算法&#xff0c;用于对一系列噪声观测数据进行动态系统状态估计。它广泛应用于导航、控制系统、信号处理、金融预测等多个领域。本文将介绍卡尔曼滤波的基本原理、核心公式和应用案例。 1. 什么是卡尔曼滤波&#x…

【已解决】git push一直提示输入用户名及密码、fatal: Could not read from remote repository的问题

问题描述&#xff1a; 在实操中&#xff0c;git push代码到github上一直提示输入用户名及密码&#xff0c;并且跳出的输入框输入用户名和密码后&#xff0c;报错找不到远程仓库 实际解决中&#xff0c;发现我环境有两个问题解决&#xff1a; git push一直提示输入用户名及密码…

【Rust 编程语言工具】rustup-init.exe 安装与使用指南

rustup-init.exe 是用于安装和管理 Rust 编程语言工具链的 Windows 可执行文件。Rust 是一种系统级编程语言&#xff0c;旨在提供安全、并发和高性能的功能。rustup-init.exe 是官方提供的安装器&#xff0c;用于将 Rust 安装到 Windows 操作系统中&#xff0c;并配置相关环境。…

Mac 使用mac 原生工具将mp4视频文件提取其中的 mp3 音频文件

简介 Hello! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~ ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,随后转入计算机专业,获得过国家奖学金,有幸在竞赛中拿过一些国奖、省奖…已保研 学习经验:扎实基础 + 多做笔…

项目中用户数据获取遇到bug

项目跟练的时候 Uncaught (in promise) TypeError: Cannot read properties of undefined (reading ‘code’) at Proxy.userInfo (user.ts:57:17) 因此我想要用result接受信息的时候会出错&#xff0c;报错显示为result.code没有该值 导致我无法获取到相应的数据 解决如下 给…

【视觉SLAM】1-概述

读书笔记 文章目录 1. 经典视觉SLAM框架2. 数学表述2.1 运动方程2.2 观测方程2.3 问题抽象 1. 经典视觉SLAM框架 传感器信息读取&#xff1a;相机图像、IMU等多源数据&#xff1b;前端视觉里程计&#xff08;Visual Odometry&#xff0c;VO&#xff09;&#xff1a;估计相机的相…

Isaac Sim+SKRL机器人并行强化学习

目录 Isaac Sim介绍 OmniIssacGymEnvs安装 SKRL安装与测试 基于UR5的机械臂Reach强化学习测评 机器人控制 OMNI GYM环境编写 SKRL运行文件 训练结果与速度对比 结果分析 运行体验与建议 Isaac Sim介绍 Isaac Sim是英伟达出的一款机器人仿真平台&#xff0c;适用于做机…

Python学习------第八天

函数 函数的传入参数 掌握函数返回值的作用 掌握函数返回值的定义语法 函数的嵌套调用&#xff1a; 函数的局部变量和全局变量 局部变量的作用&#xff1a;在函数体内部&#xff0c;临时保存数据&#xff0c;即当函数调用完成后&#xff0c;则销毁局部变量。 money 5000000 n…

机器学习基础04

目录 1.朴素贝叶斯-分类 1.1贝叶斯分类理论 1.2条件概率 1.3全概率公式 1.4贝叶斯推断 1.5朴素贝叶斯推断 1.6拉普拉斯平滑系数 1.7API 2.决策树-分类 2.1决策树 2.2基于信息增益的决策树建立 2.2.1信息熵 2.2.2信息增益 2.2.3信息增益决策树建立步骤 2.3基于基…

The Internals of PostgreSQL 翻译版 持续更新...

为了方便自己快速学习&#xff0c;整理了翻译版本&#xff0c;目前翻译的还不完善&#xff0c;后续会边学习边完善。 文档用于自己快速参考&#xff0c;会持续修正&#xff0c;能力有限,无法确保正确!!! 《The Internals of PostgreSQL 》 不是 《 PostgreSQL14 Internals 》…

Android 无签名系统 debug 版本APK push到设备引起的开机异常问题分析(zygote进程)

问题背景 前置操作&#xff1a; 替换原system/priv-app 目录下已有的应用包未未签名的debug版本&#xff0c;然后重启。 现象&#xff1a; 无法正常开机&#xff0c;卡在开机动画&#xff0c;并且pm没有起来&#xff0c;因为执行adb install 命令是返回“cmd: Cant find se…

深度学习推荐系统的工程实现

参考自《深度学习推荐系统》——王喆&#xff0c;用于学习和记录。 介绍 之前章节主要从理论和算法层面介绍了推荐系统的关键思想。但算法和模型终究只是“好酒”&#xff0c;还需要用合适的“容器”盛载才能呈现出最好的味道&#xff0c;这里的“容器”指的就是实现推荐系统…

attention 注意力机制 学习笔记-GPT2

注意力机制 这可能是比较核心的地方了。 gpt2 是一个decoder-only模型&#xff0c;也就是仅仅使用decoder层而没有encoder层。 decoder层中使用了masked-attention 来进行注意力计算。在看代码之前&#xff0c;先了解attention-forward的相关背景知识。 在普通的self-atten…