Longchar data for input & output parameters in calling web service. What's wrong? - Forum - OpenEdge General - Progress Community

Longchar data for input & output parameters in calling web service. What's wrong?

 Forum

Longchar data for input & output parameters in calling web service. What's wrong?

This question is answered

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.

Verified Answer
  • 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
  • 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,
     
    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.

  • 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

  • ws.rar

    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

  • ws.rar

    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!

  • 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 */
     
     
    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.

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