web-dev-qa-db-fra.com

Inspecter le XML créé par PHP appel SoapClient avant / sans envoyer la demande

La question: existe-t-il un moyen d'afficher le XML qui serait créé avec un appel à la fonction PHP SoapClient AVANT d'envoyer réellement la demande?

contexte:

Je suis nouveau dans la communication WSDL, et j'ai un client qui souhaite que je développe en PHP, un moyen de communiquer avec un service WSDL écrit en ASP.NET. Je suis allé assez loin, mais je rencontre un problème quand il s'agit de passer un type complexe. Jusqu'à présent, j'ai essayé deux ou trois choses différentes.

1) Configuration d'un seul tableau tel que $params->Person->name$params->Person->address

2) Configuration d'un seul tableau $Person = array('name'=>"joe",'address' = "123");

puis passer à l'appel en tant que param "Person" => $ Person; et quelques autres. Mais à chaque fois que je reçois l'erreur

SoapException: le serveur n'a pas pu traiter la demande ---> System.Exception: la personne est requise. au nom du service.

Afin de poursuivre le dépannage, je voudrais voir le document XML qui est envoyé pour voir s'il crée un type complexe de la manière dont je m'attends à ce qu'il le fasse. Je crée le service en utilisant $client = new SoapClient('wsdldoc.asmx?WSDL'); en l'appelant avec $client->CreateUser($params); puis j'essaye de le voir en utilisant la fonction $client->__getLastRequest(); mais il ne parvient jamais à __getLastRequest car il frappe une erreur fatale lors de l'appel de CreateUser ($ params).

La question est à nouveau: existe-t-il un moyen d'afficher le XML créé par l'appel de CreateUser ($ params) SANS réellement l'envoyer et provoquer une erreur fatale

38
Joshua Cook

Remarque initiale: Pour utiliser avec succès la méthode __getLastRequest() , vous devez définir la 'trace 'option à true sur la construction du client:

$client = new SoapClient('wsdldoc.asmx?WSDL', array('trace' => TRUE));

De cette façon, votre demande sera toujours envoyée (et échouera donc toujours), mais vous pouvez inspecter le xml envoyé après = en appelant $client->__getLastRequest().


Réponse principale:

Pour avoir accès au XML généré avant/sans envoi de la demande, vous devez sous-classer le SoapClient afin de remplacer le __doRequest() méthode:

class SoapClientDebug extends SoapClient
{
  public function __doRequest($request, $location, $action, $version, $one_way = 0) {
      // Add code to inspect/dissect/debug/adjust the XML given in $request here

      // Uncomment the following line, if you actually want to do the request
      // return parent::__doRequest($request, $location, $action, $version, $one_way);
  }
}

Vous utiliseriez ensuite cette classe étendue au lieu du SoapClient d'origine lors du débogage de votre problème.

81
Henrik Opel

J'ai trouvé ce fil en travaillant sur le même problème, et j'ai été déçu parce que j'utilisais des classes qui étendaient déjà la classe SoapClient () et que je ne voulais pas trop le contourner. Cependant, si vous ajoutez la balise "exceptions" => 0 lorsque vous lancez la classe, elle ne générera pas d'erreur fatale (bien qu'elle imprimera une exception):

SoapClient($soapURL,array("trace" => 1,"exceptions"=>0));

Cela m'a permis d'exécuter __getLastRequest () et d'analyser le XML que j'envoyais.

8
andrewembassy

Je ne pense pas qu'il existe un moyen de voir le XML en cours de création ... principalement parce que la fonction échoue lors de sa tentative de création/transmission.

Je ne sais pas si vous avez déjà essayé, mais si vous avez du mal à décider ce dont vous avez besoin pour passer à la fonction que vous pourriez utiliser:

$ client -> __ getTypes ();

http://us3.php.net/manual/en/soapclient.gettypes.php

J'espère que cela t'aides!

1
BrandonCS