We have a requirement to call a target via service callout policy. Where the name of the header in the policy should be dynamically set during deployment(can be taken care in the CICD pipeline).We tried using a Java script and assign Message policy both of which throws a class cast exception.
Could you please help in figuring out what the issue could be. Or suggest any alternate approach if any.
Error:
below is my service callout policy.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ServiceCallout async="false" continueOnError="false" enabled="true" name="SC-TargetendpointCall3"> <DisplayName>SC-TargetendpointCall3</DisplayName> <Properties/> <Request clearPayload="true" variable="myRequest3"> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <Set> <Headers> <Header name="Content-Type">{ContentType}</Header> </Headers> <Verb>{request.verb}</Verb> <Path>{sc_urlPath}</Path> </Set> <Copy source="request"> <QueryParams/> </Copy> </Request> <Response>calloutResponseCall3</Response> <HTTPTargetConnection> <URL>http://This is a dummy endpoint</URL> </HTTPTargetConnection> </ServiceCallout>
Solved! Go to Solution.
Vidhya - Can you show the AssignMessage or JS in which you set myRequest2?
In a ServiceCallout, if you specify something like this:
<Request clearPayload="true" variable="myRequest2"> ...
...the policy assumes you have previously set a variable called myRequest2 with a message value.
If you have a prior AssignMessage or JS that simply sets "myRequest2.header.abc", that is not enough. That doesn't create a message object.
In other words, This Will Not Satisfy:
<AssignMessage name='AM-MyMessage'> <AssignVariable> <Name>myRequest2.header.abc</Name> <Value>whatever-i-like</Value> </AssignVariable> </AssignMessage>
And also, this Will Not Satisfy in JS:
context.setVariable('myRequest2.header.abc', 'whatever-i-like');
In both cases, the policy will "work" in that it will succeed with no errors. But the side effect will have been to set a string variable, not to set a message variable.
Instead you need to create a full request message. Like this with AssignMessage:
<AssignMessage name='AM-MyMessage'> <AssignTo createNew='true' transport='http' type='request'>myRequest2</AssignTo> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <Set> <Headers> <Header name='abc'>whatever-you-like</Header> </Headers> </Set> </AssignMessage>
OR, like this in JS:
var url = properties.target + '/oneid/' + id ; var headers = { abc : 'whatever-you-like' }; var req = new Request(url, 'GET', headers); context.setVariable('myRequest2', req);<br>
In the error screenshot, I see myRequest2 value is not a type request message.
I don't see myRequest2 in your policy. Can you check that?
you can try that as request, and test.
Let me know what issue you are seeing now.
hank you .sure will check it out
Vidhya - Can you show the AssignMessage or JS in which you set myRequest2?
In a ServiceCallout, if you specify something like this:
<Request clearPayload="true" variable="myRequest2"> ...
...the policy assumes you have previously set a variable called myRequest2 with a message value.
If you have a prior AssignMessage or JS that simply sets "myRequest2.header.abc", that is not enough. That doesn't create a message object.
In other words, This Will Not Satisfy:
<AssignMessage name='AM-MyMessage'> <AssignVariable> <Name>myRequest2.header.abc</Name> <Value>whatever-i-like</Value> </AssignVariable> </AssignMessage>
And also, this Will Not Satisfy in JS:
context.setVariable('myRequest2.header.abc', 'whatever-i-like');
In both cases, the policy will "work" in that it will succeed with no errors. But the side effect will have been to set a string variable, not to set a message variable.
Instead you need to create a full request message. Like this with AssignMessage:
<AssignMessage name='AM-MyMessage'> <AssignTo createNew='true' transport='http' type='request'>myRequest2</AssignTo> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <Set> <Headers> <Header name='abc'>whatever-you-like</Header> </Headers> </Set> </AssignMessage>
OR, like this in JS:
var url = properties.target + '/oneid/' + id ; var headers = { abc : 'whatever-you-like' }; var req = new Request(url, 'GET', headers); context.setVariable('myRequest2', req);<br>
Hi Dino,
thank you .Sure will try it out.
User | Count |
---|---|
7 | |
2 | |
2 | |
1 | |
1 |