Join the #BuildWithBuildAgent Challenge! Get recognized, earn exclusive swag, and inspire the ServiceNow Community with what you can build using Build Agent.  Join the Challenge.

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

hi @Muhammad Arif B 

ok, got it. Try bellow updated script once and let me know its working or not:

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

// Manually construct the reqPayload in the specified order
var reqPayload = '?folder=' + encodeURIComponent(queryParam['folder']) +
                 '&file=' + encodeURIComponent(queryParam['file']);

// Ensure that you use reqPayload in your hashing logic here

var r = new sn_ws.RESTMessageV2(apiname, apimethod);
r.setEndpoint(xxurlxx); // Do not append reqPayload here
r.setHttpMethod("get");
r.setStringParameterNoEscape('Content-Type', "application/json");
r.setStringParameterNoEscape('oauth_sign', Signature);
r.setStringParameterNoEscape('oauth_client_key', oAuthClientKey);

// Set the query parameters without changing their order
r.setQueryParameter('folder', queryParam['folder']);
r.setQueryParameter('file', queryParam['file']);

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

the request string still "xxurlxx?file=test.xlsx&folder=WO123"

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

Thanks. the signature is fixed, but i got another error "Received 405 Response without Allow Header" which i believe i didnt set proper query parameters. Meaning need to use setQueryParameter to send completed URL and not using payload string.