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

@costa1 

 

var obj = 
[{ "Id": 0, "Thumbprint": "string", "SerialNumber": "string", "IssuedDN": "string", "IssuedCN": "string", "ImportDate": "2023-04-13T10:36:14.586Z", "NotBefore": "2023-04-13T10:36:14.586Z", "NotAfter": "2023-04-13T10:36:14.586Z", "IssuerDN": "string", "PrincipalId": 0, "TemplateId": 0, "CertState": 0, "KeySizeInBits": 0, "KeyType": 0, "RequesterId": 0, "IssuedOU": "string", "IssuedEmail": "string", "KeyUsage": 0, "SigningAlgorithm": "string", "CertStateString": "string", "KeyTypeString": "string", "RevocationEffDate": "2023-04-13T10:36:14.586Z", "RevocationReason": 0, "RevocationComment": "string", "CertificateAuthorityId": 0, "CertificateAuthorityName": "string", "TemplateName": "string", "ArchivedKey": true, "HasPrivateKey": true, "PrincipalName": "string", "CertRequestId": 0, "RequesterName": "string", "ContentBytes": "string", "ExtendedKeyUsages": [ { "Id": 0, "Oid": "string", "DisplayName": "string" } ], "SubjectAltNameElements": [ { "Id": 0, "Value": "string", "Type": 0, "ValueHash": "string" } ], "CRLDistributionPoints": [ { "Id": 0, "Url": "string", "UrlHash": "string" } ], "LocationsCount": [ { "Type": "string", "Count": 0 } ], "SSLLocations": [ { "StorePath": "string", "AgentPool": "string", "IPAddress": "string", "Port": 0, "NetworkName": "string" } ], "Locations": [ { "StoreMachine": "string", "StorePath": "string", "StoreType": 0, "Alias": "string", "ChainLevel": 0, "CertStoreId": "00000000-0000-0000-0000-000000000000" } ], "Metadata": {}, "CertificateKeyId": 0, "CARowIndex": 0, "CARecordId": "string", "DetailedKeyUsage": { "CrlSign": true, "DataEncipherment": true, "DecipherOnly": true, "DigitalSignature": true, "EncipherOnly": true, "KeyAgreement": true, "KeyCertSign": true, "KeyEncipherment": true, "NonRepudiation": true, "HexCode": "string" }, "KeyRecoverable": true, "Curve": "string" } ]

var expiry = obj[0].NotAfter;

 

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

@Prince Arora thanks, do i place the var in the script include or the client script ?

@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.

Rahul Kumar17
Tera Guru

Hi,

 

To fix this issue, you need to replace the following line of code:

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

With this line of code:

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

 

Thanks,

Rahul Kumar

If my response helped please mark it correct and close the thread.

Thanks,
Rahul Kumar