|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2006-10-17 17:47 UTC] 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> PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Fri Oct 24 19:00:01 2025 UTC |
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 --This bug is still present in the last version. SoapClient does not honor polymorphism correctly, with or without abstract types Sample WSDL : <complexType name="PersonIdentity"> <sequence> <element name="Id" type="xsd:string" /> </sequence> </complexType> <complexType name="Person"> <complexContent extends="PersonIdentity"> <sequence> <element name="Name" type="xsd:string" /> <element name="FirstName" type="xsd:string" /> </sequence> </complexContent> </complexType> Operation contract : <complexType name="CheckPerson"> <sequence> <element name="Person" type="PersonIdentity"/> </sequence> </complexType> The operation CheckPerson accepts both Person and PersonIdentity. Despite the fact that you can create a class which correponds in PHP : class PersonIdentity { public $Id; } class Person extends PersonIdentity { public $Name; public $FirstName; } If you use a Person instance when you call CheckPerson() : - the Person will be serialized as a PersonIdentity, - no i:type="Person" attribute will be added to the <Person> element, - the properties belonging to the Person class will be dropped