WSO2 : Determining that a message contains a specific element or not - soap

How can i determine that a message contains a specific element? i want to enrich the message if it does not contain specific element, but i do not know how to determine it?
thank you.

You can use the filter mediator to perform content based mediation. Following sample shows your usecase. (1) The filtering was done using the xpath matching. It searches for NOT occurrence of XPath //p:echoString/test, and performs enrich mediation based on that. Following soap body will match the filter. (2)
(1)
<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse" name="messageFilter" transports="http https" startOnLoad="true" trace="disable">
<target>
<inSequence>
<log level="full" separator=","/>
<filter xpath="not(//p:echoString/test)" xmlns:p="http://echo.services.core.carbon.wso2.org" >
<then>
<log separator=",">
<property name="XPath Matched" value="true"/>
</log>
<enrich>
<source clone="true" xpath="//p:echoString/in"/>
<target type="property" property="ORIGINAL_REQ"/>
</enrich>
<log separator=",">
<property name="ORIGINAL_REQ" expression="get-property('ORIGINAL_REQ')"/>
</log>
</then>
<else>
<log separator=",">
<property name="XPath Matched" value="false"/>
</log>
</else>
</filter>
<send>
<endpoint>
<address uri="http://localhost:9763/services/echo"/>
</endpoint>
</send>
</inSequence>
<outSequence>
<log level="full" separator=",">
<property name="OUT-SEQUENCE" value="property_value"/>
</log>
<send/>
</outSequence>
<faultSequence/>
</target>
</proxy>
(2)
<body>
<p:echoString xmlns:p="http://echo.services.core.carbon.wso2.org">
<in>123</in>
<test>testing-node</test>
</p:echoString>
</body>

Related

WSO2 EI 6.6.0 TenantMgtAdminService through proxy

I'm trying to access retrieveTenants method from TenantMgtAdminService.
For this I've created a custom proxy in EI 6.6.0 with the following code :
<?xml version="1.0" encoding="UTF-8"?><proxy xmlns="http://ws.apache.org/ns/synapse" name="Proxy_RetrieveTenants" startOnLoad="true" statistics="disable" trace="disable" transports="http,https">
<target>
<inSequence>
<property name="POST_TO_URI" scope="axis2" value="true"/>
<property xmlns:ns="http://org.apache.synapse/xsd" expression="fn:concat('Basic ', base64Encode('ws.palmsoft:YWRtaW46YWRtaW4'))" name="Authorization" scope="transport"/>
<call>
<endpoint>
<wsdl uri="https://localhost:9443/services/TenantMgtAdminService.TenantMgtAdminServiceHttpsSoap12Endpoint HTTP/1.1"/>
<property name="action" scope="axis2" value="urn:retrieveTenants"/>
<property name="Host" scope="axis2" value="localhost:9443"/>
<property name="Content-Type" scope="axis2" value="application/soap+xml"/>
</endpoint>
</call>
</inSequence>
<outSequence>
<call/>
</outSequence>
<faultSequence/>
</target>
<description/>
</proxy>
When I try the proxy I get the following error :
[2020-03-16 12:33:49,874] ERROR {org.apache.axis2.description.ClientUtils} - The system cannot infer the transport information from the /services/Proxy_RetrieveTenants.Proxy_RetrieveTenantsHttpSoap12Endpoint URL.
[2020-03-16 12:33:49,877] ERROR {org.apache.synapse.core.axis2.Axis2Sender} - Unexpected error during sending message out org.apache.axis2.AxisFault: The system cannot infer the transport information from the /services/Proxy_RetrieveTenants.Proxy_RetrieveTenantsHttpSoap12Endpoint URL.
I'm able to access the same method through SoapUI.
Please what would be wrong with my proxy?
Thks
Érico
Can you please modify the proxy service as follows and try this again.
<?xml version="1.0" encoding="UTF-8"?><proxy xmlns="http://ws.apache.org/ns/synapse" name="Proxy_RetrieveTenants" startOnLoad="true" statistics="disable" trace="disable" transports="http,https">
<target>
<inSequence>
<property name="POST_TO_URI" scope="axis2" value="true"/>
<property xmlns:ns="http://org.apache.synapse/xsd" expression="fn:concat('Basic ', base64Encode('admin:admin'))" name="Authorization" scope="transport"/>
<property name="ContentType" scope="axis2" value="text/xml"/>
<property name="SOAPAction" scope="transport" value="urn:retrieveTenants"/>
<payloadFactory media-type="xml">
<format>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:ser="http://services.mgt.tenant.carbon.wso2.org">
<soap:Header/>
<soap:Body>
<ser:retrieveTenants/>
</soap:Body>
</soap:Envelope>
</format>
<args/>
</payloadFactory>
<call>
<endpoint>
<address format="soap12" uri="https://localhost:9443/services/TenantMgtAdminService.TenantMgtAdminServiceHttpsSoap12Endpoint"/>
</endpoint>
</call>
<respond/>
</inSequence>
<outSequence>
<send/>
</outSequence>
<faultSequence/>
</target>
<description/>

How to use the Fault Mediator to Respond with a Fault

I am trying to use the WSO2 EI Fault mediator but the Fault Response always gives me a void response message. The point here is to try to build custom Fault messages. My Sample API code:
<?xml version="1.0" encoding="UTF-8"?>
<api context="/test" name="TestFaultAPI" xmlns="http://ws.apache.org/ns/synapse">
<resource methods="GET" uri-template="/{teste}">
<inSequence>
<log description="" level="full" separator=";">
<property expression="get-property('uri.var.teste')" name="Path"/>
<property expression="get-property('transport','Content-Type')" name="ContentType"/>
</log>
<filter xpath="get-property('uri.var.teste') != '1234'">
<then>
<log description="" level="full">
<property name="Entrada" value=""Fault Way""/>
</log>
<makefault description="" version="soap11">
<code value="soap11Env:Client" xmlns:soap11Env="http://schemas.xmlsoap.org/soap/envelope/"/>
<reason value="Recruso incorreto"/>
<detail>incorrect Resource</detail>
</makefault>
<respond/>
</then>
<else>
<log level="full">
<property name="Caminho" value=""Corret Way""/>
</log>
<payloadFactory media-type="json">
<format>{
"Status":"Correct Resource"
}</format>
<args/>
</payloadFactory>
<respond/>
</else>
</filter>
</inSequence>
<outSequence/>
<faultSequence>
<log level="full" separator=";">
<property name="Caminho" value=""Entrou Fault Sequence""/>
</log>
<property description="" name="HTTP_SC" scope="axis2" type="INTEGER" value="400"/>
<payloadFactory media-type="json">
<format>{
"codigoErro":$1,
"detalhe":$2
}</format>
<args>
<arg evaluator="xml" expression="get-property('HTTP_SC','axis2')"/>
<arg evaluator="xml" expression="get-property('ERROR_DETAIL')"/>
</args>
</payloadFactory>
<respond/>
</faultSequence>
</resource>
</api>
So I have two questions:
1 - How can I make the custom fault messages response?
2 - Is it possible to use the fault mediator to change the sequence to the 'Fault Sequence' ?
I will put the answers here. Those are results of my study and experiences:
1 - How can I make the custom fault messages response?
The way to do it is use filter mediator for test a rule and build the messages to respond your request.
2 - Is it possible to use the fault mediator to change the sequence to the 'Fault Sequence'?
No. The fault sequence only start to be executed if a fault occurs. You can´t change the execution path by yourself using a mediator.
So It´s possible that other people with more experience then I answer different informations.
[],s
Marcello

WSO2 http endpoint

I would like to create a Dynamic HTTP Endpoint in WSO2. I have a sequence (Tconf) which contains all the property values. I am deriving them, using the Property Mediator. Once I get the variables, I am using the SendMediator to send an rest request. Unfortunately it does not seem to be working. Not sure what I am doing wrong, but none of the properties are getting appended. I can see all the properties when I log them.
<api xmlns="http://ws.apache.org/ns/synapse" name="TririgaApi" context="/tririga">
<resource methods="GET" url-mapping="/employee">
<inSequence>
<sequence key="Tconf"/>
<property xmlns:ns="http://org.apache.synapse/xsd" name="uri.var.service.user" expression="get-property('tri.service.user')"/>
<property xmlns:ns="http://org.apache.synapse/xsd" name="uri.var.service.pass" expression="get-property('tri.service.pass')"/>
<property xmlns:ns="http://org.apache.synapse/xsd" name="uri.var.service.host" expression="get-property('tri.service.host')"/>
<property xmlns:ns="http://org.apache.synapse/xsd" name="uri.var.service.path" expression="get-property('tri.service.path')"/>
<property xmlns:ns="http://org.apache.synapse/xsd" name="uri.var.service.wfName" expression="get-property('triPeople.database.employee.wfName')"/>
<send>
<endpoint>
<http method="GET" uri-template="http://host:port/{uri.service.host}{uri.var.service.path}?USERNAME={uri.var.service.user}&PASSWORD={uri.var.service.pass}&ioName={uri.var.service.wfName}"/>
</endpoint>
</send>
</inSequence>
</resource>
</api>
You can configure your sequence and API like below to acheive your requirnment.
Sequence Config:
<sequence xmlns="http://ws.apache.org/ns/synapse">
<property name="uri.var.service.user" scope="default" type="STRING" value="testuser"/>
<property name="uri.var.service.pass" scope="default" type="STRING" value="testpasswd"/>
<property name="uri.var.service.host" scope="default" type="STRING" value="testhost"/>
<property name="uri.var.service.path" scope="default" type="STRING" value="testpath"/>
<property name="uri.var.service.wfName" scope="default"
type="STRING" value="testwfName"/>
</sequence>
API Config:
<api xmlns="http://ws.apache.org/ns/synapse" name="TririgaApi" context="/tririga">
<resource methods="GET" url-mapping="/employee">
<inSequence>
<log>
<property name="====== API IN =====" value="==== INSEQ ===="/>
</log>
<sequence key="conf:/Tconf"/>
<property name="POST_TO_URI" value="true" scope="axis2"/>
<send>
<endpoint>
<http method="GET" uri-template="http://localhost:9000/{uri.var.service.host}/{uri.var.service.path}?USERNAME={uri.var.service.user}&PASSWORD={uri.var.service.pass}&ioName={uri.var.service.wfName}"/>
</endpoint>
</send>
</inSequence>
</resource>
</api>
Thanks.

wso2esb - REST API Failure doing XML to XML mapping

I am not able to make a call to REST backend from a browser[Rest client] using WSO2 ESB when trying the scenarios listed in Red.
Content Type and MessageFormatter already tried, am i doing something wrong or this is a limitation of REST API.
Source Code for Scenario A :
<?xml version="1.0" encoding="UTF-8"?>
<api xmlns="http://ws.apache.org/ns/synapse" name="InvokeASservice" context="/invokeWS" hostname="10.203.101.76">
<resource methods="GET" uri-template="/{str1}">
<inSequence>
<log level="full" separator=",">
<property name="sequence" value="** Request Recieved**"/>
</log>
<property name="REST_URL_POSTFIX" expression="fn:concat('/get?id=',get-property('uri.var.str1'))" scope="axis2" type="STRING"/>
<send>
<endpoint>
<address uri="http://10.203.101.76:9765/services/PersonInfoService.PersonInfoServiceHttpEndpoint/"/>
</endpoint>
</send>
</inSequence>
<outSequence>
<log level="full" separator=",">
<property name="sequence" value="** Message recieved**"/>
</log>
<property name="ContentType" value="application/xml" scope="axis2"/>
<send/>
</outSequence>
<faultSequence/>
</resource>
</api>
Browser Error:
#####################Update#####################
Scenario A seems to work after changing the source
<api xmlns="http://ws.apache.org/ns/synapse" name="InvokeASservice" context="/invokeWS" hostname="10.203.101.76">
<resource methods="GET" uri-template="/{str1}">
<inSequence>
<log level="full" separator=",">
<property name="sequence" value="** Request Recieved**"/>
</log>
<property name="REST_URL_POSTFIX" expression="fn:concat('/get?id=',get-property('uri.var.str1'))" scope="axis2" type="STRING"/>
<send>
<endpoint>
<address uri="http://10.203.101.76:9765/services/PersonInfoService.PersonInfoServiceHttpEndpoint/"/>
</endpoint>
</send>
</inSequence>
<outSequence>
<send/>
</outSequence>
<faultSequence/>
</resource>
</api>
But, Scenario C is still a unsolved puzzle with the response coming in xml format.
tried adding the following to outSequence. Does not help
<outSequence>
<property name="messageType" value="application/json" scope="axis2" type="STRING"/>
<send/>
</outSequence>

Malformed Response - Invoking one ESB REST service from another

I am relatively new to WSO2 ESB,
Trying to invoke a REST Web service with GET parameter which is hosted on WSO2 ESB through another REST API.
This is a simple Web service(SampleREST) which replies with welcome messsage in XML format,
When i am invoking this service directly; i can see the correct response on browser, shown below
<Message xmlns="http://ws.apache.org/ns/synapse">WelcomeRanjan</Message>
Now i created another REST web service(InvokeSampleRest) which in turn invokes SampleREST web service with the parametrized GET,
the Invoke WebService Client returns me the XML response wrapped inside the mediator xml tag and other malformed tags, shown below
<mediate><<Message xmlns>"http://ws.apache.org/ns/synapse">WelcomeRanjan</Message></<Message xmlns></mediate>
Here is my Code for the SampleREST API
<?xml version="1.0" encoding="UTF-8"?>
<api xmlns="http://ws.apache.org/ns/synapse" name="SampleREST" context="/SampleRest" hostname="10.203.245.47">
<resource methods="GET" uri-template="/{str1}">
<inSequence>
<header name="To" action="remove"/>
<property name="RESPONSE" value="true" scope="default" type="STRING"/>
<property name="NO_ENTITY_BODY" scope="axis2" action="remove"/>
<payloadFactory>
<format>
<Message>$1</Message>
</format>
<args>
<arg expression="get-property('uri.var.str1')"/>
</args>
</payloadFactory>
<log level="full" separator=",">
<property name="sequence" value="*** Got Request ***"/>
</log>
<send/>
</inSequence>
<outSequence/>
<faultSequence/>
</resource>
</api>
The code for the InvokeSampleREST code is as shown below( i am calling SampleREST service from here )
<?xml version="1.0" encoding="UTF-8"?>
<api xmlns="http://ws.apache.org/ns/synapse" name="InvokeSampleREST" context="/InvokeSampleREST" hostname="10.203.245.47">
<resource methods="GET" uri-template="/{str1}">
<inSequence>
<log level="full" separator=","/>
<property name="REST_URL_POSTFIX" expression="fn:concat('/Welcome',get-property('uri.var.str1'))" scope="axis2" type="STRING"/>
<log level="full">
<property name="sequence" value="****Message Sent *** "/>
</log>
<send>
<endpoint>
<address uri="http://10.203.245.47:8280/SampleRest/"/>
</endpoint>
</send>
</inSequence>
<outSequence>
<log level="full" separator=",">
<property name="out" value="** Ouput of Rest call ***"/>
</log>
<property name="ContentType" value="application/xml" scope="axis2" type="STRING"/>
<send/>
</outSequence>
<faultSequence/>
</resource>
</api>
Appreciate any help.
Thanks,
Ranjan
Why are you using two APIs? You can design your flow, in a single API. I mean you can merge them together.
BTW, you need to set the contentType property in your backend API(ie:At SampleREST API)
Because, when you send back the response to "InvokeSampleREST" API, System doesnt know the content-type of the incoming response and try to handle it as text message.
Eg:
<api name="SampleREST" context="/SampleRest" hostname="localhost">
<resource methods="GET" uri-template="/{str1}">
<inSequence>
<header name="To" action="remove"/>
<property name="NO_ENTITY_BODY" scope="axis2" action="remove"/>
<property name="RESPONSE" value="true" scope="default" type="STRING"/>
<payloadFactory>
<format>
<Message>$1</Message>
</format>
<args>
<arg expression="get-property('uri.var.str1')"/>
</args>
</payloadFactory>
<log level="full" separator=",">
<property name="sequence" value="*** Got Request ***"/>
</log>
<property name="Content-Type"
value="application/xml"
scope="transport"
type="STRING"/>
<send/>
</inSequence>
<faultSequence/>
</resource>
Try doing the following change at the InvokeSampleREST API.
At the outSequence, set the messageType as follows before the <send> mediator.
<property name="messageType" value="application/xml" scope="axis2"/>