Question PHP, PEAR SOAP, Dotnet et sérialisation

Question PHP, PEAR SOAP, Dotnet et sérialisation - PHP - Programmation

Marsh Posté le 23-05-2007 à 19:11:22    

Bonjour,
 
J'ai actuellement un ensemble de webservices dotnet que je consomme en php via la librairie PEAR SOAP.
 
Un de mes webservices: GetInfo() prend en entrée un objet. J'utilise, pour appeler le webservice, la méthode SOAP_WSDL:
 
 
$wsdl = new SOAP_WSDL('http://xxxxxxxx/service.asmx?wsdl', $proxy);
$Client = $wsdl->getProxy();
 
 
$objRetour = $Client->GetInfo($location);
 
mon objet "location" etant une classe contenant des types simples:
 
  class location
  {
    var $city;
    var $zipCode;
  }
 
et l'equivalent coté dotnet:
 public class Location
 {
  private string _strCity;
  private int _intZipCode;
  private bool _blnZipCodeSpecified = false;
 
  public Location()
  {
  }
 
  [XmlElement("city" )]
  public string City
  {
   get  
   { return  this._strCity; }
   set  
   { this._strCity = value; }
  }
 
  [XmlElement("zipCode" )]
  public int ZipCode
  {
   get  
   { return  this._intZipCode; }
   set  
   { this._intZipCode = value; }
  }
 
  [XmlIgnoreAttribute()]
  public bool ZipCodeSpecified
  {
   get  
   { return  this._blnZipCodeSpecified; }
   set  
   { this._blnZipCodeSpecified = value; }
  }
 }
 
Je ne peux pas, en php, typer les variables.
 
Si ma variable zipCode n'est pas remplie dans l'objet lors de son instanciation:
 
1. si je consomme mon webservice depuis dotnet, le fait d'avoir créé un attribut ZipCodeSpecified et de le mettre à false n'inclut pas la variable ZipCode dans le message soap.
 
2. Par contre, si je consomme le webservice depuis PHP, comme PHP ne type pas les variables lors de la déclaration, dans le message soap, la variable est inclue et contient une chaine vide, ce qui, a l'appel du webservice, crée une erreur puisque le type attendu par dotnet est un entier.
 
Ma question est donc la suivante: existe t-il un mécanisme (comme en dotnet) pour forcer php ou PEAR à ne pas inclure les variables qui n'ont pas été affectées sachant que je n'ai pas envie de construire mon xml manuellement et que je veux utiliser la méthode SOAP_WSDL?
 
J'espère avoir été assez clair dans mes explications. Merci d'avance pour vos réponses.
 
Yannick

Reply

Marsh Posté le 23-05-2007 à 19:11:22   

Reply

Marsh Posté le 02-06-2007 à 10:24:13    

Je fais la même chose sauf que je n'ai pas fait de classe coté PHP
$param->$city = 'Paris';  
$param->$zipCode = '75012';
 
$objRetour = $Client->GetInfo($param);
Ca fait un objet par défaut qui passe bien au dotnet.
il est typé par ta classe dotnet.
 
 
Moi j'ai du passer par une classe proxy interne au WS car la couche d'accés aux données est spécifique.
 
Je n'utilise pas   [XmlElement("champ" )]  [XmlIgnoreAttribute()] car même si c'est envellopé dans du XML pour la question et la réponse, l'exploitation de l'objet ne se fait que si c'est sérializable. (Me rappele plus de la balise à mettre en tête de classe)
 
On a réussi a passer des objets contenant des collections comme ca.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed