Longchar data for input & output parameters in calling w

Posted by Fuelfire on 03-Jun-2015 08:52

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:

Parameters

inCommonParms

This value is defined as a inCommonParms element in the http://.... namespace.

Example

<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>

Fault details

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.

    Example

    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.

Posted by hmariwa on 17-Jun-2015 11:57

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

All Replies

Posted by Fuelfire on 04-Jun-2015 01:44

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?

Posted by hmariwa on 04-Jun-2015 10:14

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

Posted by Fuelfire on 05-Jun-2015 03:27

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.

Posted by SJProgress on 05-Jun-2015 03:50

Hi,
 
not sure, if this is related here, but we had problems to get Soap-Fault-Detail when answer from Service came with wrong http-code (200 instead of 500)
 
Progress ABL will not treat a soap-fault correctly when it is delivered with http-code 200. This is according to standards, but many service providers use http-code 200 for soap-fault answers.
 
Josef
 
 
Von: Fuelfire [mailto:bounce-Fuelfire@community.progress.com]
Gesendet: Freitag, 5. Juni 2015 10:28
An: TU.OE.General@community.progress.com
Betreff: RE: [Technical Users - OE General] Longchar data for input & output parameters in calling web service. What's wrong?
 
Reply by Fuelfire

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!

Stop receiving emails on this subject.

Flag this post as spam/abuse.

Posted by Fuelfire on 05-Jun-2015 04:45

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).

Posted by hmariwa on 05-Jun-2015 16:25

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

Posted by Fuelfire on 10-Jun-2015 08:33

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.

Posted by hmariwa on 10-Jun-2015 13:14

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

Posted by Fuelfire on 15-Jun-2015 03:48

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!

Posted by hmariwa on 15-Jun-2015 17:02

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

Posted by Fuelfire on 16-Jun-2015 02:40

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!

Posted by hmariwa on 16-Jun-2015 16:40

Hi Andrew,
I was able to simulate the web-server using the WSDL file  you sent me using SOAPUI! ;and I was  also able to extract
the SOAP-DETAIL information using 101B's  ABL SOAP client.. I just needed to modify your ABL code a little bit (your previous code was
trying to read the  root child of the SOAP-DETAIL node instead of the sub-child):
 
Here is the part of ABL code which was modified (also attached is the complete ABL code):
 
    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  hDetailElement.
                        CREATE X-NODEREF hText.
                        ERROR-STATUS:ERROR-OBJECT-DETAIL:SOAP-FAULT-DETAIL:GET-NODE(hNode).
                        IF VALID-HANDLE(hNode)
                        THEN DO:
                          
                           /*this will print the contents of SOAP-FAULT-DETAIL object */
                           SOAPdetailVal = ERROR-STATUS:ERROR-OBJECT-DETAIL:SOAP-FAULT-DETAIL:GET-SERIALIZED().
                            MESSAGE "SOAP-DETAIL =:>" STRING(SOAPdetailVal) VIEW-AS ALERT-BOX.
                           
                            
                            iNumChild = 1.
                            /* get the errorMessage value */
                           
                           /*get the sub-child of the rood node*/
                             hNode:GET-CHILD(hDetailElement,iNumChild).
 
                             MESSAGE "ELEM / NUM-CHILD =>" hDetailElement:LOCAL-NAME ":" hDetailElement:NUM-                
                             CHILDREN VIEW-AS ALERT-BOX.
                           
                            
                            DO WHILE iNumChild <= hDetailElement:NUM-CHILDREN:
                                   
                                    hDetailElement:GET-CHILD(hChild,iNumChild).
                                    IF hDetailElement:LOCAL-NAME = "WSTechnicalException"
                                        OR hDetailElement:LOCAL-NAME = "WSAppTechnicalException"
                                        OR hDetailElement:LOCAL-NAME = "WSAppException"
                                        OR hDetailElement:LOCAL-NAME = "WSAccessException"
                                        OR hDetailElement:LOCAL-NAME = "WSVerificationException"
                                    THEN DO:
                                        IF hChild:LOCAL-NAME = "errorCode"
                                        THEN DO:
                                            hChild:GET-CHILD(hText,1).
                                            cErrorCode = hText:NODE-VALUE.
                                        END.
                                        IF hChild:LOCAL-NAME = "errorString"
                                        THEN DO:
                                            hChild: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 */
 
 
[collapse]
From: Fuelfire [mailto:bounce-Fuelfire@community.progress.com]
Sent: Tuesday, June 16, 2015 3:41 AM
To: TU.OE.General@community.progress.com
Subject: RE: [Technical Users - OE General] Longchar data for input & output parameters in calling web service. What's wrong?
 
Reply by Fuelfire

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!

Attachments:
ws.rar
Stop receiving emails on this subject.

Flag this post as spam/abuse.

[/collapse]

Posted by Fuelfire on 17-Jun-2015 02:02

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.

Posted by hmariwa on 17-Jun-2015 11:57

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

Posted by Fuelfire on 18-Jun-2015 01:44

Thank you very much, Heri. Now, it's clear for me. Good luck!

Posted by Fuelfire on 19-Jun-2015 08:41

Install SP3 and SOAP-FAULT-DETAIL became available.

I found this problem in issue list for 10.1B03.

Thanks again to Heri.

Posted by hmariwa on 19-Jun-2015 09:25

Thanks for the feedback and I am glad to hear you resolved the issue.

Heri

This thread is closed