2009-12-22 14 views
3

Je construis (en PHP) un serveur SOAP qui est configuré par son WSDL pour accepter des messages qui ressemblent à ceci:en-têtes SOAP Process en PHP

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="https://my.awesome.namespace/"> 
    <SOAP-ENV:Header> 
     <ns1:Header> 
      <ns1:APIKey>E4C5BDE0-48DC-543C-1CA3-8E55C63F8E60</ns1:APIKey> 
      <ns1:SiteID>111</ns1:SiteID> 
     </ns1:Header> 
    </SOAP-ENV:Header> 
    <SOAP-ENV:Body> 
     <ns1:Heartbeat> 
      <ns1:Message>Hello world.</ns1:Message> 
     </ns1:Heartbeat> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

J'ai eu aucun problème à obtenir mon SoapServer pour traiter les messages Heartbeat - $server->addFunction("Heartbeat"); fonctionne très bien. Je veux cependant être en mesure de traiter le contenu du boîtier <ns1:Header> - afin que je puisse valider la clé API et l'ID du site pour m'assurer qu'ils sont ce qu'ils devraient être.

J'ai regardé here, (et bien sûr ailleurs) mais le répondeur semble avoir manqué le point de la question. Est-ce que quelqu'un sait comment je peux accéder à l'élément d'en-tête pour valider? Dois-je ajouter une fonction pour Header comme je le ferais pour une méthode dans le corps? ($server->addFunction("Header");?)

Merci beaucoup d'avance.

Répondre

6

Trouvé! Voici ce que vous faites.

Créer votre serveur SOAP:

$server = new SoapServer($your_wsdl,$any_options); 
$server->setClass($name_of_your_class); 
$server->handle($location_of_request_data); 

La classe nommée dans $name_of_your_class, en plus de contenir des fonctions pour chaque service défini dans $your_wsdl, devrait également contenir une fonction nommée pour tout ce que vous avez dans votre enceinte tag <SOAP-ENV:Header>. J'ai <ns1:Header>, donc ma fonction s'appelle Header. Mettez la logique dont vous avez besoin là-dedans. Pour moi, je voulais valider la clé API et l'ID du site, j'ai donc créé une variable privée, et si la clé API et l'ID du site sont corrects, la variable est définie sur true. Toutes les autres fonctions de la classe vérifient si cette variable est vraie avant de continuer, et sinon, un SOAPFault est lancé.

J'espère que cela aide tous ceux qui rencontrent cette question sur Google.

P.S .: Pour les fonctions de la classe définie en $server->setClass(), n'oubliez pas qu'elles doivent accepter les arguments dans l'ordre défini dans le WSDL. Cela m'a fait trébucher.

Bonne chance à tous les autres développeurs PHP/SOAP - semble que nous en avons tous besoin. Edit/P.P.S .: Pour une raison quelconque, appeler simplement $server->addFunction("Header") ne fonctionnait pas pour moi - j'ai essayé cela avant d'avoir essayé l'approche setClass ci-dessus. Juste un heads-up pour les gens.