Postman Pre-request Script

news2024/9/20 0:51:47

这个其实是普通的js脚本,有一些和postman的通信他也提供了一些快捷命令如下
在这里插入图片描述

postman常用参数使用

环境变量

//设置当前环境变量
pm.environment.set("key", "value");
//获取当前环境变量
pm.environment.get("key");
//清除当前环境变量
pm.environment.unset("key");
//设置全局环境变量
pm.globals.set("key", "value");
//获取全局环境变量
pm.globals.get("key");
//清除全局环境变量
pm.globals.unset("key");
//在全局和当前环境变量中获取
pm.variables.get("key");
//设置集合
pm.collectionVariables.set("key",["value1","value2","value3"])
//获取集合
pm.collectionVariables.get("key");
//清除集合
pm.collectionVariables.unset("key");
//遍历集集合,遍历function(遍历当前值,索引,集合,)
pm.collectionVariables.get("key").forEach(function(a,b,c){
console.log(a);
console.log(b);
console.log(c);
});

查询字符串

//获取当前请求方式,返回:string
var method = pm.request.method;
//输出当前请求信息,返回:json
var request = pm.request.toJSON();
//输出当前请求url,返回:string
var url = pm.request.url.toString();
//输出当前请求参数,参数(是否编码):true  false ,返回:string
var querypararm =  pm.request.url.getQueryString(false);
//获取请求参数,参数(请求的键值)(string 类型),返回:string
var value = pm.request.url.query.get("key_name");
//删除请求参数,参数(请求的键值)
pm.request.url.query.remove("key_name");
//添加请求参数,参数(添加请求参数),数组类型
pm.request.url.query.add("key1=value1","key2=value2");
//判断某个键值是否存在,返回:boolean
var has = pm.request.url.query.has("key");

内置请求

//定义请求信息
var requests = {
     url:url,//请求url
     method: 'POST',//请求方式
     header: {'Content-Type':'application/json'},//请求header
     body: {
     mode: 'raw',//数据模型
     raw: JSON.stringify({mobile:raw.mobile,useScene:"login"})//数据
  }
 };

//发送请求,参数:请求信息,响应函数(异常,响应数据)
 pm.sendRequest(requests,function (err, response) {
      var result = response.json();
      console.log(result);
   
 });

请求头

//获取所有headers
var header = pm.request.getHeaders();
//移除header
pm.request.removeHeader("key");
//添加header
pm.request.addHeader("key:value");

请求体

//获得body中的内容,返回:string
 var body = pm.request.body.raw;
//重新设置body内容,参数:string
 pm.request.body.update("");
//添加param参数,参数:string或者QueryParam对象
pm.request.addQueryParams("key=value");
//移除para参数,参数:数组字符串
pm.request.removeQueryParams("1","2");

Cookies

值得注意的是必须把这个domain添加到 cookies -> Manage Cookies -> Domains Allowlist 中,否则cookie的注入无效,你可以添加一个很广泛的域名比如.com来实现对所有的允许,但是建议使用精确
在这里插入图片描述

https://learning.postman.com/docs/sending-requests/response-data/cookies/#get-a-cookie

//创建一个cookie容器
const cookieJar = pm.cookies.jar();

//设置cookie,参数: url,cookieName,cookieValue,回调函数function(异常,设置成功的cookie)
/**
 * 如果设置失败,提示如下:Unable to access "xxxx.com" cookie store. Try    whitelisting the domain in "Manage Cookies 
 * 点击界面的 Cookies > Domains Allowlist(左下角) > 在输入框中加入xxxx.com 点击
 * add
 */
cookieJar.set("xxxx.com","name","value",function(error,cookie){
console.log(error);
console.log(cookie);
})

//获取cookie,参数: url,cookieName,回调函数function(异常,cookie)
cookieJar.get("xxxx.com","name",function(error,cookie){
console.log(error);
console.log(cookie);
})

//获取所有cookie,参数: url,回调函数function(异常,cookie)
cookieJar.getAll("xxxx.com", function(error, cookies){
console.log(error);
console.log(cookie);
});

//删除cookie,参数: url,cookieName,回调函数function(异常)
cookieJar.unset("xxxx.com", "name", function(error){
console.log(error);
});

//删除所有cookie,参数: url,回调函数function(异常)
cookieJar.clear("xxxx.com", "name", function(error){
console.log(error);
});

工具

//字符串转json对象
var json =JSON.parse("");

//json对象转字符串
var string = JSON.stringify(obj);

//获取当前时间的时间格式
var time = require('moment')().format("YYYY-MM-DD HH:mm:ss");

//参数编码参数
var encodeURI = encodeURIComponent("");

//编码整个url
var encodeURI = encodeURI("");

//base64编码
var content = CryptoJS.enc.Utf8.parse("1");
var base64Content = CryptoJS.enc.Base64.stringify(content);

//base64解码
var parsedWordArray = CryptoJS.enc.Base64.parse(base64Content);
var wordString = parsedWordArray.toString(CryptoJS.enc.Utf8);

//xml转换json对象,参数:请求响应的xml
var jsonObject = xml2Json(responseBody);

//解析响应的csv
const parse = require('csv-parse/lib/sync');
const responseJson = parse(pm.response.text());

//解析html
const $ = cheerio.load(pm.response.text());
console.log($.html());

//MD5加密
var md5 = CryptoJS.MD5("").toString();

//SHA1加密
var sha1 = CryptoJS.SHA1("").toString();

//AES加密
const keys = CryptoJS.enc.Utf8.parse("123456789");//秘钥
const ivs = CryptoJS.enc.Utf8.parse('tltlaycvtweasa');//偏移量
let encryptedWord = CryptoJS.enc.Utf8.parse("1");//加密内容
var encrypted = CryptoJS.AES.encrypt(encryptedWord, keys, { iv: ivs,mode:CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7}); //加密结果
var ciphertext = encrypted.toString(); //密文

Tests编写

值获取
//请求耗时
var time = pm.response.responseTime;
//获取响应code
var code = pm.response.code;
//获取错误描述:例如返回200,下面返回的是OK
var status = pm.response.status;
//获取响应数据
var data = pm.response.json();
//获取响应header
var header = pm.response.headers.get("key");
模板判断
//断言响应中是否包含指定字符串
pm.test("断言响应体包含指定字符串", function () {
    pm.expect(pm.response.text()).to.include("指定字符串");
});


//断言响应是否等于指定字符串
pm.test("断言响应是否等于指定字符串", function () {
    pm.response.to.have.body("指定字符串");
});
 

//断言json值是否等于指定值
pm.test("断言json值是否等于指定值", function () {
    var jsonData = pm.response.json();
    pm.expect(jsonData.value).to.eql(100);
});

//断言是否存在Content-Type标头
pm.test("断言是否存在Content-Type标头", function () {
    pm.response.to.have.header("Content-Type");
});

//断言cookie是否存在
pm.test("断言cookie是否存在", () => {
  pm.expect(pm.cookies.has('JSESSIONID')).to.be.true;
});

//断言cookie是否等于特定值
pm.test("断言cookie是否等于特定值", () => {
  pm.expect(pm.cookies.get('JSESSIONID')).to.eql('1');
});

//断言响应时间小于200ms
pm.test("断言响应时间小于200ms", function () {
    pm.expect(pm.response.responseTime).to.be.below(200);
});

//断言状态码为200
pm.test("断言状态码为200", function () {
    pm.response.to.have.status(200);
});


//断言状态响应说明是否包指定值
pm.test("断言状态响应说明是否包指定值", function () {
    pm.response.to.have.status("Created");
});

//断言成功响应状态码,oneOf表示在一组值中
pm.test("断言成功响应状态码", function () {
    pm.expect(pm.response.code).to.be.oneOf([201,202]);
});

//断言环境值和响应回来的值
pm.test("断言环境值和响应回来的值", function () {
  pm.expect(pm.response.json().name).to.eql(pm.environment.get("name"));
});

//断言响应数据类型
/* 响应数据结构如下
{
  "name": "Jane",
  "age": 29,
  "hobbies": [
    "skating",
    "painting"
  ],
  "email": null
}
*/
const jsonData = pm.response.json();
pm.test("Test data type of the response", () => {
  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;//是否为null
});

//断言数组
/* 响应数据结构如下
{
  "errors": [],
  "areas": [ "goods", "services" ],
  "settings": [
    {
      "type": "notification",
      "detail": [ "email", "sms" ]
    },
    {
      "type": "visual",
      "detail": [ "light", "large" ]
    }
  ]
}
*/
const jsonData = pm.response.json();
pm.test("Test array properties", () => {
    //判断是否为空
  pm.expect(jsonData.errors).to.be.empty;
    //判断是否包含 "goods"
  pm.expect(jsonData.areas).to.include("goods");
    //判断 settings 中的object是否有type='notification'
  const notificationSettings = jsonData.settings.find
      (m => m.type === "notification");
  pm.expect(notificationSettings)
    .to.be.an("object", "Could not find the setting");
    //判断是否notificationSettings.detail中是否包含"sms"
  pm.expect(notificationSettings.detail).to.include("sms");
    //判断是否notificationSettings.detail中是否包含如下所有成员
  pm.expect(notificationSettings.detail)
    .to.have.members(["email", "sms"]);
});

//断言一个对象包含键或属性
//断言包含所有的key
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');
//断言是否包含a属性
pm.expect({a: 1}).to.have.property('a');
//断言值是否为object对象,并且包含所有的key
pm.expect({a: 1, b: 2}).to.be.an('object')
  .that.has.all.keys('a', 'b');

//TV4校验

//定义校验模型,要求值为boolean类型
var schema = {
 "items": {
 "type": "boolean"
 }
};
//定义测试数据
//满足要求
var data1 = [true, false];
//不满足要求
var data2 = [true, 123];
//校验TV4模型
pm.test('校验TV4模型', function() {
  pm.expect(tv4.validate(data1, schema)).to.be.true;
  pm.expect(tv4.validate(data2, schema)).to.be.true;
});


//JSON模型校验

//构建Ajv
var Ajv = require('ajv');
//初始化
var ajv = new Ajv({logger: console})
//定义规则
var schema = {
        "properties": {
            "alpha": {
                "type": "boolean"
            }
        }
    };
//定义测试数据
//符合规则
var test1 = {alpha: true};
//不符合规则
var test2 = {alpha: 123};
//校验
pm.test('JSON模型校验', function() {
    pm.expect(ajv.validate(schema, test1)).to.be.true;
    pm.expect(ajv.validate(schema, test2)).to.be.false;
});



//将请求结果可视化
//数据样例
/**
 [
    {
        "name": "Alice",
        "email": "alice@example.com"
    },
    {
        "name": "Jack",
        "email": "jack@example.com"
    },
    // ... and so on
]
*/
//数据模板
var template = `
    <table bgcolor="#FFFFFF">
        <tr>
            <th>Name</th>
            <th>Email</th>
        </tr>

        {{#each response}}
            <tr>
                <td>{{name}}</td>
                <td>{{email}}</td>
            </tr>
        {{/each}}
    </table>
`;
//填充数据模板
pm.visualizer.set(template, {
    response: pm.response.json()
});

动态变量

获取动态变量
//动态变量获取
pm.variables.replaceIn('{{$randomFirstName}}');
常见动态变量的选择

具体文档链接:https://learning.postman.com/docs/tests-and-scripts/write-scripts/variables-list/

变量名描述例子
$guid一个uuid-v4风格GUID“611c2e81-2ccb-42d8-9ddc-2d0bfa65c1b4”
$timestamp当前UNIX时间戳(以秒为单位)1562757107
$isoTimestamp当前ISO时间戳(UTC为零)2020-06-09T21:10:36.177Z
$randomUUID随机的36个字符的UUID“6929bb52-3ab2-448a-9796-d6480ecad36b”
$randomAlphaNumeric随机字母数字字符6,“y”,“z”
$randomBoolean随机布尔值(真/假)true,false,false,true
$randomInt1至1000之间的随机整数802,494,200

demo

这是一个注入csrf的脚本,
在package中编写
在这里插入图片描述
然后在需要的接口的script中引入
在这里插入图片描述
在这里插入图片描述
也可以给整个collectionscript添加,那么这个目录下的所有接口都共用这个脚本

在这里插入图片描述

官方文档

https://learning.postman.com/docs/tests-and-scripts/write-scripts/intro-to-scripts/

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

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

相关文章

软件测试面试题汇总,超详细整理。。。

测试技术面试题 1、什么是兼容性测试&#xff1f;兼容性测试侧重哪些方面&#xff1f; 参考答案&#xff1a; 兼容测试主要是检查软件在不同的硬件平台、软件平台上是否可以正常的运行&#xff0c;即是通常说的软件的可移植性。 兼容的类型&#xff0c;如果细分的话&#x…

【Windows】如何关闭Windows11安全中心中的“病毒和威胁保护”?

按下“win&#xff08;徽标键&#xff09;i”快捷键&#xff0c;选择隐私与安全性-Windows安全中心。 选择防火墙和网络保护-域保护。 将开关闭&#xff0c;专业网络和公用网络防火墙也同样关闭&#xff0c;如下图所示&#xff1a; 关闭防火墙后&#xff0c;左边菜单栏选…

函数的学习(三)

1.函数的声明和定义 在C语言中&#xff0c;函数的声明和定义是分开的。 函数的声明是指在程序中提前告诉编译器有一个函数存在&#xff0c;并且指定了函数的名称、参数类型和返回值类型。函数的声明一般放在头文件中&#xff0c;它的作用是告诉编译器有一个函数存在&#xff…

学生综合测评、学生测评管理系统的设计与实现

摘要 学生综合测评是学校必不可少的一个部分。在教学中&#xff0c;学生综合测评担负着最重要的角色。为满足如今日益复杂的管理需求&#xff0c;各类学生综合测评也在不断改进。本课题所设计的学生综合测评&#xff0c;使用JSP技术与MySql数据库进行开发&#xff0c;它的优点代…

快速上手的企业视频会议系统需要具备哪些能力

随着企业规模的扩张&#xff0c;行政会议的增多以及企业的复杂性和地域分散性导致的信息传递周期过长问题&#xff0c;对企业运营效率和成本产生了负面影响。为了解决这些问题&#xff0c;许多企业开始采用视频会议系统以实现即时沟通并降低差旅开支。视频会议系统在远程沟通方…

牛客JS题(二十九) Map保存节点

注释很详细&#xff0c;直接上代码 涉及知识点&#xff1a; map的基本使用forEach的注意点 题干&#xff1a; 我的答案 <!DOCTYPE html> <html><head><meta charset"utf-8" /></head><body><p>1</p><p>2<…

24.8.9数据结构|链栈和队列

链栈 1、理解 实际上是一个仅在表头进行操作的单链表,头指针指向栈顶结点或头结点,以下恋栈均指带头结点的链栈. 2、 基本操作 1、定义结构&#xff1a;节点含有数据域和指针域 2、初始化操作&#xff1a;建立一个带头结点的空栈 3、取栈顶元素操作&#xff1a;取出栈的栈顶元…

【最新】推荐6款论文ai写论文软件推荐网站平台

在当前的学术研究和写作环境中&#xff0c;AI写作工具已经成为许多学者和学生的重要助手。这些工具不仅能够提高写作效率&#xff0c;还能帮助优化文章结构、润色语言以及进行查重等任务。以下将推荐六款优秀的AI写论文软件&#xff0c;并详细介绍它们的功能和特点。 1. 千笔-…

Spring及相关框架的重要的问题

Java框架 问题一&#xff1a;Spring框架中的单例bean是线程安全的吗&#xff1f; 看下图&#xff0c;不能被修改的成员变量就是无状态的类&#xff0c;无状态的类没有线程安全问题&#xff0c;所以在开发中尽量避免可修改的成员变量。 回答&#xff1a;不是线程安全的&#xf…

Drizzle ORM使用Azure PostgreSQL数据库迁移失败

执行 npx drizzle-kit migrate 命令报错&#xff1a; No config path provided, using default drizzle.config.ts Reading config file E:\nextjs-cloudflare-drizzle\drizzle.config.ts Using postgres driver for database querying [⡿] applying migrations...PostgresEr…

Intersection Observer API 帮你搞定前端滚动问题

前言 当我们在做需求时&#xff0c;可能经常会遇到很多跟页面的滚动有关的需求。例如 图片的懒加载&#xff1a;我们希望只加载用户当前视图窗口的图片&#xff0c;而未进入到视图窗口的图片&#xff0c;只有在进入到视图窗口时才进行加载&#xff0c;以提高页面响应速度&…

简单报表示例

简单报表 概述 简单表格报表&#xff1a;简单的表格报表。 应用场景 如下图所示&#xff0c;简单展示数据 示例说明 数据准备 在数据面板中添加数据集&#xff0c;可选择Json数据集和API服务数据集。Json数据集输入如下图所示&#xff1a; [{"到货日期":&qu…

工业智能网关在制造业数字化转型中的应用分享-天拓四方

随着工业4.0和物联网技术的飞速发展&#xff0c;工业智能网关已成为连接现场设备、实现数据采集与远程监控的关键节点。本文将以一个实际使用案例为蓝本&#xff0c;深入探讨工业智能网关的应用价值、技术特点以及实施效果&#xff0c;旨在为读者呈现一个清晰、专业且实操性强的…

vue项目打包问题

缓存导致打包后js文件404 修改vue.config.js打包输出文件名为动态&#xff0c;例如取当前时间戳。 在index.html文件添加meta标签设置不缓存。 更新完包&#xff0c;假如用户此刻正访问某一个页面时&#xff0c;访问的包还是原来的情况导致出现bug 解决VUE项目更新后需要客户手…

渲染引擎实践 - UnrealEngine引擎的 GLContext 创建过程

一:概述: 本文分析下 UnrealEngine 启动过程中创建多少个 OpenGL Context,以及每个 Context 的作用。 基于 UnrealEngine 4.25 环境。 二:临时Context 1. PreInit -> PreInitPreStartupScreen -> PreloadResolutionSettings, 用于检查图形窗口分辨率 2. PreInit -&…

Nmap——网络扫描的强大利器

一、引言 在网络安全和管理的领域中&#xff0c;了解网络的拓扑结构、设备状态以及开放的服务端口等信息至关重要。Nmap&#xff08;Network Mapper&#xff09;作为一款功能强大的网络扫描工具&#xff0c;为我们提供了深入探索网络的能力。本文将详细介绍 Nmap 的特点、功能…

三款新手剪辑软件分享,告别复杂的达芬奇剪辑软件

你们知道吗&#xff1f;一个视频能不能火&#xff0c;除了内容要够硬核&#xff0c;剪辑也是门大学问呢&#xff01;之前尝试过达芬奇剪辑&#xff0c;发现我不是很会用&#xff0c;然后最近我轮番上阵&#xff0c;试用了三款神器&#xff0c;来来来&#xff0c;让我给你们说说…

回归评价指标

这里写目录标题 1. 均方误差MSE2. 均方根误差RMSE3. 平均绝对误差MAE4. R^2^5. 调整后R^2^1. 均方误差MSE 回归数据和原始数据误差的平方和/原始数据个数平方的原因:不平方正负误差会抵消,对大误差更为敏感,在一些场景下更能凸显出模型预测的不准确性越接近于0,模型预测能力…

前端(三):Ajax

一、Ajax Asynchronous JavaScript And XML&#xff0c;简称Ajax&#xff0c;是异步的JavaScript和XML。 作用&#xff1a;数据交换&#xff0c;通过Ajax可以给服务器发送请求&#xff0c;并获取服务器响应的数据。异步交互&#xff1a;可以在不重新加载整个页面的情况下&…

雷达气象学(2)——雷达电磁波的衰减

文章目录 2.1 衰减的概念2.2 气体对电磁波的衰减2.3 云对电磁波的衰减2.4 雨对电磁波的衰减2.5 雪对电磁波的衰减2.5.1 干雪对电磁波的衰减2.5.2 湿雪对电磁波的衰减 2.6 冰雹对电磁波的衰减 2.1 衰减的概念 衰减是电磁波能量沿传播路径减弱的现象。造成衰减的原因是当电磁波投…