56 votes

Comment publier une requête SOAP depuis PHP

Quelqu'un sait comment puis-je poster une demande SOAP de PHP?

48voto

Ivan Krechetov Points 6465

Dans mon expérience, il n'est pas si simple. Le haut- PHP SOAP client ne fonctionne pas avec le .NET-SAVON à base de serveur, nous avons eu à utiliser. Il s'est plaint d'un invalide de définition de schéma. Même si .NET client travaillé avec le serveur à l'amende juste. En passant, permettez-moi de prétendre que le SAVON d'interopérabilité est un mythe.

L'étape suivante a été NuSOAP. Cela a fonctionné pendant un certain temps. Par la voie, pour l'amour de Dieu, n'oubliez pas de cache WSDL! Mais même avec WSDL en cache les utilisateurs se sont plaints que la fichue chose est lente.

Ensuite, nous avons décidé d'aller nu HTTP, de l'assemblage de la demande et de la lecture les réponses en SimpleXMLElemnt, comme ceci:

$request_info = array();

$full_response = @http_post_data(
    'http://example.com/OTA_WS.asmx',
    $REQUEST_BODY,
    array(
        'headers' => array(
            'Content-Type' => 'text/xml; charset=UTF-8',
            'SOAPAction' => 'HotelAvail',
        ),
        'timeout' => 60,

    ),
    $request_info
);

$response_xml = new SimpleXMLElement(strstr($full_response, '<?xml'));

foreach ($response_xml->xpath('//@HotelName') as $HotelName) {
    echo strval($HotelName) . "\n";
}

Notez qu'en PHP 5.2, vous aurez besoin pecl_http, autant que (surprise-surprise!) il n'y a pas de client HTTP intégré.

Va nu HTTP gagné de nous de plus de 30% le SAVON de demande de fois. Et à partir de là, nous rediriger toutes les performances se plaint au serveur les gars.

En fin de compte, je vous recommande cette dernière approche, et pas à cause de la performance. Je pense que, en général, dans un langage dynamique comme PHP il n'y a pas de profiter de tout ce que le WSDL/type de contrôle. Vous n'avez pas besoin d'une fantaisie de la bibliothèque pour lire et écrire du XML, avec tout ce que la génération des stubs et des proxies dynamiques. Votre langue est déjà dynamique, et SimpleXMLElement fonctionne très bien, et est très facile à utiliser. De plus, vous aurez moins de code, ce qui est toujours bon.

31voto

Sharj Points 2398

PHP a un support SOAP. Il suffit d'appeler

 $client = new SoapClient($url);
 

pour vous connecter au serveur SoapServer et ensuite vous pouvez obtenir la liste des fonctions et appeler des fonctions simplement en faisant ...

 $client->__getTypes();      
$client->__getFunctions();  

$result = $client->functionName();  
 

pour plus http://www.php.net/manual/en/soapclient.soapclient.php

10voto

Tim Duncklee Points 417

J'avais besoin de faire de nombreuses requêtes XML très simples et après avoir lu le commentaire de @Ivan Krechetov sur le succès de SOAP, j'ai essayé son code et découvert que http_post_data () n'est pas intégré à PHP 5.2. Ne voulant vraiment pas l'installer, j'ai essayé cURL qui est sur tous mes serveurs. Bien que je ne sache pas à quelle vitesse cURL est comparé à SOAP, il était facile de faire ce dont j'avais besoin. Vous trouverez ci-dessous un exemple avec cURL pour ceux qui en ont besoin.

 $xml_data = '<?xml version="1.0" encoding="UTF-8" ?>
<priceRequest><customerNo>123</customerNo><password>abc</password><skuList><SKU>99999</SKU><lineNumber>1</lineNumber></skuList></priceRequest>';
$URL = "https://test.testserver.com/PriceAvailability";

$ch = curl_init($URL);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml'));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "$xml_data");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);


print_r($output);
 

3voto

Filip Ekberg Points 22189

Vous voudrez peut-être regarder ici et ici .

Un petit exemple de code du premier lien:

 <?php
// include the SOAP classes
require_once('nusoap.php');
// define parameter array (ISBN number)
$param = array('isbn'=>'0385503954');
// define path to server application
$serverpath ='http://services.xmethods.net:80/soap/servlet/rpcrouter';
//define method namespace
$namespace="urn:xmethods-BNPriceCheck";
// create client object
$client = new soapclient($serverpath);
// make the call
$price = $client->call('getPrice',$param,$namespace);
// if a fault occurred, output error info
if (isset($fault)) {
        print "Error: ". $fault;
        }
else if ($price == -1) {
        print "The book is not in the database.";
} else {
        // otherwise output the result
        print "The price of book number ". $param[isbn] ." is $". $price;
        }
// kill object
unset($client);
?>
 

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