[prev in list] [next in list] [prev in thread] [next in thread] 

List:       php-soap
Subject:    Re: [SOAP] SOAP wsdl:part name="request" element type question
From:       Richard Quadling <rquadling () gmail ! com>
Date:       2011-03-10 16:57:00
Message-ID: AANLkTimaSc0gA-WoHyOHNKoTHUZu7+Fk8e_dRR3giQhS () mail ! gmail ! com
[Download RAW message or body]

On 10 March 2011 15:48,  <Brendan_Crowley@dellteam.com> wrote:
> Hi,
> 
> Ok, I'll look into those restricted types.
> 
> I now have a SoapClient for basic test and I can connect to this SoapServer and get \
> the test soap fault ok: 
> 
> <?php
> 
> ini_set("soap.wsdl_cache_enabled", "0");
> 
> $server = new SoapServer("http://localhost/ProblemReportService.wsdl", \
> array('soap_version' => SOAP_1_1)); $server->addFunction("submitProblemReport");
> $server->handle();
> 
> function submitProblemReport($problem) {
> throw new SoapFault('-1', "Hello from ProblemTestServerOne.php!", 'actor', \
> 'detail', 'name', 'header'); }
> 
> ?>
> 
> 
> but _cannot_ connect to this basic test SoapServer:
> 
> 
> <?php
> 
> ini_set("soap.wsdl_cache_enabled", "0");
> 
> class ProblemReport {
> public $BodyPartType; // BodyPartType
> }
> 
> class BodyPartType {
> }
> 
> class ProblemReportService extends SoapClient {
> 
> private static $classmap = array(
> 'ProblemReport' => 'ProblemReport',
> 'BodyPartType' => 'BodyPartType');
> 
> function ProblemReportService($wsdl = "http://localhost/ProblemReportService.wsdl", \
> $options = array('soap_version' => SOAP_1_1)) { foreach(self::$classmap as $key => \
> $value) { if(!isset($options['classmap'][$key])) {
> $options['classmap'][$key] = $value;
> }
> }
> parent::__construct($wsdl, $options);
> $this->server = new SoapServer($wsdl, $options);
> $this->server->addFunction('submitProblemReport');
> $this->server->handle();
> }
> 
> function submitProblemReport(ProblemReport $request) {
> throw new SoapFault('-1', "Hello from ProblemTestServerTwo.php!", 'actor', \
> 'detail', 'name', 'header'); }
> 
> } // end class ProblemReportService
> 
> ?>
> 
> Any ideas why?
> 
> Cheers,
> Brendan
> 
> -----Original Message-----
> From: Richard Quadling [mailto:rquadling@gmail.com]
> Sent: 10 March 2011 10:56
> To: Crowley, Brendan - Dell Team
> Cc: soap@lists.php.net
> Subject: Re: [SOAP] SOAP wsdl:part name="request" element type question
> 
> On 10 March 2011 10:37, Richard Quadling <rquadling@gmail.com> wrote:
> > On 9 March 2011 15:56,  <Brendan_Crowley@dellteam.com> wrote:
> > > Hi Richard,
> > > 
> > > Thanks for your reply, my files are now up on pastebin:
> > > 
> > > ProblemReportService.wsdl:      http://pastebin.com/m9q5tDaN
> > > ProblemReport.xsd:              http://pastebin.com/01YPU6Dn
> > > dropdownvalues.xsd:             http://pastebin.com/1Kvbvf5U
> > > 
> > > I've used the wsdl2php.php from http://pastebin.com/r1BfRysT to create this php \
> > >                 file:
> > > ProblemReportService.php:       http://pastebin.com/Txyc1mQM
> > > 
> > > I understand that this ProblemReportService.php file needs to be utilised both \
> > > by SoapClient and SoapServer, but how can I use this ProblemReportService.php \
> > > file to handle the contents of my ProblemReport.xml to create the $request \
> > > object for the Client? 
> > > Cheers,
> > > Brendan
> > > 
> > > -----Original Message-----
> > > From: Richard Quadling [mailto:rquadling@gmail.com]
> > > Sent: 09 March 2011 11:22
> > > To: Crowley, Brendan - Dell Team
> > > Cc: soap@lists.php.net
> > > Subject: Re: [SOAP] SOAP wsdl:part name="request" element type
> > > question
> > > 
> > > On 9 March 2011 10:53,  <Brendan_Crowley@dellteam.com> wrote:
> > > > I have a WSDL (ProblemReportService.wsdl) that is defined as follows:
> > > > 
> > > > <wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
> > > > xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
> > > > xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
> > > > xmlns:xs="http://www.w3.org/2001/XMLSchema"
> > > > xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
> > > > xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
> > > > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> > > > xmlns:tns="http://localhost/ProblemReportService.wsdl"
> > > > xmlns:ha1="http://localhost/ProblemReport.xsd"
> > > > name="ProblemReportService"
> > > > targetNamespace="http://localhost/ProblemReportService.wsdl">
> > > > <wsdl:types>
> > > > <xs:schema attributeFormDefault="unqualified"
> > > > elementFormDefault="qualified"
> > > > xmlns:ha1="http://localhost/ProblemReport.xsd"
> > > > xmlns:xs="http://www.w3.org/2001/XMLSchema">
> > > > <xs:import
> > > > namespace="http://localhost/ProblemReport.xsd"
> > > > schemaLocation="ProblemReport.xsd"/>
> > > > <xs:import
> > > > namespace="http://localhost/dropdownvalues.xsd"
> > > > schemaLocation="dropdownvalues.xsd"/>
> > > > </xs:schema>
> > > > </wsdl:types>
> > > > <wsdl:message name="NewProblemReportRequest">
> > > > <wsdl:part name="request" element="ha1:ProblemReport"/>
> > > > </wsdl:message>
> > > > <wsdl:message name="ProblemReportResponse">
> > > > <wsdl:part name="parameter" type="xs:string"/>
> > > > </wsdl:message>
> > > > <wsdl:portType name="ProblemReportPortType">
> > > > <wsdl:operation name="submitProblemReport">
> > > > <wsdl:input message="tns:NewProblemReportRequest"/>
> > > > <wsdl:output message="tns:ProblemReportResponse"/>
> > > > </wsdl:operation>
> > > > </wsdl:portType>
> > > > ..
> > > > 
> > > > I've created an xml file (ProblemReport.xml) that validates to \
> > > > ProblemReport.xsd. 
> > > > I now have a SOAP Client php file that needs to send this request to the SOAP \
> > > > Server, how would I write the client and server side in php? 
> > > > Client:
> > > > try {
> > > > $client = new SoapClient("ProblemReportService.wsdl",
> > > > array('soap_version' => SOAP_1_1,'trace' => 1 ));
> > > > // How would I define $request from the contents of ProblemReport.xml file?
> > > > $return = $client->__soapCall("submitProblemReport", $request);
> > > > } catch (SoapFault $fault) {
> > > > trigger_error("SOAP Fault: (faultcode: {$fault->faultcode},
> > > > faultstring: {$fault->faultstring})", E_USER_ERROR); }
> > > > 
> > > > Server:
> > > > ini_set("soap.wsdl_cache_enabled", "0"); $server = new
> > > > SoapServer("http://localhost/ProblemReportService.wsdl",
> > > > array('soap_version' => SOAP_1_1));
> > > > $server->addFunction("submitProblemReport");
> > > > $server->handle();
> > > > function submitProblemReport($problem) {
> > > > // How can I validate the $problem against a XSD schema?
> > > > // and how can I unmarshal the $problem to access the data contained within \
> > > > the original xml file? }
> > > > 
> > > > Any assistance appreciated.
> > > > 
> > > > Thanks,
> > > > Brendan
> > > > 
> > > > 
> > > 
> > > Do you have the complete wsdl file?
> > > 
> > > My solution for the client is always the same.
> > > 
> > > Wrap the WSDL and SOAPClient into an easy to use set of classes, essentially \
> > > hiding the XML and SOAP aspects away and providing a normal OOP front end. 
> > > I use Sourceforge's wsdl2php for that (combined with RazorsEdgeUK's patches).
> > > 
> > > Take a look through the last few posts I've made on \
> > > http://news.php.net/php.soap to see the sort of thing I'm talking about. There \
> > > are links to some pastebin code too so you can see the code I'm creating/using \
> > > as well as the output being generated. 
> > > 
> > > The SOAPServer's I've created have always been via Zend Framework which \
> > > simplifies the creation of the WSDL file - I write the PHP code I want to \
> > > expose, I add appropriate DocBlocks to that code and then I use ZF's \
> > > AutoDiscover to create the WSDL file.
> 
> > > 
> > > Then I use wsdl2php to create client classes.
> > > 
> > > I never write the WSDL file or create XML files or make HTTP requests.
> > > 
> > > I use OOP and DocBlock documentation.
> > > 
> > > But with the full wsdl file it should be a relatively simple process to \
> > > construct the server classes. 
> > > Of course, you _can_ do all of this without any of the ideas/suggestions I've \
> > > made. But, for me, that seems to be missing out on the simplicity that comes \
> > > with using PHP's SOAPClient and wsdl2php. 
> > > Let me know what you need.
> > > 
> > > Richard.
> > > 
> > > --
> > > Richard Quadling
> > > Twitter : EE : Zend
> > > @RQuadling : e-e.com/M_248814.html : bit.ly/9O8vFY
> > > 
> > 
> > Oh. Interesting.
> > 
> > It seems that wsdl2php doesn't support the translation of restricted
> > types to anything concrete.
> > 
> > So, currently wsdl2php is only giving you half the story.
> > 
> > I don't think there is an instant fix here. I've not had to use a
> > restriction on any of my code or in any of the services I've
> > interacted with.
> > 
> > How soon do you need this working?
> > 
> > I have an idea on what to do to get wsdl2php working for restrictions,
> > but I'm not able to do anything on it today.
> > 
> > Richard.
> > 
> > 
> > --
> > Richard Quadling
> > Twitter : EE : Zend
> > @RQuadling : e-e.com/M_248814.html : bit.ly/9O8vFY
> > 
> 
> An interesting comment on
> http://social.msdn.microsoft.com/Forums/en/asmxandxml/thread/4d5b1e36-21b9-454b-b155-3d14bba49b82
>  
> The wsdl file _MAY_ be invalid. See the comments later on regarding XMLSpy.
> 
> --
> Richard Quadling
> Twitter : EE : Zend
> @RQuadling : e-e.com/M_248814.html : bit.ly/9O8vFY
> 

How are making the call to the service?

$o_Service = new ProblemReportService;

$o_ProblemReport = new ProblemReport;
$o_BodyPartType = new BodyPartType;

$o_BodyPartType.??? = ????;
Now what? What do I set on BodyPartType? It has no properties.

Ignoring that though (and you can't really), ...

$o_Response = $o_Service->submitProblemReport($o_ProblemReport);

If you can get a publicly accessible WSDL file (something I can fire
my code against), then I can help you further, but without a working
server (and that's why I used Zend Framework to help me build the
server side).



-- 
Richard Quadling
Twitter : EE : Zend
@RQuadling : e-e.com/M_248814.html : bit.ly/9O8vFY

-- 
PHP Soap Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic