Onchange Catalog client script not working

costa1
Tera Expert

Trying to create an onChange ServiceNow catalog client scripts that update variable fields based on external REST API data.

 

The fields should auto populate after entering a certificate ID number. The response should include the Common name, Status and expiry date of the certificate, which is based on the certificate ID entered on the field

 

Script used;

 

function onChange(control, oldValue, newValue, isLoading) {
if (isLoading || newValue === ''){
return;
}

var certificateId = g_form.getValue('certificate_id');
var url = 'https://test.demotest.com/KeyfactorAPI/certificates/' + 'certificateId';
var headers = {'Authorization': 'Basic ' + btoa("username:Password")};
var gr = new GlideHTTPRequest('GET', url);
gr.setHeaders(headers);
gr.get(function(response) {
var responseBody = response.getBody();
var parsedResponse = JSON.parse(responseBody);
g_form.setValue('certificate_name', parsedResponse.IssuedCN);
g_form.setValue('certificate_status', parsedResponse.CertStateString);
g_form.setValue('certificate_expiration_date', parsedResponse.NotAfter);
});
}

 

The catalog item form

costa1_0-1681458898594.png

 

Tried the above script but nothing happens... help needed please

4 ACCEPTED SOLUTIONS

Prince Arora
Tera Sage
Tera Sage

@costa1 ,

 

Can you try below script in background script first if you will get response will move it to your client side:

 

 

 

var request = new sn_ws.RESTMessageV2();
var certi = "" ; //please provide here some certificate ID hardcoded for testing
request.setEndpoint('https://test.demotest.com/KeyfactorAPI/certificates/' + certi); request.setHttpMethod('GET');
var
user = 'admin'; //provide here user name var password = 'admin'; //provide here password request.setBasicAuth(user,password); request.setRequestHeader("Accept","application/json"); request.setRequestHeader('Content-Type','application/json'); var response = request.execute();
gs.info(response.getStatusCode()); gs.log(response.getBody());

Please try this script in Background script first and let me know if you got the response!

 

If my answer solved your issue, please mark my answer as  Correct & 👍Helpful based on the Impact.

 

View solution in original post

Oh nice, that seemed to show the respected backend field data, i get all the results;

costa1_0-1681554829096.png

costa1_1-1681554862526.png

 

costa1_2-1681554876326.png

 

But the catalog item variable fields are still not populated (empty)

View solution in original post

@costa1 ,

 

Please Accept the solution if it has worked for you 🙂

View solution in original post

@costa1 ,

 

Update the last three lines as:

 

g_form.setValue("certificate_name", answer[0].CertificateAuthorityName);
g_form.setValue("certificate_status", answer[0].CertStateString);
g_form.setValue("certificate_expiration_date",answer[0].NotAfter);

 If my answer solved your issue, please mark my answer as Correct & 👍Helpful based on the Impact.

View solution in original post

28 REPLIES 28

Weird
Mega Sage

GlideHTTPRequest is a server side only API meaning it won't work in client scripts.
You'd have to create a GlideAjax script include, write your script there and then call the script include from your client script.

created the GlideAjax script include below;

 

var KeyfactorRestAPI = Class.create();
KeyfactorRestAPI.prototype = {
initialize: function() {
this._baseUrl = "https://test.demotest.com/KeyfactorAPI/"; // Set the API endpoint URL.
this._username = "username"; // Set the Basic Authentication username.
this._password = "Password"; // Set the Basic Authentication password.
},

// Method for getting certificate data from the Keyfactor Command REST API.
getCertificateData: function(Certificates, callback) {
var url = this._baseUrl + Certificates;

// Build the headers object with the Basic Authentication credentials.
var headers = {
"Authorization": "Basic " + GlideStringUtil.base64Encode(this._username + ":" + this._password)};

// Make an AJAX call to the API endpoint with the Basic Authentication headers.
new GlideAjax("KeyfactorRestAPI").get(url, function(response) {
callback(response);
}, headers);
}
};

 

and then created the client script (using onChange);

 

function onChange(control, oldValue, newValue, isLoading) {
if (isLoading || newValue == '') {
return;
}
// Instantiate the KeyfactorRestAPI script include.
var keyfactorRestAPI = new KeyfactorRestAPI();

// Get the cert Number variable field element and add an onchange event listener.
var certlNumberElement = g_form.getControl('certificate_id');
certlNumberElement.observe('change', function() {
// Get the cert number value from the cert id variable.
var Certificates = g_form.getValue('certificate_id');

// Call the getCertificateData method of the KeyfactorRestAPI script include.
keyfactorRestAPI.getCertificateData(Certificates, function(response) {
// Parse the response data and set the Certificate Data variable value.
var responseData = JSON.parse(response);
g_form.setValue('certificate_data', responseData);

});
});
}

 

but still getting no results.. any suggestions ?

Nghi1
Tera Expert

var url = 'https://test.demotest.com/KeyfactorAPI/certificates/' + 'certificateId';

You're concatenating certificateId variable as a string:

Should be:

var url = "https://test.demotest.com/KeyfactorAPI/certificates/" + certificateId;

still shows no results, even after changing to;

var url = "https://test.demotest.com/KeyfactorAPI/certificates/" + certificateId;