Hello everyone! I newbie in web services and decided to try to call the web service and process the results.
So, I have web service with wsdl. I got a description of the service using bprowsdldoc. I quote a fragment from the description:
inCommonParms
This value is defined as a inCommonParms element in the http://.... namespace.
<inCommonParms> <!-- The following element is optional. --> <userID>string-value</userID> <!-- The following element is optional. --> <branchNumber>string-value</branchNumber> <externalSystemCode>string-value</externalSystemCode> <externalUserCode>string-value</externalUserCode> <!-- The following element is optional. --> <ldapUser>string-value</ldapUser> <!-- The following element is optional. --> <ldapPassword>string-value</ldapPassword> <!-- The following element may occur 1 or more times. --> <inCommonParmsExt> <name>string-value</name> <value>string-value</value> </inCommonParmsExt> </inCommonParms>
The following XML fragments may be sent or received in the SOAP fault detail element. These fragments are accessible through the SOAP Fault handle.
A fault defined as an WSTechnicalException element in the http://...... namespace.
Construct the value as shown in the following example.
<soap:detail xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'> <ns0:WSTechnicalException xmlns:ns0="http://..."> <errorCode>string-value</errorCode> <errorString>string-value</errorString> <errorTrace>string-value</errorTrace> <!-- The following element may occur 1 or more times. --> <errorExt> <name>string-value</name> <value>string-value</value> </errorExt> </ns0:WSTechnicalException> </soap:detail>
When I call the service with certain parameters I have to get the next string: <errorString>KSM2010 Account "1245" does not exist on the database</errorString>.
Here my code:
/* create the SERVER that will connect to the Web service */ CREATE SERVER hWebService. /* connects and gets the WSDL from the Web service */ lReturn = hWebService:CONNECT("-WSDL 'http://xxxx:9080/xx/xx/WSAccountBaseInfo/WSAccountBaseInfo10/wsdl/xx/WSAccountBaseInfo10.wsdl'"). IF lReturn = NO THEN DO: MESSAGE "Could not connect to WebService server" VIEW-AS ALERT-BOX INFO BUTTONS OK. RETURN. END. /* establish what portType from WSDL will be used */ RUN WSAccountBaseInfoPortType SET hWSAccountBaseInfoPortType ON hWebService. IF NOT VALID-HANDLE(hWSAccountBaseInfoPortType) THEN DO: MESSAGE "Could not establish the portType procedure handle" VIEW-AS ALERT-BOX INFO BUTTONS OK. RETURN. END. CREATE X-DOCUMENT hInpDocument. CREATE X-NODEREF hRootElement. CREATE X-NODEREF hNode. CREATE X-NODEREF hText. /* create the inCommonParms element Example: <inCommonParms> <!--Optional:--> <userID>?</userID> <!--Optional:--> <branchNumber>0000</branchNumber> <externalSystemCode>GRCH</externalSystemCode> <externalUserCode>IBSR</externalUserCode> <inCommonParmsExt> </inCommonParmsExt> </inCommonParms> */ hInpDocument:CREATE-NODE(hRootElement,"inCommonParms","ELEMENT"). hInpDocument:APPEND-CHILD(hRootElement). /*hRootElement:SET-ATTRIBUTE("xmlns","urn:OpenEdgeServices:NewCoService- WrappedDocLiteral").*/ /* create the userID element */ hInpDocument:CREATE-NODE(hNode,"userID","ELEMENT"). hRootElement:APPEND-CHILD(hNode). hInpDocument:CREATE-NODE(hText,?,"TEXT"). /* embed the document as a node */ hText:NODE-VALUE = "?". hNode:APPEND-CHILD(hText). /* create the branchNumber element */ hInpDocument:CREATE-NODE(hNode,"branchNumber","ELEMENT"). hRootElement:APPEND-CHILD(hNode). hInpDocument:CREATE-NODE(hText,?,"TEXT"). /* embed the the value of branchNumber as a node */ hText:NODE-VALUE = "0000". hNode:APPEND-CHILD(hText). /* create the externalSystemCode element */ hInpDocument:CREATE-NODE(hNode,"externalSystemCode","ELEMENT"). hRootElement:APPEND-CHILD(hNode). hInpDocument:CREATE-NODE(hText,?,"TEXT"). /* embed the the value of branchNumber as a node */ hText:NODE-VALUE = "GRCH". hNode:APPEND-CHILD(hText). /* create the externalUserCode element */ hInpDocument:CREATE-NODE(hNode,"externalUserCode","ELEMENT"). hRootElement:APPEND-CHILD(hNode). hInpDocument:CREATE-NODE(hText,?,"TEXT"). /* embed the the value of branchNumber as a node */ hText:NODE-VALUE = "IBSR". hNode:APPEND-CHILD(hText). /* serialize the document into a LONGCHAR */ hInpDocument:SAVE("longchar",inCommonParms). hInpDocument:SAVE("FILE", "D:\InCommonParms.xml"). DELETE OBJECT hInpDocument. /* create the inParms element Example: <inParms> <!-- The following element is optional. --> <ean>1245</ean> <!-- The following element is optional. --> <ab>?</ab> <!-- The following element is optional. --> <an>?</an> <!-- The following element is optional. --> <as>?</as> </inParms> */ CREATE X-DOCUMENT hInpDocument. hInpDocument:CREATE-NODE(hRootElement,"inParms","ELEMENT"). hInpDocument:APPEND-CHILD(hRootElement). /*hRootElement:SET-ATTRIBUTE("xmlns","urn:OpenEdgeServices:NewCoService- WrappedDocLiteral").*/ /* create the <ean> element */ hInpDocument:CREATE-NODE(hNode,"ean","ELEMENT"). hRootElement:APPEND-CHILD(hNode). hInpDocument:CREATE-NODE(hText,?,"TEXT"). /*embed the value of <ean> as a node*/ hText:NODE-VALUE = "1245". hNode:APPEND-CHILD(hText). /* create the <ab> element */ hInpDocument:CREATE-NODE(hNode,"ab","ELEMENT"). hRootElement:APPEND-CHILD(hNode). hInpDocument:CREATE-NODE(hText,?,"TEXT"). /* embed the value of <ab> as a node */ hText:NODE-VALUE = "?". hNode:APPEND-CHILD(hText). /* create the <an> element */ hInpDocument:CREATE-NODE(hNode,"an","ELEMENT"). hRootElement:APPEND-CHILD(hNode). hInpDocument:CREATE-NODE(hText,?,"TEXT"). /* embed the the value of <an> as a node */ hText:NODE-VALUE = "?". hNode:APPEND-CHILD(hText). /* create the <as> element */ hInpDocument:CREATE-NODE(hNode,"as","ELEMENT"). hRootElement:APPEND-CHILD(hNode). hInpDocument:CREATE-NODE(hText,?,"TEXT"). /* embed the the value of <as> as a node */ hText:NODE-VALUE = "?". hNode:APPEND-CHILD(hText). /* serialize the document into a LONGCHAR */ hInpDocument:SAVE("longchar",inParms). hInpDocument:SAVE("FILE", "D:\InParms.xml"). /*deleting temp objects*/ DELETE OBJECT hNode. DELETE OBJECT hRootElement. DELETE OBJECT hText. DELETE OBJECT hInpDocument. RUN WSAccountBaseInfoGet IN hWSAccountBaseInfoPortType(INPUT inCommonParms, INPUT inParms, OUTPUT outParms) NO-ERROR. RUN ErrorInfo (OUTPUT lReturn). /* if success, account information should be returned */ IF NOT lReturn THEN DO: /* get the output result returned from the service */ CREATE X-DOCUMENT hInpDocument. CREATE X-NODEREF hRootElement. CREATE X-NODEREF hNode. CREATE X-NODEREF hText. /* get the outParms parameter value */ lReturn = hInpDocument:LOAD("longchar",outParms,FALSE). IF lReturn = FALSE THEN DO: MESSAGE "Could not load document returned from service." VIEW-AS ALERT-BOX. RETURN. END. hInpDocument:GET-DOCUMENT-ELEMENT(hRootElement). IF hRootElement:LOCAL-NAME = "outCommonParms" /*get results*/ THEN DO: END. END. /* CREATE X-DOCUMENT hDoc. hDoc:LOAD("Longchar",outParms,FALSE). hDoc:SAVE("FILE","D:\WSAccountBaseInfoGetResponse.xml"). */ /*Disconnecting from the Web service & deleting all temp objects*/ DELETE PROCEDURE hWSAccountBaseInfoPortType. hWebService:DISCONNECT(). DELETE OBJECT hWebService. /*=============Handling errors==============================*/ PROCEDURE ErrorInfo : DEFINE OUTPUT PARAMETER errorfound AS LOGICAL INITIAL FALSE NO-UNDO. DEFINE VARIABLE cFaultString AS CHAR NO-UNDO. DEFINE VARIABLE cErrorCode AS CHAR NO-UNDO. DEFINE VARIABLE cErrorMessage AS CHAR NO-UNDO. DEFINE VARIABLE hNode AS HANDLE NO-UNDO. DEFINE VARIABLE hChild AS HANDLE NO-UNDO. DEFINE VARIABLE hSubChild AS HANDLE NO-UNDO. DEFINE VARIABLE hText AS HANDLE NO-UNDO. IF ERROR-STATUS:NUM-MESSAGES > 0 THEN DO: IF VALID-HANDLE(ERROR-STATUS:ERROR-OBJECT-DETAIL) THEN DO: cFaultString = ERROR-STATUS:ERROR-OBJECT-DETAIL:SOAP-FAULT-STRING. MESSAGE cFaultString VIEW-AS ALERT-BOX. /*!! next if not be executed */ IF VALID-HANDLE(ERROR-STATUS:ERROR-OBJECT-DETAIL:SOAP-FAULT-DETAIL) THEN DO: MESSAGE "1" VIEW-AS ALERT-BOX. /* parse the the detail element of the SOAP Message */ CREATE X-NODEREF hNode. CREATE X-NODEREF hChild. CREATE X-NODEREF hSubChild. CREATE X-NODEREF hText. ERROR-STATUS:ERROR-OBJECT-DETAIL:SOAP-FAULT-DETAIL:GET-NODE(hNode). IF VALID-HANDLE(hNode) THEN DO: MESSAGE "2" VIEW-AS ALERT-BOX. iNumChild = 1. /* get the errorMessage value */ DO WHILE iNumChild <= hNode:NUM-CHILDREN: hNode:GET-CHILD(hChild,iNumChild). IF hChild:LOCAL-NAME = "WSTechnicalException" OR hChild:LOCAL-NAME = "WSAppTechnicalException" OR hChild:LOCAL-NAME = "WSAppException" OR hChild:LOCAL-NAME = "WSAccessException" OR hChild:LOCAL-NAME = "WSVerificationException" THEN DO: hChild:GET-CHILD(hSubChild,1). IF hSubChild:LOCAL-NAME = "errorCode" THEN DO: hSubChild:GET-CHILD(hText,1). cErrorCode = hText:NODE-VALUE. END. IF hSubChild:LOCAL-NAME = "errorString" THEN DO: hSubChild:GET-CHILD(hText,1). cErrorMessage = hText:NODE-VALUE. END. END. iNumChild = iNumChild + 1. END. /* do while */ END. /* valid handle for hNode */ MESSAGE "The Web service returned the following errors" SKIP cErrorCode SKIP cErrorMessage SKIP VIEW-AS ALERT-BOX. DELETE OBJECT hText. DELETE OBJECT hSubChild. DELETE OBJECT hChild. DELETE OBJECT hNode. END. /* SOAP-FAULT-DETAIL found */ END. /* ERROR-OBJECT-DETAIL found */ errorfound = TRUE. END. END PROCEDURE. /*ErrorInfo*/
The problem is that the service gives me a SOAP-FAULT-STRING and I can not get access to SOAP-FAULT-DETAIL because the handler is not valid (I want to get errorString in Fault). I suspect that I was wrong to pass the input parameters. How else can you explain that I do not get access to ERROR-STATUS:ERROR-OBJECT-DETAIL:SOAP-FAULT-DETAIL? Thanks in advance.
Hi Andrew,
You're right . This may be a bug in 10.1B first release and it was probably resolved in 10.1B03 (10.1B SP3).
Heri
Ok, I rephrase my question. How should I pass the input parameters according to the description of the service?
Now one of my input parameters looks like:
<?xml version="1.0" ?> <inCommonParms> <userID>?</userID> <branchNumber>0000</branchNumber> <externalSystemCode>GRCH</externalSystemCode> <externalUserCode>IBSR</externalUserCode> </inCommonParms>
Then I serialize it into LONGCHAR.
In description (I described it in the first post) this parameter looks like:
<inCommonParms> <!-- The following element is optional. --> <userID>string-value</userID> <!-- The following element is optional. --> <branchNumber>string-value</branchNumber> <externalSystemCode>string-value</externalSystemCode> <externalUserCode>string-value</externalUserCode> <!-- The following element is optional. --> <ldapUser>string-value</ldapUser> <!-- The following element is optional. --> <ldapPassword>string-value</ldapPassword> <!-- The following element may occur 1 or more times. --> <inCommonParmsExt> <name>string-value</name> <value>string-value</value> </inCommonParmsExt> </inCommonParms>
Now the service throws an exception and returns to SOAP-FAULT-STRING this value - "WSCommonTypes10.WSAppTechnicalException".
Description of this exception is:
<soap:detail xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'> <ns0:WSAppTechnicalException xmlns:ns0="http://bla-bla-bla"> <errorCode>string-value</errorCode> <errorString>string-value</errorString> <errorTrace>string-value</errorTrace> <!-- The following element may occur 1 or more times. --> <errorExt> <name>string-value</name> <value>string-value</value> </errorExt> </ns0:WSAppTechnicalException> </soap:detail>
How do I get a detailed description (errorCode and ErrorString) of exception? What am I doing wrong?
Hi:
It is possible that the SOAP error you're getting doesn't required for SOAP-FAULT-DETAIL to be present (Not all SOAP faults have SOAP-Detail element).
Can you attach the copy of the WSDL file?
Thanks
Heri
Hi, Heri!
First of all, I want to emphasize that I began to get the description of the service using -show100style. I decided to call the service manually through the program SOAPUI and saw that the request consists of one input parameter. I got a new description of the service using -show100style and started working with him.
I asked colleagues from other departments to give me the service with other input parameters, so I got no exception, but the resulting data. And I was able to get a result from the service.
I would like to understand why there is no detailed information in SOAP-FAULT-DETAIL? I see the tag "detail" in service response:
<soapenv:Header/> <soapenv:Body> <soapenv:Fault> <faultcode xmlns:p548="http://WSCommonTypes10.XX.XX.XXXXXXX.XX">p548:>WSAppTechnicalException</faultcode> <faultstring>XX.XXXXXXX.XX.XX.WSCommonTypes10.WSAppTechnicalException</faultstring> <detail encodingStyle=''> <p548:WSAppTechnicalException xmlns:p548='http://WSCommonTypes10.XX.XX.XXXXXXX.XX'> <errorCode>KSM2010</errorCode> <errorString>KSM2010 Account '1245' does not exist on the database</errorString> <errorTrace>988396/QUSER/QZDASOINIT</errorTrace> <errorExt> <name>logUID</name> <value>200000004821055</value> </errorExt> </p548:WSAppTechnicalException> </detail> </soapenv:Fault> </soapenv:Body>
Is there a way to get the data from errorCode and errorString? I only get SOAP-FAULT-STRING = " XX.XXXXXXX.XX.XX.WSCommonTypes10.WSAppTechnicalException". That's all.
I put here wsdl:
<?xml version="1.0" encoding="UTF-8"?> <wsdl:definitions name="WSAccountBaseInfo10" targetNamespace="http://WSAccountBaseInfo10.XX.XX.XX.XXXXXXX.XX" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://WSAccountBaseInfo10.XX.XX.XX.XXXXXXX.XX" xmlns:wsct="http://WSCommonTypes10.XX.XX.XX.XXXXXXX.XX" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsio="http://WSAccountBaseInfoInOutParms10.XX.XX.XX.XXXXXXX.XX" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <wsdl:types> <xsd:schema targetNamespace="http://WSAccountBaseInfo10.XX.XX.XX.XXXXXXX.XX"> <xsd:import namespace="http://WSCommonTypes10.XX.XX.XXXXXXX.XX" schemaLocation="../WSCommonTypes10.xsd"/> <xsd:import namespace="http://WSAccountBaseInfoInOutParms10.XX.XX.XX.XXXXXXX.XX" schemaLocation="WSAccountBaseInfoInOutParms10.xsd"/> <xsd:element name="WSAccountBaseInfoGet" type="tns:WSAccountBaseInfoGet"/> <xsd:complexType name="WSAccountBaseInfoGet"> <xsd:sequence> <xsd:element name="inCommonParms" type="wsct:WSCommonParms"/> <xsd:element name="inParms" type="wsio:WSAccountBaseInfoGetInParms"/> </xsd:sequence> </xsd:complexType> <xsd:element name="WSAccountBaseInfoGetResponse" type="tns:WSAccountBaseInfoGetResponse"/> <xsd:complexType name="WSAccountBaseInfoGetResponse"> <xsd:sequence> <xsd:element name="outParms" type="wsio:WSAccountBaseInfoGetOutParms"/> </xsd:sequence> </xsd:complexType> </xsd:schema> </wsdl:types> <wsdl:message name="msgWSAccountBaseInfoGetResponse"> <wsdl:part element="tns:WSAccountBaseInfoGetResponse" name="WSAccountBaseInfoGetResponse"> </wsdl:part> </wsdl:message> <wsdl:message name="msgWSAppException"> <wsdl:part element="wsct:WSAppException" name="WSAppException"> </wsdl:part> </wsdl:message> <wsdl:message name="msgWSAccountBaseInfoGet"> <wsdl:part element="tns:WSAccountBaseInfoGet" name="WSAccountBaseInfoGet"> </wsdl:part> </wsdl:message> <wsdl:message name="msgWSTechnicalException"> <wsdl:part element="wsct:WSTechnicalException" name="WSTechnicalException"> </wsdl:part> </wsdl:message> <wsdl:message name="msgWSVerificationException"> <wsdl:part element="wsct:WSVerificationException" name="WSVerificationException"> </wsdl:part> </wsdl:message> <wsdl:message name="msgWSAccessException"> <wsdl:part element="wsct:WSAccessException" name="WSAccessException"> </wsdl:part> </wsdl:message> <wsdl:message name="msgWSAppTechnicalException"> <wsdl:part element="wsct:WSAppTechnicalException" name="WSAppTechnicalException"> </wsdl:part> </wsdl:message> <wsdl:portType name="WSAccountBaseInfoPortType"> <wsdl:operation name="WSAccountBaseInfoGet"> <wsdl:input message="tns:msgWSAccountBaseInfoGet"> </wsdl:input> <wsdl:output message="tns:msgWSAccountBaseInfoGetResponse"> </wsdl:output> <wsdl:fault message="tns:msgWSTechnicalException" name="WSTechnicalException"> </wsdl:fault> <wsdl:fault message="tns:msgWSAppTechnicalException" name="WSAppTechnicalException"> </wsdl:fault> <wsdl:fault message="tns:msgWSAppException" name="WSAppException"> </wsdl:fault> <wsdl:fault message="tns:msgWSAccessException" name="WSAccessException"> </wsdl:fault> <wsdl:fault message="tns:msgWSVerificationException" name="WSVerificationException"> </wsdl:fault> </wsdl:operation> </wsdl:portType> <wsdl:binding name="WSAccountBaseInfoBinding" type="tns:WSAccountBaseInfoPortType"> <soap:binding style='document' transport='http://schemas.xmlsoap.org/soap/http'/> <wsdl:operation name='WSAccountBaseInfoGet'> <soap:operation soapAction='/XX/XX/WSAccountBaseInfo10#Get'/> <wsdl:input> <soap:body use='literal'/> </wsdl:input> <wsdl:output> <soap:body use='literal'/> </wsdl:output> <wsdl:fault name='WSTechnicalException'> <soap:fault name='WSTechnicalException' use='literal'/> </wsdl:fault> <wsdl:fault name='WSAppTechnicalException'> <soap:fault name='WSAppTechnicalException' use='literal'/> </wsdl:fault> <wsdl:fault name='WSAppException'> <soap:fault name='WSAppException' use='literal'/> </wsdl:fault> <wsdl:fault name='WSAccessException'> <soap:fault name='WSAccessException' use='literal'/> </wsdl:fault> <wsdl:fault name='WSVerificationException'> <soap:fault name='WSVerificationException' use='literal'/> </wsdl:fault> </wsdl:operation> </wsdl:binding> <wsdl:service name='WSAccountBaseInfoService'> <wsdl:port binding='tns:WSAccountBaseInfoBinding' name='WSAccountBaseInfoPort'> <soap:address location='http://xxxxxx:9080/XX/XX/WSAccountBaseInfo/WSAccountBaseInfo10'/> </wsdl:port> </wsdl:service> </wsdl:definitions>
Thanks in advance!
Andrew.
Hi, Heri!
First of all, I want to emphasize that I began to get the description of the service using -show100style. I decided to call the service manually through the program SOAPUI and saw that the request consists of one input parameter. I got a new description of the service using -shov100stul and started working with him.
I asked colleagues from other departments to give me the service with other input parameters, so I got no exception, but the resulting data. And I was able to get a result from the service.
I would like to understand why there is no detailed information in SOAP-FAULT-DETAIL? I see the tag "detail" in service response:
<soapenv:Header/>
<soapenv:Body>
<soapenv:Fault>
<faultcode xmlns:p548="http://WSCommonTypes10.XX.XX.XXXXXXX.XX">p548:>WSAppTechnicalException</faultcode>
<faultstring>XX.XXXXXXX.XX.XX.WSCommonTypes10.WSAppTechnicalException</faultstring>
<detail encodingStyle="">
<p548:WSAppTechnicalException xmlns:p548="http://WSCommonTypes10.XX.XX.XXXXXXX.XX">
<errorCode>KSM2010</errorCode>
<errorString>KSM2010 Account "1245" does not exist on the database</errorString>
<errorTrace>988396/QUSER/QZDASOINIT</errorTrace>
<errorExt>
<name>logUID</name>
<value>200000004821055</value>
</errorExt>
</p548:WSAppTechnicalException>
</detail>
</soapenv:Fault>
</soapenv:Body>
Is there a way to get the data from errorCode and errorString? I only get SOAP-FAULT-STRING = " XX.XXXXXXX.XX.XX.WSCommonTypes10.WSAppTechnicalException". That's all.
I put here wsdl:
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="WSAccountBaseInfo10" targetNamespace="http://WSAccountBaseInfo10.XX.XX.XX.XXXXXXX.XX" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://WSAccountBaseInfo10.XX.XX.XX.XXXXXXX.XX" xmlns:wsct="http://WSCommonTypes10.XX.XX.XX.XXXXXXX.XX" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsio="http://WSAccountBaseInfoInOutParms10.XX.XX.XX.XXXXXXX.XX" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<wsdl:types>
<xsd:schema targetNamespace="http://WSAccountBaseInfo10.XX.XX.XX.XXXXXXX.XX">
<xsd:import namespace="http://WSCommonTypes10.XX.XX.XXXXXXX.XX" schemaLocation="../WSCommonTypes10.xsd"/>
<xsd:import namespace="http://WSAccountBaseInfoInOutParms10.XX.XX.XX.XXXXXXX.XX" schemaLocation="WSAccountBaseInfoInOutParms10.xsd"/>
<xsd:element name="WSAccountBaseInfoGet" type="tns:WSAccountBaseInfoGet"/>
<xsd:complexType name="WSAccountBaseInfoGet">
<xsd:sequence>
<xsd:element name="inCommonParms" type="wsct:WSCommonParms"/>
<xsd:element name="inParms" type="wsio:WSAccountBaseInfoGetInParms"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="WSAccountBaseInfoGetResponse" type="tns:WSAccountBaseInfoGetResponse"/>
<xsd:complexType name="WSAccountBaseInfoGetResponse">
<xsd:sequence>
<xsd:element name="outParms" type="wsio:WSAccountBaseInfoGetOutParms"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
</wsdl:types>
<wsdl:message name="msgWSAccountBaseInfoGetResponse">
<wsdl:part element="tns:WSAccountBaseInfoGetResponse" name="WSAccountBaseInfoGetResponse">
</wsdl:part>
</wsdl:message>
<wsdl:message name="msgWSAppException">
<wsdl:part element="wsct:WSAppException" name="WSAppException">
</wsdl:part>
</wsdl:message>
<wsdl:message name="msgWSAccountBaseInfoGet">
<wsdl:part element="tns:WSAccountBaseInfoGet" name="WSAccountBaseInfoGet">
</wsdl:part>
</wsdl:message>
<wsdl:message name="msgWSTechnicalException">
<wsdl:part element="wsct:WSTechnicalException" name="WSTechnicalException">
</wsdl:part>
</wsdl:message>
<wsdl:message name="msgWSVerificationException">
<wsdl:part element="wsct:WSVerificationException" name="WSVerificationException">
</wsdl:part>
</wsdl:message>
<wsdl:message name="msgWSAccessException">
<wsdl:part element="wsct:WSAccessException" name="WSAccessException">
</wsdl:part>
</wsdl:message>
<wsdl:message name="msgWSAppTechnicalException">
<wsdl:part element="wsct:WSAppTechnicalException" name="WSAppTechnicalException">
</wsdl:part>
</wsdl:message>
<wsdl:portType name="WSAccountBaseInfoPortType">
<wsdl:operation name="WSAccountBaseInfoGet">
<wsdl:input message="tns:msgWSAccountBaseInfoGet">
</wsdl:input>
<wsdl:output message="tns:msgWSAccountBaseInfoGetResponse">
</wsdl:output>
<wsdl:fault message="tns:msgWSTechnicalException" name="WSTechnicalException">
</wsdl:fault>
<wsdl:fault message="tns:msgWSAppTechnicalException" name="WSAppTechnicalException">
</wsdl:fault>
<wsdl:fault message="tns:msgWSAppException" name="WSAppException">
</wsdl:fault>
<wsdl:fault message="tns:msgWSAccessException" name="WSAccessException">
</wsdl:fault>
<wsdl:fault message="tns:msgWSVerificationException" name="WSVerificationException">
</wsdl:fault>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="WSAccountBaseInfoBinding" type="tns:WSAccountBaseInfoPortType">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="WSAccountBaseInfoGet">
<soap:operation soapAction="/XX/XX/WSAccountBaseInfo10#Get"/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
<wsdl:fault name="WSTechnicalException">
<soap:fault name="WSTechnicalException" use="literal"/>
</wsdl:fault>
<wsdl:fault name="WSAppTechnicalException">
<soap:fault name="WSAppTechnicalException" use="literal"/>
</wsdl:fault>
<wsdl:fault name="WSAppException">
<soap:fault name="WSAppException" use="literal"/>
</wsdl:fault>
<wsdl:fault name="WSAccessException">
<soap:fault name="WSAccessException" use="literal"/>
</wsdl:fault>
<wsdl:fault name="WSVerificationException">
<soap:fault name="WSVerificationException" use="literal"/>
</wsdl:fault>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="WSAccountBaseInfoService">
<wsdl:port binding="tns:WSAccountBaseInfoBinding" name="WSAccountBaseInfoPort">
<soap:address location="http://xxxxxx:9080/XX/XX/WSAccountBaseInfo/WSAccountBaseInfo10"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
Thanks in advance!
Flag this post as spam/abuse.
Hi, SJProgress! I was getting an Internal Server Error (500) when calling service with incorrect input. But I do not know what code returns this SOAP-FAULT (WSAppTechnicalException).
Hi Andrew,
The WSDL file you sent is missing its accompanying schemas: WSCommonTypes10.xsd & WSAccountBaseInfoInOutParms10.xsd -make sure to include all the schemas. You can attached all the files in a
zip file.
Also, if you're seeing the SOAP-Detail element, then this may be an ABL engine bug.
Thanks!
Heri
Hi, Heri. I thought that you will be able to determine from the approximate description of wsdl whether the service returns detailed information in response.What do you think about this piece of wsdl:
<wsdl:fault name='WSAppTechnicalException'> <soap:fault name='WSAppTechnicalException' use='literal'/> </wsdl:fault>
I get just the same exception.
This is the response from the service through the program SOAPUI:
<soapenv:Header/> <soapenv:Body> <soapenv:Fault> <faultcode xmlns:p548="http://WSCommonTypes10.xx.xx.xxxxx.xx">p548:>WSAppTechnicalException</faultcode> <faultstring>xx.xxxxx.xx.xx.WSCommonTypes10.WSAppTechnicalException</faultstring> <detail encodingStyle=''> <p548:WSAppTechnicalException xmlns:p548='http://WSCommonTypes10.xx.xx.xxxxx.xx'> <errorCode>KSM2010</errorCode> <errorString>KSM2010 Account '1245' does not exist on the database</errorString> <errorTrace>422096/QUSER/QZDASOINIT</errorTrace> <errorExt> <name>logUID</name> <value>200000004879040</value> </errorExt> </p548:WSAppTechnicalException> </detail> </soapenv:Fault> </soapenv:Body>
I do not see the tag "FaultDetail", but only "detail".
Perhaps this is why I don't get the data in SOAP-FAULT-DETAIL?
Thanks.
Hi Andrew,
"<wsdl:fault name='WSAppTechnicalException'.." just tell the SOAP engine to map the 'WSAppTechnicalException' to a SOAP fault message; thus, when WSAppTechnicalException exception is thrown by the application, the <detail> element of the soap fault will contains the WSAppTechnicalException element as defined in the schema( this must be one the schema which is included with the WSDL file -WSCommonTypes10.xsd or WSAccountBaseInfoInOutParms10.xs).
Looking at the SOAPUI response, it seems that this is the valid SOAP fault and ABL should be able to process the SOAP-FAULT-DETAIL object.
What version of Open Edge are you running your ABL SOAP client? It is also possible that this is an old bug ( I can verify this if you pass me the missing schemas: WSCommonTypes10.xsd & WSAccountBaseInfoInOutParms10.xsd ).
"I do not see the tag "FaultDetail", but only "detail".Perhaps this is why I don't get the data in SOAP-FAULT-DETAIL?"
No <detail> is the valid element.
Thanks!
Heri
Hi, Heri. I apologize for the long silence. I was on vacation. I tried to collect all the xml schemes and wsdl in archive. I changed namespace in all files. I hope that this will not be a problem. I use OpenEdge 10.1B.Thanks!
Hi Andrew,
No problem. Thanks for sending the schemas files. Can you verify that the WSDL file included in the rar file is not corrupted ; both SOAPUI and bprowsdldoc were unable to process it.
Here is the WSDL file extracted from rar file.
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="WSAccountBaseInfo10" targetNamespace="http://WSAccountBaseInfo10.XX.XX.XX.XXXXXXX.XX" xmlns:soap="schemas.xmlsoap.org/.../" xmlns:tns="http://WSAccountBaseInfo10.XX.XX.XX.XXXXXXX.XX" xmlns:wsct="http://WSCommonTypes10.XX.XX.XX.XXXXXXX.XX" xmlns:wsdl="schemas.xmlsoap.org/.../" xmlns:wsio="http://WSAccountBaseInfoInOutParms10.XX.XX.XX.XXXXXXX.XX" xmlns:xsd="www.w3.org/.../XMLSchema">
<wsdl:types>
<xsd:schema targetNamespace="http://WSAccountBaseInfo10.XX.XX.XX.XXXXXXX.XX">
<xsd:import namespace="http://WSCommonTypes10.XX.XX.XXXXXXX.XX" schemaLocation="../WSCommonTypes10.xsd"/>
<xsd:import namespace="http://WSAccountBaseInfoInOutParms10.XX.XX.XX.XXXXXXX.XX" schemaLocation="WSAccountBaseInfoInOutParms10.xsd"/>
<xsd:element name="WSAccountBaseInfoGet" type="tns:WSAccountBaseInfoGet"/>
<xsd:complexType name="WSAccountBaseInfoGet">
<xsd:sequence>
<xsd:element name="inCommonParms" type="wsct:WSCommonParms"/>
<xsd:element name="inParms" type="wsio:WSAccountBaseInfoGetInParms"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="WSAccountBaseInfoGetResponse" type="tns:WSAccountBaseInfoGetResponse"/>
<xsd:complexType name="WSAccountBaseInfoGetResponse">
<xsd:sequence>
<xsd:element name="outParms" type="wsio:WSAccountBaseInfoGetOutParms"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
</wsdl:types>
<wsdl:message name="msgWSAccountBaseInfoGetResponse">
<wsdl:part element="tns:WSAccountBaseInfoGetResponse" name="WSAccountBaseInfoGetResponse">
</wsdl:part>
</wsdl:message>
<wsdl:message name="msgWSAppException">
<wsdl:part element="wsct:WSAppException" name="WSAppException">
</wsdl:part>
</wsdl:message>
<wsdl:message name="msgWSAccountBaseInfoGet">
<wsdl:part element="tns:WSAccountBaseInfoGet" name="WSAccountBaseInfoGet">
</wsdl:part>
</wsdl:message>
<wsdl:message name="msgWSTechnicalException">
<wsdl:part element="wsct:WSTechnicalException" name="WSTechnicalException">
</wsdl:part>
</wsdl:message>
<wsdl:message name="msgWSVerificationException">
<wsdl:part element="wsct:WSVerificationException" name="WSVerificationException">
</wsdl:part>
</wsdl:message>
<wsdl:message name="msgWSAccessException">
<wsdl:part element="wsct:WSAccessException" name="WSAccessException">
</wsdl:part>
</wsdl:message>
<wsdl:message name="msgWSAppTechnicalException">
<wsdl:part element="wsct:WSAppTechnicalException" name="WSAppTechnicalException">
</wsdl:part>
</wsdl:message>
<wsdl:portType name="WSAccountBaseInfoPortType">
<wsdl:operation name="WSAccountBaseInfoGet">
<wsdl:input message="tns:msgWSAccountBaseInfoGet">
</wsdl:input>
<wsdl:output message="tns:msgWSAccountBaseInfoGetResponse">
</wsdl:output>
<wsdl:fault message="tns:msgWSTechnicalException" name="WSTechnicalException">
</wsdl:fault>
<wsdl:fault message="tns:msgWSAppTechnicalException" name="WSAppTechnicalException">
</wsdl:fault>
<wsdl:fault message="tns:msgWSAppException" name="WSAppException">
</wsdl:fault>
<wsdl:fault message="tns:msgWSAccessException" name="WSAccessException">
</wsdl:fault>
<wsdl:fault message="tns:msgWSVerificationException" name="WSVerificationException">
</wsdl:fault>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="WSAccountBaseInfoBinding" type="tns:WSAccountBaseInfoPortType">
<soap:binding style="document" transport="schemas.xmlsoap.org/.../>
<wsdl:operation name="WSAccountBaseInfoGet">
<soap:operation soapAction="/XX/XX/WSAccountBaseInfo10#Get"/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
<wsdl:fault name="WSTechnicalException">
<soap:fault name="WSTechnicalException" use="literal"/>
</wsdl:fault>
<wsdl:fault name="WSAppTechnicalException">
<soap:fault name="WSAppTechnicalException" use="literal"/>
</wsdl:fault>
<wsdl:fault name="WSAppException">
<soap:fault name="WSAppException" use="literal"/>
</wsdl:fault>
<wsdl:fault name="WSAccessException">
<soap:fault name="WSAccessException" use="literal"/>
</wsdl:fault>
<wsdl:fault name="WSVerificationException">
<soap:fault name="WSVerificationException" use="literal"/>
</wsdl:fault>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="WSAccountBaseInfoService">
<wsdl:port binding="tns:WSAccountBaseInfoBinding" name="WSAccountBaseInfoPort">
<soap:address location="http://xxxxxx:9080/XX/XX/WSAccountBaseInfo/WSAccountBaseInfo10"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
Thanks
Heri
Hello, Heri! I could make a mistake. Trying again :-) As you can see I renamed the host and namespace in wsdl. In any case, the service can not be accessed from outside. It's internal bank resource. I don't understand what you want to do, but I hope that the revised version of the files will help you.
Thanks a lot!
Hello, Heri! I could make a mistake. Trying again :-) As you can see I renamed the host and namespace in wsdl. In any case, the service can not be accessed from outside. It's internal bank resource. I don't understand what you want to do, but I hope that the revised version of the files will help you.
Thanks a lot!
Flag this post as spam/abuse.
Hi, Heri!
Perhaps you did not see that when i check VALID-HANDLE(ERROR-STATUS:ERROR-OBJECT-DETAIL:SOAP-FAULT-DETAIL), it's return FALSE. I can not enter into this condition.That's my problem :-)
My version info:
Product Name : Progress
Install Path : C:\Program Files\Progress\OpenEdge
Version : 10.1B
Service Pack : 00
Temp. Fix : 00
Build : 1216
Maybe my problem is a bug? Thanks.
Hi Andrew,
You're right . This may be a bug in 10.1B first release and it was probably resolved in 10.1B03 (10.1B SP3).
Heri
Thank you very much, Heri. Now, it's clear for me. Good luck!
Install SP3 and SOAP-FAULT-DETAIL became available.
I found this problem in issue list for 10.1B03.
Thanks again to Heri.
Thanks for the feedback and I am glad to hear you resolved the issue.
Heri