Community in read only mode June 18 & 19
This community will be set in READ ONLY mode for a while on Tuesday June 18 into Wednesday June 19 while we import content and users from our Micro Focus Forums community site. MORE INFORMATION
Highlighted
MT03
New Member.
6876 views

[SM9.32] Restful Response in Javascript

Jump to solution

Hi,

 

I have some problems with the RESTful response inside the HPSM.

 

I created a test function to generate a new Incident with the new implemented RESTful API.

 

If nothing goes wrong i got a JSON string with all information, which I can convert to an Object.

This is okay.

 

BUT, if i got an Error (Example: Invalid Validation) - I got an Header Response Code: 400 instead of 200.

But not more. (see Attachment - error-response-hpsm)

 

In the external REST Client ( I use POSTER - an Firefox Extension), I can see the full response for the

400 Error (see attachment - error-response-rest-client)

 

 

This is my test function:

 

var objConfig = {
	"url"		: "http://localhost:23080/SM/9/rest/",
	"username"	: "<your_rest_username>",
	"password"	: "<your_rest_password>",
	"module"	: "incidents"
};

// remove the // below to get a success response
// currently we will get an 400 error, because 
// some required fields are not filled
var objCreate = {	
	"Incident" : {
		"AffectedCI" 		: "adv-nam-server-mail",
		"AlertStatus"		: "updated",
		"Area"				: "failure",
		"Category"			: "incident",
		"AssignmentGroup"	: "Network",
		//"Title"				: "My Rest Incident",
		//"Description"		: "My Rest Description",
		"Subarea" 			: "function or feature not working",
		"Service" 			: "E-mail / Webmail (North America)",
		"Impact" 			: "2",
		"Urgency" 			: "2"
	}
};

createRecord( objCreate );

/**
 * Create a new Incident with the RESTful API
 * 
 * @param   {Object} objRecord Object with all required fields
 *
 * @return  {String}           JSON String with the response
 *
 */
function createRecord( objRecord ) {

	var JSON = system.library.JSON.json();
	
	//build header for basic authorization
	//without this, we will get an 401 error	
	var arrHeaders		= getRequestHeader();
	
	//build url for the request
	//Default Action for POST is "create" so we don't need
	//to add the action again
	var cRequestUrl		= objConfig.url+objConfig.module;
	
	//convert the given object to an json string
	cPostBody			= system.library.JSON2.toJSON(objRecord);

	try {
		//lets run the the HTTP request
		//HTTP Command - url to execute - http header - POST Body
		var rcRequest 	= doHTTPRequest("POST", cRequestUrl, arrHeaders, cPostBody,30,30);
		
		//convert response json string back to an object
		var objResponse	= JSON.parse(rcRequest);
		
		//Object Keys are
		//* Messages (=Return Message like Incident IMXXX has been opened)
		//* ReturnCode (=0 for SUCCESS)
		//* Incident (=Created Incident Record - only with the fields from the Web Service Configuration)
		
		print("Messages: \n"+objResponse.Messages.join("\n"));
		print("Return Code: "+objResponse.ReturnCode);
		print("Incident Details: \n"+objResponse.Incident.toSource());

	} catch( cError ) {
		//something goes wrong 
		//check also http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html 
		//to get the description of the given http response code like 401 etc.
		
		//currently it's not possible (or i don't know how) to get the correct
		//error response - for me it looks like that the HPSM has an filter
		//which removes the response body if the response header is not 200
		
		//if it's possible to use the reponse, we can use the same code
		//as above JSON.parse() etc.
		print("ERROR: \n"+cError);
	}
}


//Helper function to generate the HTTP Request header
//This function is required in each function which sends an doHTTPRequest
function getRequestHeader() {
	
	var authHeader		= new Header();
	authHeader.name		= "Authorization";
	authHeader.value	= "Basic "+getBase64Encode(objConfig.username+":"+objConfig.password);	
	
	//Content Type application/json is required
	//for all POST Actions - otherwise we will get an 501 error
	var typeHeader		= new Header();
	typeHeader.name		= "content-type";
	typeHeader.value	= "application/json";	
	
	var arrHeaders		= new Array();
	arrHeaders.push(authHeader);
	arrHeaders.push(typeHeader);
	
	return arrHeaders;
}

//Helper function to generate the base64 code
//Base64Encode does not return a value value
//so we need this function as workaround
function getBase64Encode(input){
	var keystr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
	var output = "";
	var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
	var i = 0;
 
	while (i < input.length) {
  		chr1 = input.charCodeAt(i++);
		chr2 = input.charCodeAt(i++);
		chr3 = input.charCodeAt(i++);
 
		enc1 = chr1 >> 2;
		enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
		enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
		enc4 = chr3 & 63;
 
		if (isNaN(chr2)) {
			enc3 = enc4 = 64;
		} else if (isNaN(chr3)) {
			enc4 = 64;
		}
 
		output = output +
		keystr.charAt(enc1) + keystr.charAt(enc2) +
		keystr.charAt(enc3) + keystr.charAt(enc4);
 	}
 
	return output;	
}

 

To use this function to have to change the url, username, password in the objConfig.

 

 

Has anyone an idea, how I can read and use the Response Body for responses != 200?

Or is it not possible at the moment to use this and I have to open an Support Ticket?

 

 

My Environment is:

* Windows 2008 Server

* HPSM 9.32.0016 (Client/Server)

* MSSQL Server

 

 

 

 

Thanks!

0 Likes
1 Solution

Accepted Solutions
MT03
New Member.

Re: [SM9.32] Restful Response in Javascript

Jump to solution

I found the solution.

 

There is a ScriptLibrary "RestfulConstant". This Library has a function names "getHttpStatus".

 

If I change the value for "badval" from 400 to 200 then I got my required JSON Code with the validation messages.

This is not a really good way but as workaround good enough 🙂

 

 

Maybe this helps some one, which has the same problems.

5 Replies
Abhijit K Acclaimed Contributor.
Acclaimed Contributor.

Re: [SM9.32] Restful Response in Javascript

Jump to solution

Hi,

 

Dont know much about REST protocol but your path should be like

 

http://<servername>:<serverport>/SM/7/IncidentManagement.wsdl

 

Kindly refer to Web Services Guide which comes with SM.

 

Re,

Abhijit K

 

0 Likes
MT03
New Member.

Re: [SM9.32] Restful Response in Javascript

Jump to solution

Hi,

 

 

if I want to use the SOAP api then http://<servername>:<serverport>/SM/7/IncidentManagement.wsdl is the correct url.

 

But the RESTful API uses the following url: http://<servername>:<serverport>/SM/9/rest/incidents

(as descriped in the SM9.32_WebServices.pdf)

0 Likes
Absent Member.. viprom Absent Member..
Absent Member..

Re: [SM9.32] Restful Response in Javascript

Jump to solution

Have you tried with a servername different than "localhost"? Probably the FQDN of the server?

And what about the port? In the examples from the 9.32 WebServices guide port 14930 is used..

I have researched and this looks like an issue with url access.

Before executing it in Restful, make sure the url can be accessed from SM side.

-----
If you find this or other posts helpful, please do not forget to click the Kudo Star or to mark it as a Solution if you are the owner of the thread. Thanks 🙂
0 Likes
MT03
New Member.

Re: [SM9.32] Restful Response in Javascript

Jump to solution

Hi,

 

i think you misunderstood me.

 

I got a connection to the RESTful API (from HPSM side and from an external client) with localhost as servername.

I don't know where you found the 14930 Port, in the webservice documentation which I have, there is no reference to this port, but anyway, the 23080 port in my case works fine.

 

My problem is, that the response in an error case (example: invalid validation) returns a HTTP Header Code 400 instead of 200.

 

And i can only read the complete Response in case of HTTP Header 200. All other HTTP Response message will not shown correctly (for me) - but i need also the response message in case of 400 or 401 to get an better output and for an better error handling.

 

You know what i mean?

 

 

0 Likes
MT03
New Member.

Re: [SM9.32] Restful Response in Javascript

Jump to solution

I found the solution.

 

There is a ScriptLibrary "RestfulConstant". This Library has a function names "getHttpStatus".

 

If I change the value for "badval" from 400 to 200 then I got my required JSON Code with the validation messages.

This is not a really good way but as workaround good enough 🙂

 

 

Maybe this helps some one, which has the same problems.

The opinions expressed above are the personal opinions of the authors, not of Micro Focus. By using this site, you accept the Terms of Use and Rules of Participation. Certain versions of content ("Material") accessible here may contain branding from Hewlett-Packard Company (now HP Inc.) and Hewlett Packard Enterprise Company. As of September 1, 2017, the Material is now offered by Micro Focus, a separately owned and operated company. Any reference to the HP and Hewlett Packard Enterprise/HPE marks is historical in nature, and the HP and Hewlett Packard Enterprise/HPE marks are the property of their respective owners.