Generate request String to REST Message

Muhammad Arif B
Tera Contributor

Hi, i need to send info to third party APIGEE and here is the script include

 

var queryParam = {
            'folder': "WOT123",
            'file': "test.xlsx"            
};

if (queryParam && Object.keys(queryParam).length > 0) {
            for (var i = 0; i < Object.keys(queryParam).length; i++) {
                if (i == 0)
                    reqPayload = '?' + Object.keys(queryParam)[i] + '=' + queryParam[Object.keys(queryParam)[i]];
                else
                    reqPayload += '&' + Object.keys(queryParam)[i] + '=' + queryParam[Object.keys(queryParam)[i]];
          }
}
 

//hashing the reqPayload to generate Signature

 

var r = new sn_ws.RESTMessageV2(apiname, apimethod);

r.setEndpoint(xxurlxx);

r.setHttpMethod("get");

r.setStringParameterNoEscape('Content-Type', "application/json");
r.setStringParameterNoEscape('oauth_sign', Signature);
r.setStringParameterNoEscape('oauth_client_key', oAuthClientKey);
if(queryParam && Object.keys(queryParam).length > 0) {
       for(var i=0; i<Object.keys(queryParam).length; i++) {
              r.setQueryParameter(Object.keys(queryParam)[i], queryParam[Object.keys(queryParam)[i]]);                    
       }
}

 

var response = r.execute();
var responseBody = response.getBody();
var httpStatus = response.getStatusCode();

 

Somehow, the Request string send is inverted, thus getting error 401 "invalid signature".

 

Request string that I sent: xxurlxx?file=test.xlsx&folder=WO123

Hash string that I used: ?folder=WO123&file=test.xlsx

To success, I should send the request string same as hashing : xxurlxx?folder=WO123&file=test.xlsx 

 

Any one knows what is problem here or how to control the request string in REST Message or script include?

1 ACCEPTED SOLUTION

hi @Muhammad Arif B 

 

Try this once:

var queryParam = {
    'folder': "WOT123",
    'file': "test.xlsx"
};

// Construct the query string in the desired order
var reqPayload = '?folder=' + encodeURIComponent(queryParam['folder']) +
                 '&file=' + encodeURIComponent(queryParam['file']);

// Create the full endpoint URL
var fullUrl = xxurlxx + reqPayload; // Combine endpoint and query parameters

// Hashing the reqPayload to generate Signature
// Make sure to use reqPayload for generating the signature

var r = new sn_ws.RESTMessageV2(apiname, apimethod);
r.setEndpoint(fullUrl); // Use the full URL with query parameters
r.setHttpMethod("get");
r.setStringParameterNoEscape('Content-Type', "application/json");
r.setStringParameterNoEscape('oauth_sign', Signature);
r.setStringParameterNoEscape('oauth_client_key', oAuthClientKey);

// No need to set query parameters separately, as they are already in the URL

// Execute the request
var response = r.execute();
var responseBody = response.getBody();
var httpStatus = response.getStatusCode();

View solution in original post

8 REPLIES 8

Ravi Gaurav
Giga Sage
Giga Sage

Hi @Muhammad Arif B ,

Try with the below script once :-

var queryParam = {
'folder': "WO123",
'file': "test.xlsx"
};

var reqPayload = '';
if (queryParam && Object.keys(queryParam).length > 0) {
var keys = Object.keys(queryParam);
for (var i = 0; i < keys.length; i++) {
if (i == 0)
reqPayload = '?' + keys[i] + '=' + queryParam[keys[i]];
else
reqPayload += '&' + keys[i] + '=' + queryParam[keys[i]];
}
}

// Hashing the reqPayload to generate Signature (keep your current logic here)

// Create the RESTMessageV2 object
var r = new sn_ws.RESTMessageV2(apiname, apimethod);

// Set endpoint with query parameters included
var endpoint = xxurlxx + reqPayload;
r.setEndpoint(endpoint);

// Set HTTP method
r.setHttpMethod("get");

// Set headers and parameters
r.setRequestHeader('Content-Type', "application/json");
r.setRequestHeader('oauth_sign', Signature);
r.setRequestHeader('oauth_client_key', oAuthClientKey);

// Execute the request
var response = r.execute();
var responseBody = response.getBody();
var httpStatus = response.getStatusCode();

--------------------------------------------------------------------------------------------------------------------------


If you found my response helpful, I would greatly appreciate it if you could mark it as "Accepted Solution" and "Helpful."
Your support not only benefits the community but also encourages me to continue assisting. Thank you so much!

Thanks and Regards
Ravi Gaurav | ServiceNow MVP 2025,2024 | ServiceNow Practice Lead | Solution Architect
CGI
M.Tech in Data Science & AI

 YouTube: https://www.youtube.com/@learnservicenowwithravi
 LinkedIn: https://www.linkedin.com/in/ravi-gaurav-a67542aa/

Cant set r.setEndpoint(xxurlxx + reqPayload);. By doing this, it will send request :  "xxurlxx?file=test.xlsx&folder=WO123?folder=WO123&file=test.xlsx"(double payload)

Rajesh Chopade1
Mega Sage

Hi @Muhammad Arif B 

It looks like you're facing an issue with the order of query parameters in your request string versus the string you're using to generate the hash for the signature. Since the order of parameters matters for generating a valid OAuth signature, you'll need to ensure that both the request string and the hash string use the same order.

 

Could you try once bellow updated code:

var queryParam = {
    'folder': "WOT123",
    'file': "test.xlsx"
};

// Create an array of keys and sort them to maintain a consistent order
var sortedKeys = Object.keys(queryParam).sort();
var reqPayload = '';

for (var i = 0; i < sortedKeys.length; i++) {
    var key = sortedKeys[i];
    if (i === 0) {
        reqPayload = '?' + key + '=' + encodeURIComponent(queryParam[key]);
    } else {
        reqPayload += '&' + key + '=' + encodeURIComponent(queryParam[key]);
    }
}


// Assuming your hashing logic is correct, ensure reqPayload is used consistently

var r = new sn_ws.RESTMessageV2(apiname, apimethod);
r.setEndpoint(xxurlxx + reqPayload); // Append the sorted query parameters to the endpoint
r.setHttpMethod("get");
r.setStringParameterNoEscape('Content-Type', "application/json");
r.setStringParameterNoEscape('oauth_sign', Signature);
r.setStringParameterNoEscape('oauth_client_key', oAuthClientKey);

// Set query parameters using the same sorted keys
for (var i = 0; i < sortedKeys.length; i++) {
    var key = sortedKeys[i];
    r.setQueryParameter(key, queryParam[key]);                    
}

var response = r.execute();
var responseBody = response.getBody();
var httpStatus = response.getStatusCode();

 

I hope my answer helps you to resolve your issue, if yes please mark my answer helpful and correct.

thank you

Rajesh

Hi, we cant sort the query parameters, even got valid signature, from APIGEE side must received ?folder=WO123&file=test.xlsx.

Cant set r.setEndpoint(xxurlxx + reqPayload);. By doing this, it will send request :  "xxurlxx?file=test.xlsx&folder=WO123?file=test.xlsx&folder=WO123" (double payload)