[PHP5 / SOAP] ComplexType naar PHP class

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Ik probeer een PHP object via SOAP door te geven, en dat lukt op zich wel, maar ik krijg em niet van de juiste class, hij blijft nml. altijd stdClass. Dit was schijnbaar een bug in PHP < 5.0.3, maar hier op Windows PHP 5.0.4 wilt het nog steeds niet lukken. Ik heb het volgende volgens deze tip opgezet:

Bar.php:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
<?
class Bar {
    
    public $id;
    public $name;
    
    function __construct($id, $name) {
        $this->id = $id;
        $this->name = $name;
   }
}
?>


client.php:
PHP:
1
2
3
4
5
6
7
8
9
<pre><?
ini_set("soap.wsdl_cache_enabled", "0");
require_once("Bar.php");

$client = new SoapClient("test.wsdl",  array('trace' => 1, 'classmap' => array("Bar" => "Bar")));
$response = $client->foo();
print_r($response);
print_r($client->__getLastResponse());
?></pre>


server.php:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?
ini_set("soap.wsdl_cache_enabled", "0");

require_once("Bar.php");

class FooServer {

    public function foo() {
        return  new Bar(314, "melp");
    }
}

$server = new SoapServer("test.wsdl", array('classmap' => array("Bar", "Bar")));;
$server->setClass("FooServer");
$server->handle();
?>

test.wsdl:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?xml version="1.0" ?>
<wsdl:definitions   xmlns:wsdl      ="http://schemas.xmlsoap.org/wsdl/"
                    xmlns:soap      ="http://schemas.xmlsoap.org/wsdl/soap/"
                    xmlns:xs        ="http://www.w3.org/2001/XMLSchema">
         
    <wsdl:types>
        <xs:schema  xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
            <xs:complexType name="Bar">
                <xs:all>
                    <element name="id"          type="xsd:integer"/>
                    <element name="name"        type="xsd:string"/>
                </xs:all>
            </xs:complexType>                   
        </xs:schema>        
    </wsdl:types>
    
    <wsdl:message name="fooRequest" />
    
    <wsdl:message name="fooResponse">
        <part name="bar"    type="Bar"/>
    </wsdl:message>
                
    <wsdl:portType name="FooPortType">
        <wsdl:operation name="foo">
            <wsdl:input  message="fooRequest"/>
            <wsdl:output message="fooResponse"/>
        </wsdl:operation>
    </wsdl:portType>
    
    <wsdl:binding name="FooBinding" type="FooPortType">
        <wsdl:operation name="foo" />                   
    </wsdl:binding>
    
    <wsdl:service name="FooService">
    
        <wsdl:port name="FooPort" binding="FooBinding">
            <soap:address location="http://amen/soaptest/server.php" /> 
        </wsdl:port>
    
    </wsdl:service>
    
</wsdl:definitions>


Ik heb de WSDL zoveel mogelijk gestript totdat ie het nog net deed, maar ik blijf duv ipv een Bar object een stdClass terug krijgen. De response geeft wel een bar element terug:
code:
1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Body>
        <bar>
            <id>314</id>
            <name>melp</name>
        </bar>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

maar er zou denk ik iets van een <bar type="Bar"> moeten staan...is er iemand die me de juiste richting in kan helpen? ik zal wel weer iets gemist hebben in de WSDL...

[ Voor 19% gewijzigd door Genoil op 16-08-2005 18:49 ]


Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
hmm > 24 later...kick enzo, doet iedereen PHP SOAP met simpleTypes ofzo? :|

Acties:
  • 0 Henk 'm!

  • DJ Buzzz
  • Registratie: December 2000
  • Laatst online: 19-09 08:24
Heb hier ook even gekeken naar een applicatie, maar die vertoont hetzelfde gedrag. Op zich moet het toch niet echt probleem zijn, aangezien je toch gewoon de eigenschappen van het object kunt opvragen? Of het een echt object is lijkt me niet ontzettend relevant, aangezien je er toch niet mee kunt doen wat je met normale objecten kunt (methods e.d.).

Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Nou in de laatste comment op deze url: http://bugs.php.net/bug.php?id=31869 worden er blijkbaar ook succesvol methods gecalled op het gereturnde object. Als ik dat script kopieer werkt het ook uitstekend (methods callen op gereturned object uit SOAP).

[ Voor 19% gewijzigd door Genoil op 20-08-2005 19:04 ]


Acties:
  • 0 Henk 'm!

  • bgever
  • Registratie: April 2002
  • Laatst online: 28-05-2021
Sja, foutjes zitten altijd in een klein hoekje. ;)

Kijk eens goed hoe je die array definieerd. Het is een associatieve array, en dan moet je dus '=>' gebruiken i.p.v. ','.

Kom maar op met dat |:( smilie! :+

[edit]
In client.php doe je het dus goed, maar niet in server.php

[ Voor 20% gewijzigd door bgever op 20-08-2005 20:48 ]


Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Wel goed gezien, maar ik geloof dat die fout alleen in m'n voorbeeld heeft gestaan, want hier in m'n eigen code staat het wel goed. En dat helpt niet :/

Acties:
  • 0 Henk 'm!

  • DJ Buzzz
  • Registratie: December 2000
  • Laatst online: 19-09 08:24
Genoil schreef op zaterdag 20 augustus 2005 @ 18:29:
Nou in de laatste comment op deze url: http://bugs.php.net/bug.php?id=31869 worden er blijkbaar ook succesvol methods gecalled op het gereturnde object. Als ik dat script kopieer werkt het ook uitstekend (methods callen op gereturned object uit SOAP).
Hmm, heb het hier eens getest met classmap erbij en het lijkt gewoon te werken... Kan er verder ook eigenlijk weinig problemen in vinden. Al het voorbeeld uit die bugreport proberen om te bouwen naar je eigen situatie en dan gekeken wanneer het fout gaat?

Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
djbuzzz schreef op zondag 21 augustus 2005 @ 20:14:
[...]


Hmm, heb het hier eens getest met classmap erbij en het lijkt gewoon te werken... Kan er verder ook eigenlijk weinig problemen in vinden. Al het voorbeeld uit die bugreport proberen om te bouwen naar je eigen situatie en dan gekeken wanneer het fout gaat?
Je bedoelt dat je mijn code hebt getest en dat werkt gewoon? Dus er komt een Bar object terug? Waarom bij jou wel en bij mij niet? Ik heb het op 3 machines getest (2 Win en 1 ietsBSD).

Die code van de bugreport draait hier goed, ook als ik de interop wsdl hier naartoe haal. Het gaat mis op het moment dat ik m'n eigen WSDL gebruik...

[ Voor 9% gewijzigd door Genoil op 22-08-2005 11:47 ]


Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Jeuj het werkt nu! Het is wel belangrijk om bij het aanmaken van nieuwe types deze een targetNamespace mee te geven en die te vermelden in je message in de WSDL. Verder moet je targetNamespace niet met een hoofdletter S voor space schrijven ;). Het is trouwens in de server niet nodig om een classmap aan te geven, in de client volstaat. Hier de minimale WSDL:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?xml version="1.0"?>
<definitions name="Foo" targetNamespace="http://amen/soaptest/" 
                        xmlns="http://schemas.xmlsoap.org/wsdl/" 
                        xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"                      
                        xmlns:s="http://amen/soaptest/xsd"                        
                        xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
         
    <types>
        <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://amen/soaptest/xsd">
            <complexType name="Bar">
                <all>
                    <element name="id" type="int"/>
                    <element name="name" type="string"/>
                </all>
            </complexType>                  
        </schema>       
    </types>
        
    <message name="fooResponse">
        <part name="bar" type="s:Bar"/>
    </message>
                    
    <portType name="FooPortType">
        <operation name="foo">
            <output message="fooResponse"/>
        </operation>
    </portType>
    
    <binding name="FooBinding" type="FooPortType">  
        <operation name="foo" />                
    </binding>
    
    <service name="FooService">
        <port name="FooPort" binding="FooBinding">
            <soap:address location="http://amen/soaptest/server.php" /> 
        </port> 
    </service>
    
</definitions>

Acties:
  • 0 Henk 'm!

  • DJ Buzzz
  • Registratie: December 2000
  • Laatst online: 19-09 08:24
Genoil schreef op maandag 22 augustus 2005 @ 11:42:
[...]


Je bedoelt dat je mijn code hebt getest en dat werkt gewoon? Dus er komt een Bar object terug? Waarom bij jou wel en bij mij niet? Ik heb het op 3 machines getest (2 Win en 1 ietsBSD).

Die code van de bugreport draait hier goed, ook als ik de interop wsdl hier naartoe haal. Het gaat mis op het moment dat ik m'n eigen WSDL gebruik...
Was misschien niet helemaal duidelijk, maar heb het hier lokaal even getest met een redelijk complexe wdsl (autogenerated van PHP classes), daarbij werkt het wel prima.

Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
djbuzzz schreef op maandag 22 augustus 2005 @ 17:56:
[...]


Was misschien niet helemaal duidelijk, maar heb het hier lokaal even getest met een redelijk complexe wdsl (autogenerated van PHP classes), daarbij werkt het wel prima.
Oh da's wel mooi zo'n WSDL generator, ga ik zeker eens naar kijken (welke gebruik je?). In mij specifieke geval klets ik tegen een perl SOAP::Lite server aan zonder WSDL. Die perl wizzard bij de andere partij zaf het sowieso al niet zo zitten dat het geheel met PHP <-> SOAP <-> perl gedaan werd ipv puur perl, dus met WSDL::generator moest ik al helemaal niet aankomen...dus zelf maar de WSDL met de hand in elkaar geprutst...volgende keer schrijf ik echter wel een stub server in PHP en dan jas ik die WSDL generator er overheen, WSDL met de hand schrijven is gewoon zwaar irritant!

Acties:
  • 0 Henk 'm!

  • DJ Buzzz
  • Registratie: December 2000
  • Laatst online: 19-09 08:24
Het is ontwikkeld bij een bedrijf waar ik nu net wat voor aan het doen ben. Het is weleens langsgekomen op de PHP SOAP mailing list en het is hier te downloaden:
http://www.jool.nl/webservicehelper/
Werkt op basis van commentaar en kan daarbij ook HTML documentatie voor je webservice dingen maken. Hoe het verder exact zit met licenties e.d. weet ik niet...

Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
djbuzzz schreef op maandag 22 augustus 2005 @ 20:58:
Het is ontwikkeld bij een bedrijf waar ik nu net wat voor aan het doen ben. Het is weleens langsgekomen op de PHP SOAP mailing list en het is hier te downloaden:
http://www.jool.nl/webservicehelper/
Werkt op basis van commentaar en kan daarbij ook HTML documentatie voor je webservice dingen maken. Hoe het verder exact zit met licenties e.d. weet ik niet...
Oh da's mooi, die had ik al gevonden en gedownload. Bedankt voor de tip!
Pagina: 1