Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to build a Postman url query with Pre-request Scripts

I'm trying to use a pre-request script to build out a request object based on data pulled from a CSV file. The problem is that the request seems to be set in stone prior to the pre-request script being run. That would seem to make this a mid-request script almost rather than a pre-request. My code is as follows:

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);

When I hardcode a url query variable in the request to equal 4.3.2.1, the pm.response.url object like this: pm.request.url.query[0] = {key:"ip", value:"4.3.2.1"}

  • Note that the url.query[0] part of the object matches the parameter in the actual get request.

When I change the value of pm.request.url.query to equal the new query array, however as you can see here, the query array is set correctly, but the parameters are not appended to the request URL.

So unless I'm doing something wrong, it appears that the request is immutable even to the pre-request scripts.

So my question is this: Is there a way to modify the url params of a request prior to making the request?

BTW: I know that is might seem odd to have multiple params with the same key in a query, but that's the way this API works and hard coding multiple ip addresses in the query works just fine.

like image 721
Eddy Jones Avatar asked Mar 06 '23 23:03

Eddy Jones


2 Answers

You could just assign a new value to pm.request.url.

Here I had some query params already in the URL, which I had to edit:

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;

In the end, I just constructed a new URL, using the first part of the previous one & the query string with the edited bla parameter.

like image 193
acvi Avatar answered May 09 '23 00:05

acvi


This seemed to work for me--it didn't change what the UI shows the query string is, but it changed what the actual request was (looking at the console log)

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

I have some parameters called "script_loginAs" etc... named such that people on my team know the parameter is evaluated and not sent.

like image 25
Kimball Robinson Avatar answered May 09 '23 00:05

Kimball Robinson