Access to XI SOAP envelope - How to?
Hello there,
Is it possible to get access and manipulate the Standard SOAP envelope headers internally used by XI? Does XI supports this functionality/customization?
I would like to enrich/enhance the XI SOAP headers with some own context data to be used later for end-to-end monitoring outside XI.
Thanks for your feedback.
Cheers,
R.
Thanks Anupam and Jenny for your kind response.
I am wrking on PI 7.0. I dnt want soap envelope in payload so I have already checked the 'Do not create response' button still in response message I am getting the soap envelope.
I can use java or xslt but the the structure is not able to read the soap envelope. To read it I need to create same data structure which matches with the soap envelope.
this is the response I am getting through webservice.
<?xml version="1.0" encoding="UTF-8" ?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="urn:enterprise.soap.sforce.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<createResponse>
<result>
<errors>
<message>Config Master Record Type Name value is missing</message>
<statusCode>FIELD_CUSTOM_VALIDATION_EXCEPTION</statusCode>
</errors>
<id xsi:nil="true" />
<success>false</success>
</result>
</createResponse>
</soapenv:Body>
</soapenv:Envelope>
And this is the wsdl structure
<?xml version="1.0" encoding="UTF-8"?>
<ns0:createResponse xmlns:ns0="urn:enterprise.soap.sforce.com">
<ns0:result>
<ns0:errors>
<ns0:fields/>
<ns0:message/>
<ns0:statusCode/>
</ns0:errors>
<ns0:id/>
<ns0:success/>
</ns0:result>
</ns0:createResponse>
Because of the soap envelope it is not able to read it. I have to create new structure.
Experts please help me to solve this problem.
Regards,
Jayesh.
Similar Messages
-
WCF request with utl_dbws how to add Header into SOAP envelope
I’m trying to make WCF (Windows Communication Foundation) request and using for that utl_dbws package.
After making request (calling utl_dbws.invoke) it will give error “ORA-29532: Java call terminated by uncaught Java exception: javax.xml.rpc.soap.SOAPFaultException: The server was unable to process the request due to an internal error. For more information about the error, either turn on IncludeExceptionDetailInFaults (either from ServiceBehaviorAttribute or from the <serviceDebug> configuration behavior) on the server in order to send the exception information back to the client, or turn on tracing as per the Microsoft .NET Framework 3.0 SDK documentation and inspect t”
I turned on logging (utl_dbws.set_logger_level) I see that system sends standard SOAP envelope and does not have Header at all. How can I use my own SOAP envelope and/or add Header.
All info that logging give is:
ServiceFacotory: oracle.j2ee.ws.client.ServiceFactoryImpl@eec8c59c
WSDL: null
Service: oracle.j2ee.ws.client.BasicService@7c110d23
*** Created service: -677524827 - oracle.jpub.runtime.dbws.DbwsProxy$ServiceProxy@562bd0c4 ***
ServiceProxy.get(-677524827) = oracle.jpub.runtime.dbws.DbwsProxy$ServiceProxy@562bd0c4
getOperationInfo return NULL: port={http://tempuri.org/Service/}BasicHttpBinding_Service, operation={http://tempuri.org/Service/}GetLov
setProperty(javax.xml.rpc.soap.http.soapaction.use, true)
setProperty(javax.xml.rpc.soap.http.soapaction.uri, http://tempuri.org/Service/GetLov)
setProperty(javax.xml.rpc.encodingstyle.namespace.uri, http://www.w3.org/2005/08/addressing)
setProperty(javax.xml.rpc.security.auth.username, DefaultUser)
setProperty(javax.xml.rpc.security.auth.password, MySecretPassword)
<GetLOV xmlns="http://tempuri.org/"> <request xmlns:d4p1="http://schemas.datacontract.org/2004/07/x.y.z.LOV.Request" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <d4p1:AgentCode>AGENT</d4p1:AgentCode> <d4p1:Language>ENG</d4p1:Language> <d4p1:ProcessName>test</d4p1:ProcessName> </request></GetLOV>
Attribute 0: http://tempuri.org/: xmlns, http://tempuri.org/
createElement(GetLOV,null,http://tempuri.org/)
Attribute 0: http://tempuri.org/: xmlns, http://tempuri.org/
dbwsproxy.element.node.child.0: 1, null
dbwsproxy.add.map: d4p1, http://schemas.datacontract.org/2004/07/x.y.z.LOV.Request
Attribute 0: http://schemas.datacontract.org/2004/07/x.y.z.LOV.Request: xmlns:d4p1, http://schemas.datacontract.org/2004/07/x.y.z.LOV.Request
dbwsproxy.add.map: i, http://www.w3.org/2001/XMLSchema-instance
Attribute 1: http://www.w3.org/2001/XMLSchema-instance: xmlns:i, http://www.w3.org/2001/XMLSchema-instance
createElement(request,null,http://tempuri.org/)
dbwsproxy.add.soap.element.namespace: d4p1, http://schemas.datacontract.org/2004/07/x.y.z.LOV.Request
Attribute 0: http://schemas.datacontract.org/2004/07/x.y.z.LOV.Request: xmlns:d4p1, http://schemas.datacontract.org/2004/07/x.y.z.LOV.Request
dbwsproxy.add.soap.element.namespace: i, http://www.w3.org/2001/XMLSchema-instance
Attribute 1: http://www.w3.org/2001/XMLSchema-instance: xmlns:i, http://www.w3.org/2001/XMLSchema-instance
dbwsproxy.element.node.child.0: 1, null
dbwsproxy.lookup.map: d4p1, http://schemas.datacontract.org/2004/07/x.y.z.LOV.Request
createElement(d4p1:AgentCode,null,http://schemas.datacontract.org/2004/07/x.y.z.LOV.Request)
dbwsproxy.text.node.child.0: 3, E01306
dbwsproxy.element.node.child.1: 1, null
dbwsproxy.lookup.map: d4p1, http://schemas.datacontract.org/2004/07/x.y.z.LOV.Request
createElement(d4p1:Language,null,http://schemas.datacontract.org/2004/07/x.y.z.LOV.Request)
dbwsproxy.text.node.child.0: 3, ENG
dbwsproxy.element.node.child.2: 1, null
dbwsproxy.lookup.map: d4p1, http://schemas.datacontract.org/2004/07/x.y.z.LOV.Request
createElement(d4p1:ProcessName,null,http://schemas.datacontract.org/2004/07/x.y.z.LOV.Request)
dbwsproxy.text.node.child.0: 3, tesr
request:
<GetLOV xmlns="http://tempuri.org/">
<request xmlns:d4p1="http://schemas.datacontract.org/2004/07/x.y.z.LOV.Request" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/">
<d4p1:AgentCode>AGENT</d4p1:AgentCode>
<d4p1:Language>ENG</d4p1:Language>
<d4p1:ProcessName>test</d4p1:ProcessName>
</request>
</GetLOV>
13.05.2010 14:17:28 oracle.j2ee.ws.client.ClientMessages infoAboutToInvokeCallForEndpoint
INFO: Trying to connect to URL: https://x.y.z/WS/ Service.svc
13.05.2010 14:17:30 oracle.j2ee.ws.client.StreamingSender _sendImpl
FINE: StreamingSender.request:<?xml version="1.0" encoding="UTF-8"?><env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><env:Body><GetLOV xmlns="http://tempuri.org/"><request xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:d4p1="http://schemas.datacontract.org/2004/07/x.y.z.LOV.Request"><d4p1:AgentCode>AGENT</d4p1:AgentCode><d4p1:Language>ENG</d4p1:Language><d4p1:ProcessName>test</d4p1:ProcessName></request></GetLOV></env:Body></env:Envelope>
13.05.2010 14:17:30 oracle.j2ee.ws.client.StreamingSender _sendImpl
FINE: StreamingSender.response:<?xml version="1.0" encoding="UTF-8"?><s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><s:Fault><faultcode xmlns:a="http://schemas.microsoft.com/net/2005/12/windowscommunicationfoundation/dispatcher">a:InternalServiceFault</faultcode><faultstring xml:lang="et-EE">The server was unable to process the request due to an internal error. For more information about the error, either turn on IncludeExceptionDetailInFaults (either from ServiceBehaviorAttribute or from the <serviceDebug> configuration behavior) on the server in order to send the exception information back to the client, or turn on tracing as per the Microsoft .NET Framework 3.0 SDK documentation and inspect the server trace logs.</faultstring></s:Fault></s:Body></s:Envelope>
Exception in thread "Root Thread" javax.xml.rpc.soap.SOAPFaultException: The server was unable to process the request due to an internal error. For more information about the error, either turn on IncludeExceptionDetailInFaults (either from ServiceBehaviorAttribute or from the <serviceDebug> configuration behavior) on the server in order to send the exception information back to the client, or turn on tracing as per the Microsoft .NET Framework 3.0 SDK documentation and inspect the server trace logs.
at oracle.j2ee.ws.client.StreamingSender._raiseFault(StreamingSender.java:559)
at oracle.j2ee.ws.client.StreamingSender._sendImpl(StreamingSender.java)
at oracle.j2ee.ws.client.StreamingSender._send(StreamingSender.java:112)
at oracle.j2ee.ws.client.dii.CallInvokerImpl.directInvoke(CallInvokerImpl.java:705)
at oracle.j2ee.ws.client.dii.BasicCall.directInvoke(BasicCall.java:692)
at oracle.j2ee.ws.client.dii.BasicCall.invoke(BasicCall.java:598)
at oracle.jpub.runtime.dbws.DbwsProxy$CallProxy.invokeProxy(Unknown Source)
at oracle.jpub.runtime.dbws.DbwsProxy$CallProxy.access$2600(Unknown Source)
at oracle.jpub.runtime.dbws.DbwsProxy.invokeProxy(Unknown Source)HTTP is HTPP... mostly.
In other words, the application protocol is stand and specified in RFC2616 (http://www.w3.org/Protocols/rfc2616/rfc2616.html)
The exception is specific proprietary extensions.. like for example Microsoft's NTLM authentication handshake.
The UTL_HTTP interface supports the protocol pretty well as per the protocol's specification. So using it to interact with a a web service should not be a major issue. The protocol is standard (e.g. POST command is used to supply the payload to the web service). The only real issue is formatting the payload for that as per what the web service expect. And that has nothing to do with HTTP itself - or UTL_HTTP. It is simply the delivering mechanism.
Getting that mechanism to work is fairly easy and should not pose a problem. Instead I suggest you focus on exactly how the HTTP payload needs to look like. Does that web service expects any specific name-values in the header? What does it expect in the body? Etc. -
How to capture SOAP fault when using "Do not use SOAP envelope" parameter
Hi,
we have a synchronous RFC -> XI -> Web Service scenario. The Web Service requires some custom SOAP header elements for user authorization which forced us create the entire SOAP message in a message mapping and to set the "Do not use SOAP envelope" parameter in the receiving SOAP adapter.
In order to capture the SOAP fault message from the Web Service we have created a message interface with a fault message and also created an interface mapping with a fault message mapping.
Our problem is that the fault message is not populated when we get a SOAP fault message back from the Web Service. Is this due to the fact that we have set the "Do not use SOAP envelope" parameter?
Thanks in advance!
Stefan
Message was edited by:
Stefan NilssonHi Bhavesh,
I have exaactly same scenario. But the only difference is that the Successful payload is also not coming into PI.
The request is successfully hittng the webservice.
Please guide me on how to capture the paylod.
I am using the WSDL provided by the thirdparty but sill the message is not coming into PI. -
How to build my own SOAP envelope
Hi
after a lot of work I have now realised that my SOAP to SOAP scenario can't use SAP XI std SOAP ENVELOPE on the receiver part.
How to I build my own SOAP ENV in my RECEIVER payload? iMaybe in the mapping or in the WSDL/XSD?
Any guides or experienses are welcome
hope someone can help
cheersHi Bowie,
Here is one possible approach...
1) Set "Do Not Use SOAP Envelope" in your Receiver SOAP Adapter.
2) Add this xsl as a second step in your interface mapping.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
<env:Body>
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</env:Body>
</env:Envelope>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
You can then modify the soap envelope nodes above to create what you need.
-Russ -
OSB: how to remove soap envelope from the $body
Hi,
In Assign activity when i assign: xquF1:url-decode(fn-bea:serialize($body),"UTF-8") = variable1,i am getting:
$variable1 =
<soap-env:Body xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
<MESSAGE>
<aa>12</aa>
<bb>34</bb>
</MESSAGE>
</soap-env:Body>
How should i remove 'soap-env:Body' from the above xml. I need only:
$variable1 =
<MESSAGE>
<aa>12</aa>
<bb>34</bb>
</MESSAGE>
Kindly advise how to acheive the same.
Thanks in advance.
Edited by: user9223904 on Apr 17, 2013 2:25 AM
Edited by: user9223904 on Apr 17, 2013 2:26 AMjust use $body/* and you will have what u wanted.
-
How to override the default SOAP envelope prefix?
I have a Web service as an external reference. In run-time WebLogic generates SOAP messages with a default prefix <env:Envelope xmlns:env=http://schemas.xmlsoap.org/soap/envelope/”…>. Normally this is fine. However the Web service required a prefix as <soapenv:…>. How can I have WebLogic generate soap envelope prefix as soapenv instead env?
hello!
It's possible. You must implement handler and change envelope and body prefix. Here is example:
public class WsHandler implements SOAPHandler<SOAPMessageContext> {
public boolean handleMessage(SOAPMessageContext context) {
Boolean outboundProperty =
(Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if (outboundProperty.booleanValue()) {
try {
SOAPEnvelope envelope = context.getMessage().getSOAPPart().getEnvelope();
envelope.setPrefix("soapenv");
envelope.removeNamespaceDeclaration("env"); //remove old prefix
envelope.getBody().setPrefix("soapenv");
context.getMessage().saveChanges();
} catch (Exception e) {
throw new ProtocolException(e);
} -
How to create soap envelope structure
Hello Friends,
I am working on a RFC to webservice sync scenario.Here I am getting response from webservice in soap envelope form which is not matching with my wsdl response structure. I have tried to create the envelope structure manually but i dint get success. Can any body guide me how to over come with it.
(I have already checked 'Do not create soap envelop' in receiver soap addapter).
Regards,
jayesh.Thanks Anupam and Jenny for your kind response.
I am wrking on PI 7.0. I dnt want soap envelope in payload so I have already checked the 'Do not create response' button still in response message I am getting the soap envelope.
I can use java or xslt but the the structure is not able to read the soap envelope. To read it I need to create same data structure which matches with the soap envelope.
this is the response I am getting through webservice.
<?xml version="1.0" encoding="UTF-8" ?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="urn:enterprise.soap.sforce.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<createResponse>
<result>
<errors>
<message>Config Master Record Type Name value is missing</message>
<statusCode>FIELD_CUSTOM_VALIDATION_EXCEPTION</statusCode>
</errors>
<id xsi:nil="true" />
<success>false</success>
</result>
</createResponse>
</soapenv:Body>
</soapenv:Envelope>
And this is the wsdl structure
<?xml version="1.0" encoding="UTF-8"?>
<ns0:createResponse xmlns:ns0="urn:enterprise.soap.sforce.com">
<ns0:result>
<ns0:errors>
<ns0:fields/>
<ns0:message/>
<ns0:statusCode/>
</ns0:errors>
<ns0:id/>
<ns0:success/>
</ns0:result>
</ns0:createResponse>
Because of the soap envelope it is not able to read it. I have to create new structure.
Experts please help me to solve this problem.
Regards,
Jayesh. -
How much commands possible in a SOAP Envelope?
Hi all!
How much commands are possible in a single SOAP transaction?
Best regards
MarianDo you mean like this???
<b>BatchInteract Interface Structure</b>
<i>The BatchInteract method enables you to perform multiple transactions in the database using a single SOAP request message. For example, you can add 1000 items to the database in a single SOAP request message.
The main advantage of using this method instead of the Interact method is that if a single transaction fails all remaining transactions are not affected.
The BatchInteract structure consists of an Envelopes element that contains a separate Envelope element for each transaction as shown below.
</i>
xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
<Envelopes>
<Envelope>
</Envelope>
<Envelope>
</Envelope>
</Envelopes>
The structure of each envelope is the same as described in DI Server SOAP Message Structure of SDK. -
How To Create SOAP Envelop For WSDL
Hi Friends,
I have created one webservice WSDL and i want to create SOAP Envelop for this.
Can any one help me out how to create SOAP Envelop based on WSDL.
***************My WSDL***********************************
<?xml version="1.0" encoding="UTF-8" ?>
- <!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is Oracle JAX-WS 2.1.5.
-->
- <!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is Oracle JAX-WS 2.1.5.
-->
- <definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://annotation/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://annotation/" name="MyCompanyWS">
- <types>
- <xsd:schema>
<xsd:import namespace="http://annotation/" schemaLocation="http://localhost:7101/WebService-Annotation-context-root/MyCompanyPort?xsd=1" />
</xsd:schema>
</types>
- <message name="setMyDepts">
<part name="parameters" element="tns:setMyDepts" />
</message>
- <message name="setMyDeptsResponse">
<part name="parameters" element="tns:setMyDeptsResponse" />
</message>
- <message name="getMyDepts">
<part name="parameters" element="tns:getMyDepts" />
</message>
- <message name="getMyDeptsResponse">
<part name="parameters" element="tns:getMyDeptsResponse" />
</message>
- <message name="addEmployeeToDept">
<part name="parameters" element="tns:addEmployeeToDept" />
</message>
- <message name="addEmployeeToDeptResponse">
<part name="parameters" element="tns:addEmployeeToDeptResponse" />
</message>
- <message name="getDeptInfo">
<part name="parameters" element="tns:getDeptInfo" />
</message>
- <message name="getDeptInfoResponse">
<part name="parameters" element="tns:getDeptInfoResponse" />
</message>
- <portType name="MyCompany">
- <operation name="setMyDepts">
<input message="tns:setMyDepts" />
<output message="tns:setMyDeptsResponse" />
</operation>
- <operation name="getMyDepts">
<input message="tns:getMyDepts" />
<output message="tns:getMyDeptsResponse" />
</operation>
- <operation name="addEmployeeToDept">
<input message="tns:addEmployeeToDept" />
<output message="tns:addEmployeeToDeptResponse" />
</operation>
- <operation name="getDeptInfo">
<input message="tns:getDeptInfo" />
<output message="tns:getDeptInfoResponse" />
</operation>
</portType>
- <binding name="MyCompanyPortBinding" type="tns:MyCompany">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="" />
- <operation name="setMyDepts">
<soap:operation soapAction="" />
- <input>
<soap:body use="literal" />
</input>
- <output>
<soap:body use="literal" />
</output>
</operation>
- <operation name="getMyDepts">
<soap:operation soapAction="" />
- <input>
<soap:body use="literal" />
</input>
- <output>
<soap:body use="literal" />
</output>
</operation>
- <operation name="addEmployeeToDept">
<soap:operation soapAction="" />
- <input>
<soap:body use="literal" />
</input>
- <output>
<soap:body use="literal" />
</output>
</operation>
- <operation name="getDeptInfo">
<soap:operation soapAction="" />
- <input>
<soap:body use="literal" />
</input>
- <output>
<soap:body use="literal" />
</output>
</operation>
</binding>
- <service name="MyCompanyWS">
- <port name="MyCompanyPort" binding="tns:MyCompanyPortBinding">
<soap:address location="http://localhost:7101/WebService-Annotation-context-root/MyCompanyPort" />
</port>
</service>
</definitions>
Thanks in Advance.
Bachan
Edited by: Bachan on Sep 1, 2010 9:04 PMThanks Sam,
SOAP UI saved my life but that want last long.
But still my issue is not resolved.
I am using a plsql program to take the Values from SOAP envelop and pass it to web-service and get the responce.
I am sure my approach is perfectly fine. because it is working fine with other examples, but mean while i have a WSDL link this is really big and my program is not working for this WSDL link.
infact i am getting the output as the same XML of URL.
Let me know if u can help me out.
Thanks
Bachan. -
How to resolve error "No SOAP Envelope but 1 {} PARAMETERS"
Hi,
I have configured an interface where the sender (SAP system) sends out a message via proxy on the Local Integration Engine, which is after XI processing supposed to be posted via HTTP (using the SOAP Adapter).
The message is processed correctly by XI, but fails to pass the SOAP Comm Channel. The error message in the Communication Channel Monitoring reads:
SOAP: call failed: java.io.IOException:No SOAP Envelope but 1 {} PARAMETERS; HTTP 200 OK
Can anyone help me understand what this means and how I can resolve this? Thanks!Dear Johannes,
Is the SOAP call taking place synchronously ? It looks like at the end of your SOAP channel, system is not responding as expected by XI (you seem to receive the regular HTTP 200 OK code, but it does not match SOAP protocol requirements) ...
I've had such issues when web services were down due to web server issue (in this case, you just get, for instance, HTTP 500 response body, which not really SOAP compliant)
Rgds
Chris -
How to create a new namespace in SOAP envelope?
I'm trying to create SOAP envelope like the following:
<my:Envelope xmlns:my="http://my.com/">
<my:Header/>
<my:Body/>
</my:Envelope>and the following are the codes: SOAPFactory soapFactory = SOAPFactory.newInstance();
MessageFactory factory = MessageFactory.newInstance();
SOAPMessage msg = factory.createMessage();
SOAPPart part = msg.getSOAPPart();
SOAPEnvelope env = part.getEnvelope();
SOAPElement name = env.addNamespaceDeclaration("my", "http://my.com/");
msg.writeTo(System.out);However, the code generates the following results: <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:my="http://my.com/">
<SOAP-ENV:Header/>
<SOAP-ENV:Body/>
</SOAP-ENV:Envelope>What should I do to remove the SOAP-ENV namespace? What is the clean way to create a new SOAP envelope?
Appreciate your advice, thank you!OK, I found a way to do it: SOAPFactory soapFactory = SOAPFactory.newInstance();
MessageFactory factory = MessageFactory.newInstance();
SOAPMessage msg = factory.createMessage();
SOAPPart part = msg.getSOAPPart();
SOAPEnvelope env = part.getEnvelope();
// 1) must add the new namespace before deleting the default namespace
SOAPElement name = env.addNamespaceDeclaration("my", "http://my.com/");
// 2) now only we can delete the default namespace
env.removeNamespaceDeclaration("SOAP-ENV");
// 3) then change the prefix of other parts one by one...
env.setPrefix("my");
msg.getSOAPHeader().setPrefix("my");
msg.getSOAPBody().setPrefix("my");Does anyone has a better way (cleaner) to do it? -
PB & web service : how to manipulate soap envelop ?
Hi all,
I am in the process of testing PB's ability to consume an existing web service. I have done some reading left and right.
I can create the proxy , but i always end up having the Cannot invoke webservice messagebox.
Here's my little piece of PB code
PB CODE START
soapconnection conn // Define SoapConnection
checkvatport proxy_obj // Declare proxy
long rVal, lLog
real amount
date date_a
string ls_a,ls_b,ls_c
conn = create soapconnection //Instantiated connection
lLog = conn.SetSoapLogFile ("C:\mySoapLog.log")
rVal = Conn.CreateInstance(proxy_obj, "checkvatport", "")
messagebox("test rval",string(rval))
// Create proxy object
try
date_a = today()
boolean w_t
w_t = TRUE
str_checkvat str1
tns1__checkvatresponse str2
str1.countrycode = "BE"
str1.vatnumber = "0810416786"
ls_a = proxy_obj.checkvat(str1.countryCode,str1.vatNumber,str2.requestdate,str2.valid,str2.address)
messagebox("LS-a",ls_a)
catch ( SoapException e )
messagebox ("Error", "Cannot invoke Web service")
// error handling
end try
destroy conn
PB CODE END
And here's the soaplog contents
SOAPLOG START
CLOSED
REQUEST:
CLOSED
POST /taxation_customs/vies/services/checkVatService HTTP/1.1
Host: ec.europa.eu
Connection: Keep-Alive
User-Agent: EasySoap++/0.6
Content-Type: text/xml; charset=utf-8
SOAPAction: "urn:ec.europa.eu:taxud:vies:services:checkVat#checkVat"
Content-Length: 654
<E:Envelope
xmlns:E="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:A="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:s="http://www.w3.org/2001/XMLSchema-instance"
xmlns:y="http://www.w3.org/2001/XMLSchema"
E:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<E:Body>
<m:checkVat
xmlns:m="urn:ec.europa.eu:taxud:vies:services:checkVat:types">
<ns1:countryCode
xmlns:ns1="urn:ec.europa.eu:taxud:vies:services:checkVat"
s:type="y:string">BE</ns1:countryCode>
<ns2:vatNumber
xmlns:ns2="urn:ec.europa.eu:taxud:vies:services:checkVat"
s:type="y:string">0810416786</ns2:vatNumber>
</m:checkVat>
</E:Body>
</E:Envelope>
RESPONSE:
HTTP/1.1 500 Internal Server Error
Date: Wed, 04 Jun 2014 09:33:11 GMT
Transfer-Encoding: chunked
Content-Type: text/xml; charset=UTF-8
Server: Europa
Connection: Keep-Alive
Transfer is Chunked!
01d7
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><soap:Fault><faultcode>soap:Client</faultcode><faultstring>Unmarshalling Error: unexpected element (uri:"urn:ec.europa.eu:taxud:vies:services:checkVat", local:"countryCode"). Expected elements are <{urn:ec.europa.eu:taxud:vies:services:checkVat:types}vatNumber>,<{urn:ec.europa.eu:taxud:vies:services:checkVat:types}countryCode> </faultstring></soap:Fault></soap:Body></soap:Envelope>
0000
GetChunkLength: 01d7 = 471
Connection Disconnected
SOAPLOG END
Now i tried the to cut and paste the above soap envelop in SOAPUI , and it gives me the exact same error message as in the soaplog.
I then tried creating a request through SOAPUI but based on the wdsl ,SOAPUI is giving me a different soap envelop as the one PB generated ?
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:ec.europa.eu:taxud:vies:services:checkVat:types">
<soapenv:Header/>
<soapenv:Body>
<urn:checkVat>
<urn:countryCode>?</urn:countryCode>
<urn:vatNumber>?</urn:vatNumber>
</urn:checkVat>
</soapenv:Body>
</soapenv:Envelope>
If i enter parameters in the above envelop and check it through SOAPUI , i end up having the result i want.
Is there any way we can manipulate the soap envelop contents ? Or does anyone have any idea why the soap envelop generated by PB ends up having the above mentioned error in the soaplog file ?
What am i missing ?
TIA
JohnYou're using the EasySOAP proxy. You didn't mention what version of PowerBuilder, but if you're using a version that supports the .Net engine instead use that. The EasySOAP web service support is quite old.
Once you do that you won't be able to use the log. Instead, use something like Fiddler to trap the request and response. -
Receive complete SOAP Envelope as message
Dear all
I have a web service that I have to consume which has a signature value in the SOAP header. In order that I can validate the signature with the message I would like to receive the complete SOAP envelope as (XML) message (<envelope>...<soap-env:header>...</soap-env:header>...<soap-env:body></soap-env:body></envelope>).
I couldn't find a solution for this.
Currently I use the WCF-Custom adapter to receive the multi part message (xml schemas created with svcutil) and receive the body as XML file. I also know how to access the SOAP header in the message but I would like to know if its possible to receive the
complete envelope as message.
Best regards
JeromeOrchestration subscription includes value for BTS.MessageType context property, this mean you can't start orchestration with the soap envelope message type because the XmlDisassembler Component will discard the soap:Envelope content and the messaging engine
will only get the soap:Body content – so at the end of the process, BTS.MessageType context property will be set to the actual message type of content under soap:Body section and the orchestration will never start with the type soap:Envelope.
In case you need to process the entire soap:Envelope inside orchestration:
Use PassThruReceive pipeline.
Define message of type BTS.soap_envelope_1__1 message inside the orchestration (Message Type > schemas > from referenced assembly > Microsoft.BizTalk.GlobalPropertySchemas).
Use Xml Document as the incoming message.
Assign the incoming Xml Document message to the BTS.soap_envelope_1__1 message.
Reference :
http://pinhask.blogspot.in/2008/06/processing-soap-envelope-within-biztalk.html
Thanks
Abhishek -
JAVA/ XSLT Mapping to Create a SOAP Envelope
Hello,
I have a File to SOAP scenario and it requires the SOAP message with a custom SOAP envelope. I have searched SDN and could only find that SOAP envelope can be created using a JAVA or XSLT mapping. However, I could not find any blog/ article which will help me understand, with an example, how this is actually coded (creating of a custom SOAP envelope).
Can anyone please point me to a valid blog/ article/ wiki which describes the procedure?
Thanks,
Pankaj.
P.S. Please no spamming of post with links on SOAP Envelope; I have already searched on SDNHello,
Here is a wiki using PI 7.1
https://wiki.sdn.sap.com/wiki/display/XI/SampleJAVAMappingcodeusingPI7.1+API
If you want to create a SOAP Envelope, comment out the codes
private static final DynamicConfigurationKey KEY_FILENAME =
DynamicConfigurationKey.create("http://sap.com/xi/XI/System/File","FileName");
String inParam = arg0.getInputParameters().getString("PARAM_IN1");
getTrace().addInfo("Input Parameter: " +inParam);
int offset = inData.indexOf(inParam);
//7. Reader Message ID from Message Header
InputHeader messageHeader = arg0.getInputHeader();
String messageId = messageHeader.getMessageId();
//8. A DynamicConfiguration is a map containing adapter specific message attributes.
// It associates DynamicConfigurationKeys with string values. The DynamicConfiguration object is obtained using
// method getDynamicConfiguration()of class com.sap.aii.mapping.api.TransformationInput;
DynamicConfiguration conf = arg0.getDynamicConfiguration();
conf.put(KEY_FILENAME, "This Test file is set by JAVA Mapping");
String outData = "";if(offset > 0){
int offset1 = inData.indexOf(">", offset);
String StartString =inData.substring(0,offset1);
String DocumentNameSpace = " xmlns=\"urn:iso:std:iso:20022:tech:xsd:pain.002.001.02\"";
String RemainingString = inData.substring(offset1);
lastly, instead of using
outData = StartString + DocumentNameSpace + RemainingString;
replace it with something like this
String outData = "";
outData = "<soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:tem=\"http://yournamespace/\"><soap:Header/><soap:Body>"+inData.substring(inData.indexOf("?>")+2)+"</soap:Body></soap:Envelope>";
Hope this helps,
Mark -
Generating SOAP Envelope when DO NOT USE ENVELOPE option is marked
My scenario: SPROXY => XI => 3rdParty WebService. Communication is synchronous. I've a problem with soap envelope. It is required by webservice, but when I use standard soap envelope generated by SAP I've a problem with receiving response from webservice.
So I want to create my own envelope. For this reason I've used DO NOT USE SOAP ENVELOPE option. Now the challenge comes. How can I create my own soap envelope?
Do you have any working example? Soap envelope should be added to message send from XI to 3rdParty WebService.
Helping answers => a lot of pointsI'm talking about HTTP header.
When I'm sending SOAP request from SAP my whole message looks like when I use soap envelope
POST / HTTP/1.0
Accept: */*
Host: 192.168.132.179:54000
User-Agent: SAP-Messaging-com.sap.aii.messaging/1.0505
Content-ID: <soap-02cce7702b1a11dd9902000c29ee261e[at]sap.com>
Content-Type: text/xml; charset=utf-8
Content-Disposition: attachment;filename="soap-02cce7702b1a11dd9902000c29ee261e[at]sap.com.xml"
Content-Description: SOAP
Content-Length: 259
SOAPACTION:
<SOAP:Envelope xmlns:SOAP='http://schemas.xmlsoap.org/soap/envelope/'><SOAP:Header/><SOAP:Body><ns0:Sd2Ids_SzfExport xmlns:ns0='http://www.dat.de/sdii/ids/Sd2SOAP.wsdl'><arg1>1234567899-0</arg1><arg2>1</arg2></ns0:Sd2Ids_SzfExport></SOAP:Body></SOAP:Envelope>
Always after such request I got and HTTP 411 error.
In opposite, when I'm sending request from e.g. Altova or SoapUI, my message looks:
POST / HTTP/1.1
Content-Type: text/xml; Charset=UTF-8
User-Agent: XML Spy
Host: 192.168.132.179:54000
Content-Length: 489
Connection: Keep-Alive
Cache-Control: no-cache
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<SOAP-ENV:Body>
<m:Sd2Ids_SzfExport xmlns:m="http://www.dat.de/sdii/ids/Sd2SOAP.wsdl">
<arg1 xsi:type="xsd:string">1234567899-0</arg1>
<arg2 xsi:type="xsd:string">1</arg2>
</m:Sd2Ids_SzfExport>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
After that request WebService response is correct.
You can find such differences (except Content-length which is a result of XML message formatting) in those two headers:
- for first is used HTTP 1.0 protocol for later 1.1
- in SAP header an info about attachment is added
After a lot of test I thing that those attachment info in header of HTTP is causing a problem. So I want to use DO NOT USE SOAP ENVELOPE option to generate HTTP header without Content-Disposition and generate SOAP Envelope manually.
Maybe you are looking for
-
Hi, I was wondering if there was a way to control whether or not input appears in the command (MS-DOS) window or not. For example, if I have a program that does something like this: Please enter a Sentence. I am going to the store. presses enter Is t
-
How can I group two annotations with JavaScript?
I create two annotations with JavaScript: var annot1 = this.addAnnot({ page: 0, type: "Square", rect: [150, 150, 180, 180], name: "OnMarketShare", author: "A. C
-
do somebody have a document with detailed steps of how to design a datawarehouse set up using the owb. I don't have any idea about the Mappings and Transformations. Searched in net for documents, didn't find anything. So somebody help.
-
What is the FP_CHECK_DESTINATION_SERVICE output ???
Hi guys, I need to know what is the output from the report FP_CHECK_DESTINATION_SERVICE When I run it (with & without destination service) I get only an information message saying: 9.327 bytes transferred in Is this OK or I have a problem ? Regards,
-
my ipod 4 is detecting in itunes but then when i want to get my video files from the my computer it does not show but sometimes it might and it is getting really annoying it charges and evreything so plaese help it does not even show the icon ipod t