Loading ...
Sorry, an error occurred while loading the content.

undefined result for fault messages

Expand Messages
  • Igor Korolev
    Hello, Could somebody please tell me if there are methods for getting fault text received in SOAP body of a response ? For some reason, SOAP::Lite::call will
    Message 1 of 2 , Jun 26, 2003
    • 0 Attachment
      Hello,

      Could somebody please tell me if there are methods for getting fault
      text received in SOAP body of a
      response ?

      For some reason, SOAP::Lite::call will not return anything if HTTP
      response code is not 200 while current SOAP standard
      http://www.w3.org/TR/2003/REC-soap12-part0-20030624/
      says that

      If an error occurs processing the request, the HTTP binding
      specification requires that a HTTP 500 "Internal Server Error" be used
      with an embedded SOAP message containing a SOAP fault indicating the
      server-side processing error.
      Example 11 is the same SOAP fault message as Example 6a, but this time
      with the HTTP headers added.

      Example 11
      HTTP/1.1 500 Internal Server Error
      Content-Type: application/soap+xml; charset="utf-8"
      Content-Length: nnnn

      <?xml version='1.0' ?>
      <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
      <env:Body>
      <env:Fault>
      <env:Code>
      <env:Value>env:Sender</env:Value>
      <env:Subcode>
      <env:Value>rpc:BadArguments</env:Value>
      </env:Subcode>
      </env:Code>
      <env:Reason>
      <env:Text xml:lang="en-US">Processing error</env:Text>
      <env:Text xml:lang="cs">Chyba zpracovani</env:Text>
      </env:Reason>
      <env:Detail>
      <e:myFaultDetails
      xmlns:e="http://travelcompany.example.org/faults" >
      <e:message>Name does not match card number</e:message>
      <e:errorcode>999</e:errorcode>
      </e:myFaultDetails>
      </env:Detail>
      </env:Fault>
      </env:Body>
      </env:Envelope>

      Thank you,

      Igor Korolev
    • Igor Korolev
      Jonathan, My problem is that method returns undef when http response code is not 200, so this is all a beautiful theory which does not work. Below is a test
      Message 2 of 2 , Jul 2, 2003
      • 0 Attachment
        Jonathan,

        My problem is that "method" returns undef when http response code
        is not 200, so this is all a beautiful theory which does not work.

        Below is a test code and output. So we see the envelope with
        fault, but it is hard to access it.

        #!/usr/bin/perl
        my $resp;
        my $wsurl = 'http://www20.digitalriver.com/rcsdev/macro.wsdl';

        use SOAP::Lite +trace => 'debug';

        $order_id = 12345;
        $email = 'misha@...';
        $password = 'abcdef';
        $store_billing = [ { value=>'MMM', key=>'givenName'}];
        $store_shipping = [ {value=>'MMM', key=>'givenName'} ];

        $profiles = [ {value => $store_billing, key=>'STORE_BILLING' },
        { value => $store_shipping, key=> 'STORE_SHIPPING'} ];

        eval
        {
        my $svc = SOAP::Lite->service($wsurl);
        $resp = $svc->placeOrder($order_id, $email,$password, $profiles);
        };
        die "Got Error: $@" if($@);
        print "RESPONSE: [$resp]\n";
        my $result = $resp->result();

        OUTPUT:

        <?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope
        xmlns:namesp2="http://xml.apache.org/xml-soap"
        SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
        xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
        xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
        xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
        xmlns:xsd="http://www.w3.org/1999/XMLSchema"><SOAP-ENV:Body><namesp1:pla
        ceOrder xmlns:namesp1="http://digitalriver.store"><orderID
        xsi:type="xsd:string">12345</orderID><email
        xsi:type="xsd:string">misha@...</email><password
        xsi:type="xsd:string">abcdef</password><profiles
        SOAP-ENC:arrayType="namesp2:SOAPStruct[2]"
        xsi:type="apachesoap:Map"><item xsi:type="namesp2:SOAPStruct"><value
        SOAP-ENC:arrayType="namesp2:SOAPStruct[1]"
        xsi:type="SOAP-ENC:Array"><item xsi:type="namesp2:SOAPStruct"><value
        xsi:type="xsd:string">MMM</value><key
        xsi:type="xsd:string">givenName</key></item></value><key
        xsi:type="xsd:string">STORE_BILLING</key></item><ite!
        m xsi:type="namesp2:SOAPStruct"><value
        SOAP-ENC:arrayType="namesp2:SOAPStruct[1]"
        xsi:type="SOAP-ENC:Array"><item xsi:type="namesp2:SOAPStruct"><value
        xsi:type="xsd:string">MMM</value><key
        xsi:type="xsd:string">givenName</key></item></value><key
        xsi:type="xsd:string">STORE_SHIPPING</key></item></profiles></namesp1:pl
        aceOrder></SOAP-ENV:Body></SOAP-ENV:Envelope>
        SOAP::Transport::HTTP::Client::send_receive: HTTP/1.1 500 Internal
        Server Error
        Cache-Control: no-cache="set-cookie,set-cookie2"
        Connection: close
        Date: Wed, 02 Jul 2003 21:29:40 GMT
        Server: JRun Web Server
        Content-Language: en-US
        Content-Type: text/xml; charset=utf-8
        Expires: Thu, 01 Dec 1994 16:00:00 GMT
        Client-Date: Wed, 02 Jul 2003 21:31:36 GMT
        Client-Peer: 10.114.0.45:80
        Client-Response-Num: 1
        Client-Transfer-Encoding: chunked
        Set-Cookie: CFID=5318;domain=.macromedia.com;expires=Fri, 24-Jun-2033
        20:58:40 GMT;path=/
        Set-Cookie:
        CFTOKEN=d64b0e2e96d79a54-24EBB07C-AF53-E066-8F570C5078A9F72B;domain=.mac
        romedia.com;expires=Fri, 24-Jun-2033 20:58:40 GMT;path=/
        Set-Cookie: JSESSIONID=96302836891057181380733;path=/
        Set-Cookie:
        UID=24EBB097%2DE220%2DE4D7%2D5D886211B6C6CA4C;domain=.macromedia.com;exp
        ires=Fri, 24-Jun-2033 20:58:40 GMT;path=/cfusion/

        <?xml version="1.0" encoding="UTF-8"?>
        <soapenv:Envelope
        xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <soapenv:Body>
        <soapenv:Fault>
        <faultcode>soapenv:Server.generalException</faultcode>
        <faultstring>[org.apache.axis.AxisFault : ; nested exception is:
        org.xml.sax.SAXException: Bad types (class [Ljava.lang.Object;
        -> interface java.util.Map)]; nested exception is:
        coldfusion.xml.rpc.CFCInvocationException:
        [org.apache.axis.AxisFault : ; nested exception is:
        org.xml.sax.SAXException: Bad types (class [Ljava.lang.Object;
        -> interface java.util.Map)]</faultstring>
        </soapenv:Fault>
        </soapenv:Body>
        </soapenv:Envelope>

        RESPONSE: []
        Can't call method "result" on an undefined value at ./ex888.pl line 23.


        -----Original Message-----
        From: jpeyser [mailto:jpeyser@...]
        Sent: Wednesday, July 02, 2003 2:54 PM
        To: Igor Korolev
        Subject: Re: undefined result for fault messages


        Igor,

        Unless I misunderstand you, it seems straight forward. See the
        SOAP::SOM description in the SOAP::Lite MAN page. For the XML below,
        you would retrieve the fields as follows.

        $som = $soap->method(@parameters);

        if ($som->fault) {
        if ($som->match('/Envelope/Body/Fault/Code/')) {
        print $som->valueof('Value'), "\n";
        print $som->valueof('Subcode/Value'), "\n";
        }
        if ($som->match('/Envelope/Body/Fault/Reason/')) {
        print $som->valueof('Text'), "\n";
        print $som->valueof('Text'), "\n";
        }
        if ($som->match('/Envelope/Body/Fault/Detail/')) {
        print $som->valueof('myFaultDetails/message'), "\n";
        print $som->valueof('myFaultDetails/errorcode'), "\n";
        }
        }

        Jonathan


        --- In soaplite@yahoogroups.com, "Igor Korolev" <IgorK@D...> wrote:
        > Hello,
        >
        > Could somebody please tell me if there are methods for getting fault
        > text received in SOAP body of a
        > response ?
        >
        > For some reason, SOAP::Lite::call will not return anything if HTTP
        > response code is not 200 while current SOAP standard
        > http://www.w3.org/TR/2003/REC-soap12-part0-20030624/
        > says that
        >
        > If an error occurs processing the request, the HTTP binding
        > specification requires that a HTTP 500 "Internal Server Error" be
        used
        > with an embedded SOAP message containing a SOAP fault indicating the
        > server-side processing error.
        > Example 11 is the same SOAP fault message as Example 6a, but this
        time
        > with the HTTP headers added.
        >
        > Example 11
        > HTTP/1.1 500 Internal Server Error
        > Content-Type: application/soap+xml; charset="utf-8"
        > Content-Length: nnnn
        >
        > <?xml version='1.0' ?>
        > <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
        > <env:Body>
        > <env:Fault>
        > <env:Code>
        > <env:Value>env:Sender</env:Value>
        > <env:Subcode>
        > <env:Value>rpc:BadArguments</env:Value>
        > </env:Subcode>
        > </env:Code>
        > <env:Reason>
        > <env:Text xml:lang="en-US">Processing error</env:Text>
        > <env:Text xml:lang="cs">Chyba zpracovani</env:Text>
        > </env:Reason>
        > <env:Detail>
        > <e:myFaultDetails
        > xmlns:e="http://travelcompany.example.org/faults" >
        > <e:message>Name does not match card number</e:message>
        > <e:errorcode>999</e:errorcode>
        > </e:myFaultDetails>
        > </env:Detail>
        > </env:Fault>
        > </env:Body>
        > </env:Envelope>
        >
        > Thank you,
        >
        > Igor Korolev
      Your message has been successfully submitted and would be delivered to recipients shortly.