Quelqu'un sait comment puis-je poster une demande SOAP de PHP?
Réponses
Trop de publicités?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.
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
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);
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);
?>