45 votes

Inspecter XML créé par PHP SoapClient appel avant / sans envoi de la demande

La question: Est-il un moyen de visualiser le fichier XML qui sera créé avec un PHP SoapClient appel de fonction AVANT de vous envoyer la demande?

arrière-plan:

Je suis nouveau sur le WSDL de la communication, et j'ai un client qui veut me développer en PHP, un moyen de communiquer avec un WSDL du service écrit en ASP.NET. J'ai obtenu assez loin, mais je suis en cours d'exécution dans un problème quand il s'agit de passer d'un type complexe. J'ai essayé un couple de différentes choses jusqu'à présent.

1) mettre en place un seul tableau, telles que $params->Person->name $params->Person->address

2) mettre en place un seul tableau $Person = array('name'=>"joe",'address' = "123");

puis, passant à l'appel comme un param "Personne" => $Personne; et quelques autres. Mais à chaque fois j'ai l'erreur

SoapException: Serveur n'a pas pu processus de demande ---> Système.Exception: Personne est Nécessaire. au nom du service.

Afin de poursuivre le dépannage, je voudrais voir le document XML qui est envoyé pour voir si c'est la création d'un type complexe dans la façon dont je suis l'attend. Je suis de la création du service à l'aide de $client = new SoapClient('wsdldoc.asmx?WSDL'); de l'appeler avec $client->CreateUser($params); , puis en essayant de le voir à l'aide de la fonction $client->__getLastRequest(); , mais il ne se rend jamais à l' __getLastRequest parce qu'il frappe une erreur fatale lors de l'appel de CreateUser($params).

De nouveau la question: Est-il possible de visualiser le fichier XML créé par le CreateUser($params) appel SANS réellement l'envoyer et provoquant une erreur fatale

87voto

Henrik Opel Points 16296

D'avance remarque: pour utiliser l' __getLastRequest() méthode avec succès, vous devez définir la "trace" de l'option à true sur le client de la construction:

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

De cette façon, votre demande sera envoyé (et donc de ne toujours pas), mais vous pouvez inspecter le xml envoyé par la suite en appelant $client->__getLastRequest().


Principale réponse:

Pour obtenir l'accès à l'XML généré avant/sans envoi de la demande, vous aurez besoin de sous-classe, les SoapClient afin de remplacer l' __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 pouvez utiliser cette extension de la classe au lieu de l'original SoapClient pendant le débogage de votre problème.

9voto

andrewembassy Points 27

J'ai trouvé ce fil tout en travaillant sur le même problème, et a été déçu parce que j'utilisais des classes qui ont déjà étendu la classe SoapClient() et ne voulait pas vis autour avec elle trop. Toutefois, si vous ajoutez l'étiquette "exceptions" lorsque vous lancez la classe, elle ne lancera pas d'erreur fatale (bien qu'elle imprime une exception) :

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

1voto

BrandonCS Points 29

Je ne crois pas qu'il y a moyen que vous serez en mesure de voir toute XML en cours de création... principalement parce que la fonction est en échec sur sa tentative de créer/transmettre.

Vous ne savez pas si vous avez déjà essayé, mais si vous avez de la difficulté à essayer de décider ce qu'est exactement vous avez besoin pour réussir dans la fonction que vous pouvez utiliser:

$client->__getTypes();

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

Espérons que cette aide!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X