17 messages in net.php.lists.soapRe: Java/Oracle server, PHP 5.1.2 cli...
FromSent OnAttachments
Peter GuyJan 17, 2006 11:03 am 
Peter GuyJan 17, 2006 12:27 pm 
Michael RasmussenJan 17, 2006 4:19 pm 
Peter GuyJan 17, 2006 4:51 pm 
Dmitry StogovJan 18, 2006 12:07 am 
Peter GuyJan 18, 2006 11:44 am 
Roger RoelofsJan 18, 2006 12:16 pm 
Michael RasmussenJan 18, 2006 12:51 pm 
Peter GuyJan 18, 2006 3:18 pm 
Peter GuyJan 18, 2006 3:29 pm 
Dmitry StogovJan 19, 2006 11:35 pm 
Dmitry StogovJan 19, 2006 11:48 pm 
Dmitry StogovJan 20, 2006 12:15 am 
Peter GuyJan 20, 2006 11:18 am 
Katy CoeJan 20, 2006 4:20 pm 
Peter GuyJan 20, 2006 5:26 pm 
Katy CoeJan 21, 2006 9:39 am 
Actions with this message:
Paste this link in email or IM:
Paste this link in email or IM:
Atom feed for this thread
Paste this URL into your reader:
Subject:Re: Java/Oracle server, PHP 5.1.2 client, array of complexTypes, Deserializer errorActions...
From:Michael Rasmussen (mi@miras.org)
Date:Jan 17, 2006 4:19:38 pm
List:net.php.lists.soap

On Tue, 17 Jan 2006 11:04:21 -0800, Peter Guy wrote:

So, my questions:

1. Is the WSDL formatted the right way for PHP? Could it be formatted differently, so as to coerce PHP into supplying the correct "type" for the BARS element?

Well, it seems to be correct wsdl. mono(C#) and gsoap(c/c++) has now problems in creating a correct proxy: The mono proxy: //
------------------------------------------------------------------------------ // <autogenerated> // This code was generated by a tool. // Mono Runtime Version: 1.1.4322.2032 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // </autogenerated> //
------------------------------------------------------------------------------

// // This source code was auto-generated by Mono Web Services Description Language
Utility //

/// <remarks/> [System.Web.Services.WebServiceBinding(Name="CustomerServicePort",
Namespace="http://CustomerService.wsdl")] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] [System.Xml.Serialization.SoapInclude(typeof(Bar))] public class CustomerService :
System.Web.Services.Protocols.SoapHttpClientProtocol {

public CustomerService() { this.Url = "http://vrcweb1.vrcis.com/custserv/CustomerService"; }

[System.Web.Services.Protocols.SoapRpcMethodAttribute("",
RequestNamespace="CustomerService", ResponseNamespace="CustomerService")] [return: System.Xml.Serialization.SoapElement("return")] public Bar[] EchoBars(Bar[] BARS) { object[] results = this.Invoke("EchoBars", new object[] { BARS}); return ((Bar[])(results[0])); }

public System.IAsyncResult BeginEchoBars(Bar[] BARS, System.AsyncCallback
callback, object asyncState) { return this.BeginInvoke("EchoBars", new object[] { BARS}, callback, asyncState); }

public Bar[] EndEchoBars(System.IAsyncResult asyncResult) { object[] results = this.EndInvoke(asyncResult); return ((Bar[])(results[0])); } }

/// <remarks/>
[System.Xml.Serialization.SoapType(Namespace="http://www.vrcis.com/CustomerServiceAPIV1")] public class Bar {

/// <remarks/> public string NAME; }

The gsoap proxy: /** @mainpage CustomerService Definitions

@section CustomerServiceBinding Service Binding "CustomerServiceBinding"

@subsection CustomerServiceBinding_operations Operations

- @ref ns1__EchoBars

@subsection CustomerServiceBinding_ports Endpoint Ports

- http://vrcweb1.vrcis.com/custserv/CustomerService

*/

// Note: modify this file to customize the generated data type declarations

//gsoapopt w #import "stl.h" /// Built-in attribute "SOAP-ENC:arrayType" typedef char *SOAP_ENC__arrayType;

/* To customize the names of the namespace prefixes generated by wsdl2h, modify the prefix names below and add the modified lines to typemap.dat to run wsdl2h:

ns2 = http://www.vrcis.com/CustomerServiceAPIV1 */

//gsoap ns2 schema namespace: http://www.vrcis.com/CustomerServiceAPIV1 //gsoap ns2 schema form: unqualified

// Forward declarations class ArrayOfBar; class ns2__Bar;

// End of forward declarations

/// Schema http://www.vrcis.com/CustomerServiceAPIV1 complexType "Bar"

class ns2__Bar { public: /// Element NAME of type xs:string std::string NAME ; ///< Required element /// A handle to the soap struct context that manages this class instance struct soap *soap ; };

/// Schema http://www.vrcis.com/CustomerServiceAPIV1 complexType "ArrayOfBar"

/// SOAP encoded array of "http://www.vrcis.com/CustomerServiceAPIV1":Bar class ArrayOfBar { public: /// Pointer to an array of ns2__Bar* ns2__Bar* *__ptr ; /// Size of the dynamic array int __size ; /// A handle to the soap struct context that manages this class instance struct soap *soap ; };

//gsoap ns1 service name: CustomerServiceBinding //gsoap ns1 service type: CustomerServicePortType //gsoap ns1 service port: http://vrcweb1.vrcis.com/custserv/CustomerService //gsoap ns1 service namespace: CustomerService

/// Operation response struct "ns1__EchoBarsResponse" of service binding
"CustomerServiceBinding" operation "ns1__EchoBars" struct ns1__EchoBarsResponse { ArrayOfBar* return_; };

/// Operation "ns1__EchoBars" of service binding "CustomerServiceBinding"

/**

Operation details:

- SOAP RPC encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"

C stub function (defined in soapClient.c[pp]): @code int soap_call_ns1__EchoBars(struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation ArrayOfBar* BARS, struct ns1__EchoBarsResponse& ); @endcode

C++ proxy class (defined in soapCustomerServiceBindingProxy.h): class CustomerServiceBinding;

*/

//gsoap ns1 service method-style: EchoBars rpc //gsoap ns1 service method-encoding: EchoBars
http://schemas.xmlsoap.org/soap/encoding/ //gsoap ns1 service method-action: EchoBars "" int ns1__EchoBars( ArrayOfBar* BARS, struct ns1__EchoBarsResponse& );

/* End of CustomerService Definitions */

Parsing output from php: Supported functions: ArrayOfBar EchoBars(ArrayOfBar $BARS) Supported types: Bar ArrayOfBar[] struct Bar { string NAME; } Produced with this code: $client = new SoapClient( 'http://vrcweb1.vrcis.com/custserv/CustomerService?WSDL', $options ); if ($functions = $client->__getFunctions()) { echo "Supported functions:\n"; foreach ($functions as $function) echo $function, "\n"; } if ($types = $client->__getTypes()) { echo "Supported types:\n"; foreach ($types as $type) echo $type, "\n"; }

The reason that it is not working in php is a bug in the proxy that php is creating!

The request sent: <BARS SOAP-ENC:arrayType="ns2:Bar[1]" xsi:type="ns2:ArrayOfBar"> <item xsi:type="ns2:Bar"> <NAME xsi:type="xsd:string">bar none</NAME> </item> </BARS>

This is how it should be - which your http-client demonstrates: <BARS SOAP-ENC:arrayType="ns1:Bar[1]" xsi:type="SOAP-ENC:Array"> <Bar xsi:type="ns1:Bar"> <NAME xsi:type="xsd:string">String Value</NAME> </Bar> </BARS>

The error is that php names the individual structs/complex types item but they must be named Bar. The error is therefore on the client side (php) which does not send a correct formated request. I am possitively convinced that receiving will work as can be seen under supported types above. You could try sending a raw xml request to your server but let php handle the response to have this observation confirmed.