2009-09-04 5 views
2

OK n00b ici avec SOAP,Comment obtenir un post SOAP en PHP?

Aimeriez-vous des précisions sur l'utilisation de SOAP.

Question:

je Java JSP qui affiche un WSDL (Ressemble format XML) à mon script PHP, mais comment puis-je obtenir cela dans le script PHP? L'URL du WSDL sera différente à chaque fois.

Je suis sûr que c'est très simple, mais je ne vois pas comment ou je ne comprends pas correctement?

Répondre

6

Vous pouvez essayer quelque chose comme ceci:

 
try {                                           
    if (!($xml = file_get_contents('php://input'))) { 
    throw new Exception('Could not read POST data.'); 
    } 
} catch (Exception $e) { 
    print('Did not successfully process HTTP request: '.$e->getMessage()); 
    exit; 
} 

Cela va lire le corps de la requête POST à ​​la variable $ xml et imprimer une erreur si elle existe.

+0

Vous n'avez jamais vu ce "php: // input", est-ce que cela lit les données RAW? –

+0

Merci cela fonctionne très bien –

0

Voulez-vous dire que le JSP envoie le WSDL dans une requête POST au script PHP? Si c'est le cas, regardez le tableau $ _POST. Si vous spécifiez exactement comment le JSP l'envoie, je peux probablement vous aider plus. Quoi qu'il en soit, une fois que vous avez l'URL WSDL dans une variable de votre script PHP, vous pouvez y avoir la classe SoapClient.

+0

Oui c'est la voie dont je parle, alors peut-être que je pourrais juste consommer le poste RAW et l'analyser de cette façon? –

0

Dans le meilleur scénario:

$soapClient = new SoapClient($wsdlUrl, $soapOptions); 
$soapClient->callYourMethod(); 

Mais vous êtes susceptible de frapper beaucoup de murs en briques lors de l'utilisation SOAP. Voici le documentation for SoapClient.

Edit:

Ainsi, le WSDL est POST-ed. Ensuite, vous pouvez y accéder en utilisant $HTTP_RAW_POST_DATA si la chaîne XML a été envoyée en tant que corps HTTP ou en utilisant la superglobale $_FILES si la chaîne XML a été envoyée dans le cadre d'une requête en plusieurs parties.

Quelque chose comme ceci:

$wsdl = $HTTP_RAW_POST_DATA; 
$wsdlUrl = 'data:text/xml;base64,' . base64_encode($wsdl); 
$soapClient = new SoapClient($wsdlUrl); 

Quoi qu'il en soit, $HTTP_RAW_POST_DATA est uniquement disponible si le réglage php.ini always_populate_raw_post_data est activée. En outre, si la requête était multipart, ce paramètre est ignoré, $HTTP_RAW_POST_DATA n'est pas renseigné mais vous avez accès aux pièces postées en utilisant $_FILES. Et vous pouvez, en effet, utiliser php://input au lieu de $HTTP_RAW_POST_DATA.

De même, data URIs ne peut être utilisé que lorsque allow_url_fopen est activé dans php.ini.

+0

mais comment obtenir le $ wsdlUrl? c'est ce qui change à chaque fois que j'ai besoin du script PHP à gérer –

+0

Ici, l'URL contient les données elles-mêmes: Le protocole URL n'est pas http, mais des données. Si la classe SoapClient gère cela, alors c'est la meilleure solution. – gnud