ID:               39179
 Comment by:       stuart at stuartherbert dot com
 Reported By:      jchernia at netsuite dot com
 Status:           No Feedback
 Bug Type:         SOAP related
 Operating System: Windows XP
 PHP Version:      5.1.6
 Assigned To:      dmitry
 New Comment:

Looks like jchernia is trying to access Netsuite's web service
(Netsuite is a popular hosted ERP solution).  You can't access their
SOAP service w/out a valid account, but if you had such an account, the
following code triggers the error:

<?php

class GetRequest
{
        public $baseRef = null;
}

class LoginRequest
{
        public $passport = null;
}

class Passport
{
        public $email = null;
        public $password = null;
        public $account = null;
        public $role = null;
}

class BaseRef
{
        public $name = null;
}

class RecordRef extends BaseRef
{
        public $internalId = null;
        public $externalId = null;
        public $type       = null;
}

$user = new Passport();
$user->email='<your netsuite login>';
$user->password='<your netsuite password>';
$user->account='<your netsuite account ID>';
$user->role=new RecordRef;
$user->role->internalId=<your role ID>;

$loginRequest = new LoginRequest;
$loginRequest->passport = $user;

$soapClient = new
SoapClient('https://webservices.netsuite.com/wsdl/v2008_1_0/netsuite.wsdl',
array('trace' => 1));
$result = $soapClient->login($loginRequest);

$requestRef = new RecordRef;
$requestRef->externalId = 200;
$requestRef->type = 'issue';

try
{
        $issue = $soapClient->get(array('recordRef' => $requestRef));
        var_dump($issue);
}
catch (Exception $e)
{
        var_dump($e);
        var_dump($soapClient->__getLastRequest());
        var_dump($soapClient->__getLastResponse());
}

?>

__getLastRequest() reports:

<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/";
xmlns:ns1="urn:messages_2008_2.platform.webservices.netsuite.com"><SOAP-ENV:Body><ns1:get><ns1:baseRef/></ns1:get></SOAP-ENV:Body></SOAP-ENV:Envelope>

and __getLastResponse() reports:

<?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.userException</faultcode>
      <faultstring>org.xml.sax.SAXException:
{urn:core_2008_2.platform.webservices.netsuite.com}BaseRef is an
abstract type and cannot be instantiated</faultstring>
      <detail>
        <ns1:hostname
xmlns:ns1="http://xml.apache.org/axis/";>partners-java001.svale.netledger.com</ns1:hostname>
      </detail>
    </soapenv:Fault>
  </soapenv:Body>
</soapenv:Envelope>

Note the empty <ns1:baseRef/> in the request.  baseRef is an abstract
type, in this case extended the recordRef.  The correct SOAP request is
listed by the original poster.

Hope that helps.  If you need a Netsuite account for testing purposes,
contact me privately and I'll sort one out for you.

Best regards,
Stu
--


Previous Comments:
------------------------------------------------------------------------

[2006-10-31 01:00:01] php-bugs at lists dot php dot net

No feedback was provided for this bug for over a week, so it is
being suspended automatically. If you are able to provide the
information that was originally requested, please do so and change
the status of the bug back to "Open".

------------------------------------------------------------------------

[2006-10-23 05:38:17] [EMAIL PROTECTED]

Could you provide full WSDL file and SOAP request or reeponce that
ext/soap cannot handle correct.

------------------------------------------------------------------------

[2006-10-18 22:24:46] jchernia at netsuite dot com

Still fails with 5.2. Is there a way to indicate that you want the
subclass, not the abstract class? I don't see any in the documentation
and I've tried lots of things.

------------------------------------------------------------------------

[2006-10-17 17:52:43] [EMAIL PROTECTED]

Please try using this CVS snapshot:

  http://snaps.php.net/php5.2-latest.tar.gz
 
For Windows:
 
  http://snaps.php.net/win32/php5.2-win32-latest.zip



------------------------------------------------------------------------

[2006-10-17 17:47:11] jchernia at netsuite dot com

Description:
------------
This is very similar to bug 36575
http://bugs.php.net/bug.php?id=36575), but I still see this in the
latest code.

If an operation takes an abstract type, I can not get SoapClient (in
WSDL mode) to produce one of the subclass instances of it, even if I set
type, etc.

Both Axis and .NET generated client classes will send the correct
subclass if you specify it.

NuSoap does not, but allows you to specify additional attributes in
WSDL mode.




Reproduce code:
---------------
Operation
<complexType name="GetRequest">
 <sequence>
  <element name="baseRef" type="platformCore:BaseRef"/>
 </sequence>
 </complexType>
<element name="get" type="platformMsgs:GetRequest"/>

XSD:
<complexType name="BaseRef" abstract="true">

<sequence>
<element name="name" type="xsd:string" minOccurs="0"/>
<!-- record name -->
</sequence>
</complexType>
<element name="baseRef" type="platformCore:BaseRef"/>
 <complexType name="RecordRef">
 <complexContent>
 <extension base="platformCore:BaseRef">
  <attribute name="internalId" type="xsd:string"/>
  <attribute name="externalId" type="xsd:string"/>
  <attribute name="type" type="platformCoreTyp:RecordType"/>
  </extension>
 </complexContent>
</complexType>

Expected result:
----------------
<ns1:get>
<ns1:baseRef internalId="17" type="customer"
xsi:type="ns1:RecordRef"/>
</get>

Either this, or the ability to set these attributes in WSDL mode.

Actual result:
--------------
<ns1:get>
 <ns1:baseRef/>
</ns1:get>


------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=39179&edit=1

Reply via email to