Re: [SOAP] SOAP wsdl:part name="request" element type question
| From: | Richard Quadling | Date: | Thu, 10 Mar 2011 16:57:00 +0000 |
| Subject: | Re: [SOAP] SOAP wsdl:part name="request" element type question | ||
| References: | 1 2 3 4 5 6 | Groups: | php.soap |
| Request: | Send a blank email to php-soap+get-3274@lists.php.net to get a copy of this message | ||
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"]’ç~Fx
>>>> á
ʳjv
>>>>
>>>> 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