+ Répondre à la discussion
Affichage des résultats 1 à 4 sur 4
  1. #1
    Membre habitué
    Inscrit en
    décembre 2004
    Messages
    319
    Détails du profil
    Informations forums :
    Inscription : décembre 2004
    Messages : 319
    Points : 148
    Points
    148

    Par défaut Namespace et WebServices

    Bonjour,

    Je souhaite créer un web service de création de compte en PHP

    J'ai une classe entité Account (dans le namespace ATD_Sobul_Web_Entities), une classe de service AccountSrv (dans le namespace ATD_Sobul_Web_Services)

    Voici le code de la classe Account :

    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
     
    <?php
    	namespace ATD_Sobul_Web_Entities
    	{
    		class Account{
    			private $username = '';
    			private $name = '';
    			private $firstname = '';
    			private $birthdate = '';
    			private $city = '';
    			private $country = '';
     
    			function __construct() {
    			}
     
    			public function __get($attr) {
    				if(isset($this->$attr)) 
    					return $this->$attr;
    				else {
    					// non-existant property
    					echo 'GET:Unknow attribute '.$attr;
    				}
    			}
    			public function __set($attr,$value)
    			{
    				if(isset($this->$attr)) $this->$attr = $value;
    				else {
    					// non-existant property
    					echo 'SET:Unknow attribute '.$attr;
    				}
    			}
    		}
    	}
    ?>
    Voici le code de la classe AccountSrv

    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
     
    <?php
    	namespace ATD_Sobul_Web_Services
    	{
    		define('__ROOT__', $_SERVER['DOCUMENT_ROOT']);
    		require_once(__ROOT__.'/Entities/Account.php'); 
     
    		class AccountSrv{
     
    			function Create($account){
    				return $account->username;
    			}
     
    			function Activate($username, $key){
    			}
    		}
    	}
    	namespace {
    		$wsdl = tempnam(sys_get_temp_dir(), 'wsdl');
    		copy("http://127.0.0.3:8080/Services/AccountSrv.wsdl", $wsdl);
     
    		$server	= new SoapServer($wsdl);
    		$server->setObject( new ATD_Sobul_Web_Services\AccountSrv());
    		$server->addFunction('Create');
    		$server->addFunction('Activate');
    		$server->handle();		
    	}
    ?>
    Voici le WSDL qui va avec :
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
     
    <?xml version="1.0" encoding="utf-8"?>
    <wsdl:definitions xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://tempuri.org/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" targetNamespace="http://tempuri.org/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
      <wsdl:types>
        <s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/">
          <s:element name="Create">
            <s:complexType>
              <s:sequence>
                <s:element minOccurs="0" maxOccurs="1" name="account" type="tns:Account" />
              </s:sequence>
            </s:complexType>
          </s:element>
          <s:complexType name="Account">
            <s:sequence>
              <s:element minOccurs="0" maxOccurs="1" name="username" type="s:string" />
              <s:element minOccurs="0" maxOccurs="1" name="name" type="s:string" />
              <s:element minOccurs="0" maxOccurs="1" name="firstname" type="s:string" />
              <s:element minOccurs="1" maxOccurs="1" name="birthdate" type="s:dateTime" />
              <s:element minOccurs="0" maxOccurs="1" name="city" type="s:string" />
              <s:element minOccurs="0" maxOccurs="1" name="country" type="s:string" />
            </s:sequence>
          </s:complexType>
          <s:element name="CreateResponse">
            <s:complexType>
              <s:sequence>
                <s:element minOccurs="0" maxOccurs="1" name="CreateResult" type="s:string" />
              </s:sequence>
            </s:complexType>
          </s:element>
          <s:element name="Activate">
            <s:complexType>
              <s:sequence>
                <s:element minOccurs="0" maxOccurs="1" name="username" type="s:string" />
                <s:element minOccurs="0" maxOccurs="1" name="key" type="s:string" />
              </s:sequence>
            </s:complexType>
          </s:element>
          <s:element name="ActivateResponse">
            <s:complexType>
              <s:sequence>
                <s:element minOccurs="0" maxOccurs="1" name="ActivateResult" type="s:string" />
              </s:sequence>
            </s:complexType>
          </s:element>
        </s:schema>
      </wsdl:types>
      <wsdl:message name="CreateSoapIn">
        <wsdl:part name="parameters" element="tns:Create" />
      </wsdl:message>
      <wsdl:message name="CreateSoapOut">
        <wsdl:part name="parameters" element="tns:CreateResponse" />
      </wsdl:message>
      <wsdl:message name="ActivateSoapIn">
        <wsdl:part name="parameters" element="tns:Activate" />
      </wsdl:message>
      <wsdl:message name="ActivateSoapOut">
        <wsdl:part name="parameters" element="tns:ActivateResponse" />
      </wsdl:message>
      <wsdl:portType name="AccountSrvSoap">
        <wsdl:operation name="Create">
          <wsdl:input message="tns:CreateSoapIn" />
          <wsdl:output message="tns:CreateSoapOut" />
        </wsdl:operation>
        <wsdl:operation name="Activate">
          <wsdl:input message="tns:ActivateSoapIn" />
          <wsdl:output message="tns:ActivateSoapOut" />
        </wsdl:operation>
      </wsdl:portType>
      <wsdl:binding name="AccountSrvSoap" type="tns:AccountSrvSoap">
        <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
        <wsdl:operation name="Create">
          <soap:operation soapAction="http://tempuri.org/Create" style="document" />
          <wsdl:input>
            <soap:body use="literal" />
          </wsdl:input>
          <wsdl:output>
            <soap:body use="literal" />
          </wsdl:output>
        </wsdl:operation>
        <wsdl:operation name="Activate">
          <soap:operation soapAction="http://tempuri.org/Activate" style="document" />
          <wsdl:input>
            <soap:body use="literal" />
          </wsdl:input>
          <wsdl:output>
            <soap:body use="literal" />
          </wsdl:output>
        </wsdl:operation>
      </wsdl:binding>
      <wsdl:service name="AccountSrv">
        <wsdl:port name="AccountSrvSoap" binding="tns:AccountSrvSoap">
          <soap:address location="http://127.0.0.3:8080/Services/AccountSrv.php" />
        </wsdl:port>
      </wsdl:service>
    </wsdl:definitions>
    Et enfin, voici le code de ma page de test qui appelle la methode Create du web service

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    <?php
    	define('__ROOT__', $_SERVER['DOCUMENT_ROOT']);
    	require_once(__ROOT__.'/Services/AccountSrv.php'); 
    	require_once(__ROOT__.'/Entities/Account.php'); 
     
    	$account = new ATD_Sobul_Web_Entities\Account();
    	$account->username = 'android';
     
    	$wsdl = tempnam(sys_get_temp_dir(), 'wsdl');
    	copy("http://127.0.0.3:8080/Services/AccountSrv.wsdl", $wsdl);
    	$service = new SoapClient($wsdl);
     
    	$response = $service->Create($account);
     
    ?>
    J'ai l'impression que les namespaces (ATD_Sobul_Web_Entities et ATD_Sobul_Web_Services) me mettent le bronx car j'ai le message suivant :
    GET:Unknow attribute account

    Pouvez-vous m'aider ?

    Merci d'avance

  2. #2
    Expert Confirmé Sénior

    Inscrit en
    septembre 2010
    Messages
    7 957
    Détails du profil
    Informations forums :
    Inscription : septembre 2010
    Messages : 7 957
    Points : 10 638
    Points
    10 638

    Par défaut

    Ca sert a rien de faire des getter comme ça. met des vrais methodes pour pass les propriétés en public

    pour quoi le namespace n'est pas : ATD\Sobul\Web\Entities

  3. #3
    Membre habitué
    Inscrit en
    décembre 2004
    Messages
    319
    Détails du profil
    Informations forums :
    Inscription : décembre 2004
    Messages : 319
    Points : 148
    Points
    148

    Par défaut

    Je viens du monde .Net, alors je dois avouer que j'ai un peu de mal à trouver mes marques en PHP

    J'ai refait ma classe Account ainsi :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    	namespace ATD\Sobul\Web\Entities
    	{
    		/// <summary>
    		///  Description complète de la classe. Généralement on donne la fonction de cette classe ainsi que ces particularités
    		///  Possede une méthode <c>UneMethode</c> qui ne sert à rien.
    		/// </summary>
    		/// <seealso cref="ATD\Sobul\Web\Entities\Account">ATD\Sobul\Web\Entities\Account</seealso>
    		class Account{
    			var $username;
    			var $name;
    			var $firstname;
    			var $birthdate;
    			var $city;
    			var $country;
     
    			function __construct() {
    			}
    		}
    	}
    J'ai également changé le namespace de AccountSrv ainsi :
    Code :
    namespace ATD\Sobul\Web\Services
    Ma méthode Create est resté inchangée, tout comme le wsdl

    C'est mieux, je n'ai plus d'erreur, sauf que ma page de test ne me retourne rien

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    	$account = new ATD\Sobul\Web\Entities\Account();
    	$account->username = 'android';
     
    	$wsdl = tempnam(sys_get_temp_dir(), 'wsdl');
    	copy("http://127.0.0.3:8080/Services/AccountSrv.wsdl", $wsdl);
    	$service = new SoapClient($wsdl);
    	$response = $service->Create($account);
     
    	if (is_soap_fault($response)) {
    	echo 'fault : ';
    		var_dump($service->__getLastRequest());
    		var_dump($service->__getLastRequestHeaders());
    	} else {
    	echo '<pre>'.var_export($response, true).'</pre>';
    	}
    Le retour est le suivant :
    stdClass::__set_state(array(
    ))


    Une idée ?
    Merci d'avance

  4. #4
    Membre habitué
    Inscrit en
    décembre 2004
    Messages
    319
    Détails du profil
    Informations forums :
    Inscription : décembre 2004
    Messages : 319
    Points : 148
    Points
    148

    Par défaut

    Le prob venait de mon wsdl

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •