How to Submit a catalog item from web page using REST API?

Ajay37
Tera Contributor

Hi All,

I need to submit a catalog item based on the input parameters coming from a web page.

What I did till now:

1. Rest API explore --> Name space: sn_sc --> API Name: Service Catalog API --> entered the sys_id of the catalog item and given raw JSON body as below:

{
'sysparm_id': 'c28204ba2fe320100697bac62799b66d',
'sysparm_quantity': '1',
'variables':{
'short_description': 'check for api response',
'description': 'check for api response'
}

}

My doubts are:

  • Sharing this endpoint to web developer is enough to get this done?
  • Do I need to create any validation scripts?
  • How to configure the outbound response, I want to show the RITM number instead of Request Number in webpage after submitting the request?

Thanks

1 ACCEPTED SOLUTION

Hi,

you can share the details but the issue would be

1) consider your catalog item has variable which is of type reference to sys_user; so 3rd party won't know the user sys_id and it would lead to variable set to empty

So you better create scripted REST API and handle the request they send and then use Cart API to create RITM and REQ

I believe you want to create a scripted REST API which would be consumed by 3rd party team. they would send information/variable data as json request corresponding to the variables you share with them. This will be only for single catalog item I consider

Example: if your catalog item has 4 variables as requested_for, requested_by, start_date, end_date

you can inform them to send data as below; so the json request would look like

{

"requested_for":"Abel Tuter",

"requested_by":"Fred Luddy",

"start_date":"2020-04-23",

"end_date":"2020-04-35"

}

Now example script in scripted rest API to create RITM for your catalog item with the above variable data

(function process(/*RESTAPIRequest*/ request, /*RESTAPIResponse*/ response) {

var reqbody = request.body.dataString;

try{
var parser = new global.JSON();
var parsedData = parser.decode(reqbody);

var requestedFor = parsedData.requested_for;
var requestedBy = parsedData.requested_by;
var startDate = parsedData.start_date;
var endDate = parsedData.end_date;

var cartId = GlideGuid.generate(null);
var cart = new Cart(cartId);

// give here the sys_id of the catalog item under which those variables are present

// you can query sys_user and get the value and then set those reference variables

var item = cart.addItem('4054428fdb151f0097679ec6db9619c0', 1);

//fill in the variables on the request item form
cart.setVariable(item,"requested_for", requestedFor);
cart.setVariable(item,"requested_by", requestedBy);
cart.setVariable(item,"start_date", startDate);
cart.setVariable(item,"end_date", endDate);

var rc = cart.placeOrder();

// rc is the request number; you can query RITM table and get the RITM number

var reqNumber = rc.number;

var ritm = new GlideRecord('sc_req_item');
ritm.get('request.number', reqNumber);
var ritmNumber = ritm.number;

var res = {};
res["status"] = "Success";
res["requestNumber"] = reqNumber;
res["requestItemNumber"] = ritmNumber;
response.setBody(JSON.stringify(res));

}
catch(ex){
var res = {};
res["status"] = "Error";
res["message"] = ex.message;
response.setBody(JSON.stringify(res));
}

})(request, response);


Regards
Ankur

Regards,
Ankur
✨ Certified Technical Architect  ||  ✨ 9x ServiceNow MVP  ||  ✨ ServiceNow Community Leader

View solution in original post

20 REPLIES 20

Hi @Ankur Bawiskar ,

Only one request and RITM is getting created in my case.

When I try from Rest Explorer, I am getting Response as configured. But, third party person is saying that he is getting only "Response code 200" message.

Thanks

HI @Ankur Bawiskar 

I have used the same CART API in my requirement but here for Requested_For variable, 3rd is sending the userid instead of name/sysid.

Shall we able to set requested_for variable by using user id without GlideRecord to the  sys_user table.

is it possible like this:  i tried but it is not working.

cart.setVariable(item, "requested_for.userID", 'ABCD');

HI @Ankur Bawiskar 

I have used the same CART API in my requirement but here for Requested_For variable, 3rd is sending the userid instead of name/sysid.

Shall we able to set requested_for variable by using user id without GlideRecord to the  sys_user table.

is it possible like this:  i tried but it is not working.

cart.setVariable(item, "requested_for.userID", 'ABCD');

Hi Ankur, 

 

I tried this method, but it is throwing  script evaluation exception. Can you please help.

 

 

{
  "error": {
    "message": "Script Evaluation Exception",
    "detail": "Cannot convert {\"status\":\"Error\",\"message\":\"Cannot convert {\\\"status\\\":\\\"Success\\\",\\\"requestNumber\\\":{},\\\"requestItemNumber\\\":{}} to org.mozilla.javascript.ScriptableObject (sys_ws_operation.b64a78d2876b65507beb20e9cebb35ab.operation_script; line 51)\"} to org.mozilla.javascript.ScriptableObject (sys_ws_operation.b64a78d2876b65507beb20e9cebb35ab.operation_script; line 57)"
  },
  "status": "failure" 

 

HI @Ankur Bawiskar ,

 

I am getting undefined in variables.

 

Is there any other way we can parse the data?