如何使用预请求脚本构建邮递员URL查询

时间:2018-06-18 20:30:17

标签: postman prerequesthandler

我尝试使用预请求脚本根据从CSV文件中提取的数据构建请求对象。问题是请求似乎是在运行预请求脚本之前设置的。这似乎使这个中间请求脚本几乎而不是预先请求。 我的代码如下:

if(ipList === undefined) ipList = "1.2.3.4,2.3.4.5,123.234.345.465";
let ips = ipList.split(',');
let queryArray = [];
for( i=0; i<ips.length; i++){
    queryArray.push({ "key": "ip", "value": ips[i] });
}
console.log(queryArray);
pm.request.url.query = queryArray;
console.log(pm.request);

当我将请求中的url查询变量硬编码为4.3.2.1时,pm.response.url对象如下: pm.request.url.query[0] = {key:"ip", value:"4.3.2.1"}

  • 请注意,对象的url.query [0]部分与实际get请求中的参数匹配。

当我将pm.request.url.query的值更改为等于新查询数组(as you can see here)时,查询数组设置正确,但参数未附加到请求URL。

因此,除非我做错了,否则即使是请求前脚本,请求也是不可变的。

所以我的问题是:     有没有办法在发出请求之前修改请求的网址参数?

BTW:我知道在查询中使用相同的密钥有多个参数可能看起来很奇怪,但这种API的工作方式和查询中的多个IP地址的硬编码工作正常。

2 个答案:

答案 0 :(得分:0)

您可以为pm.request.url分配一个新值。

这里,URL中已经有一些查询参数,我必须对其进行编辑:

const urlSplit = request.url.split('?');
const paramsString = urlSplit[1]; // the second part actually represents the query string we need to modify
const eachParamArray = paramsString.split('&');
let params = {};
eachParamArray.forEach((param) => {
    const key = param.split('=')[0];
    const value = param.split('=')[1];
    Object.assign(params, {[key]: value});
});

params.bla = params.bla + 'foobar';

newQueryString = Object.keys(params).map(key => key + '=' + params[key]).join('&');

pm.request.url = urlSplit[0] + '?' + newQueryString;

最后,我使用上一个的第一部分和带有编辑后的bla参数的查询字符串,构建了一个新URL。

答案 1 :(得分:0)

这似乎对我有用-它没有更改UI显示查询字符串的内容,但更改了实际请求的内容(查看控制台日志)

pm.request.url.addQueryParams(["a=1", "b=2"])
pm.request.url.query.remove("b")