web-dev-qa-db-fra.com

Comment poster SOAP Demande de PHP

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

46
Jin Yong

D'après mon expérience, ce n'est pas si simple. Le client PHP SOAP intégré ne fonctionnait pas avec le serveur SOAP basé sur .NET que nous devions utiliser. Il s'est plaint d'une définition de schéma non valide. Même si le client .NET fonctionnait parfaitement avec ce serveur. À propos, permettez-moi d'affirmer que l'interopérabilité SOAP est un mythe.

L'étape suivante était NuSOAP . Cela a fonctionné pendant un bon moment. À propos, pour l'amour de Dieu, n'oubliez pas de mettre en cache WSDL! Mais même avec le cache WSDL, les utilisateurs se sont plaints du fait que la chose est lente.

Ensuite, nous avons décidé d’exécuter HTTP nu, en assemblant les demandes et en lisant les réponses avec 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 que dans PHP 5.2, vous aurez besoin de pecl_http, pour autant que (surprise-surpise!), Aucun client HTTP ne soit intégré.

Le passage à HTTP simple nous a valu plus de 30% de temps de requête SOAP. Et à partir de là, nous redirigeons toutes les plaintes relatives aux performances vers les serveurs.

Au final, je recommanderais cette dernière approche, et non à cause des performances. Je pense qu'en général, dans un langage dynamique comme PHP, aucun avantage de tout ce que WSDL/type-control. Vous n'avez pas besoin d'une bibliothèque sophistiquée pour lire et écrire du XML, avec toute cette génération de stubs et de proxies dynamiques. Votre langue est déjà dynamique et SimpleXMLElement fonctionne très bien et est si facile à utiliser. De plus, vous aurez less code, ce qui est toujours bon.

41
Ivan Krechetov

PHP supporte 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/fr/soapclient.soapclient.php

26
Sharj

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);
7
Tim Duncklee

Nous pouvons utiliser la bibliothèque PHP cURL pour générer une simple requête HTTP POST. L'exemple suivant montre comment créer une requête simple SOAP à l'aide de cURL.

Créez le fichier soap-server.php qui écrit la demande SOAP dans le fichier soap-request.xml du dossier Web.

We can use the PHP cURL library to generate simple HTTP POST request. The following example shows you how to create a simple SOAP request using cURL.

Create the soap-server.php which write the SOAP request into soap-request.xml in web folder.


<?php
  $HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
  $f = fopen("./soap-request.xml", "w");
  fwrite($f, $HTTP_RAW_POST_DATA);
  fclose($f);
?>


The next step is creating the soap-client.php which generate the SOAP request using the cURL library and send it to the soap-server.php URL.

<?php
  $soap_request  = "<?xml version=\"1.0\"?>\n";
  $soap_request .= "<soap:Envelope xmlns:soap=\"http://www.w3.org/2001/12/soap-envelope\" soap:encodingStyle=\"http://www.w3.org/2001/12/soap-encoding\">\n";
  $soap_request .= "  <soap:Body xmlns:m=\"http://www.example.org/stock\">\n";
  $soap_request .= "    <m:GetStockPrice>\n";
  $soap_request .= "      <m:StockName>IBM</m:StockName>\n";
  $soap_request .= "    </m:GetStockPrice>\n";
  $soap_request .= "  </soap:Body>\n";
  $soap_request .= "</soap:Envelope>";

  $header = array(
    "Content-type: text/xml;charset=\"utf-8\"",
    "Accept: text/xml",
    "Cache-Control: no-cache",
    "Pragma: no-cache",
    "SOAPAction: \"run\"",
    "Content-length: ".strlen($soap_request),
  );

  $soap_do = curl_init();
  curl_setopt($soap_do, CURLOPT_URL, "http://localhost/php-soap-curl/soap-server.php" );
  curl_setopt($soap_do, CURLOPT_CONNECTTIMEOUT, 10);
  curl_setopt($soap_do, CURLOPT_TIMEOUT,        10);
  curl_setopt($soap_do, CURLOPT_RETURNTRANSFER, true );
  curl_setopt($soap_do, CURLOPT_SSL_VERIFYPEER, false);
  curl_setopt($soap_do, CURLOPT_SSL_VERIFYHOST, false);
  curl_setopt($soap_do, CURLOPT_POST,           true );
  curl_setopt($soap_do, CURLOPT_POSTFIELDS,     $soap_request);
  curl_setopt($soap_do, CURLOPT_HTTPHEADER,     $header);

  if(curl_exec($soap_do) === false) {
    $err = 'Curl error: ' . curl_error($soap_do);
    curl_close($soap_do);
    print $err;
  } else {
    curl_close($soap_do);
    print 'Operation completed without any errors';
  }
?>


Enter the soap-client.php URL in browser to send the SOAP message. If success, Operation completed without any errors will be shown and the soap-request.xml will be created.

<?xml version="1.0"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
  <soap:Body xmlns:m="http://www.example.org/stock">
    <m:GetStockPrice>
      <m:StockName>IBM</m:StockName>
    </m:GetStockPrice>
  </soap:Body>
</soap:Envelope>


Original - http://eureka.ykyuen.info/2011/05/05/php-send-a-soap-request-by-curl/
4
senanqerib

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);
?>
3
Filip Ekberg

Vous trouverez ci-dessous un exemple rapide expliquant comment procéder (ce qui m’explique le mieux pour moi) que j’ai trouvé essentiellement sur ce site Web . Ce lien de site Web explique également WSDL, ce qui est important pour utiliser les services SOAP. 

Cependant, je ne pense pas que l'adresse de l'API qu'ils utilisaient dans l'exemple ci-dessous fonctionne toujours, alors changez simplement de votre choix.

$wsdl = 'http://terraservice.net/TerraService.asmx?WSDL';

$trace = true;
$exceptions = false;

$xml_array['placeName'] = 'Pomona';
$xml_array['MaxItems'] = 3;
$xml_array['imagePresence'] = true;

$client = new SoapClient($wsdl, array('trace' => $trace, 'exceptions' => $exceptions));
$response = $client->GetPlaceList($xml_array);

var_dump($response);
2
Cato Minor

Si le XML a des identités portant le même nom à différents niveaux, il existe une solution. Vous n’avez jamais besoin de soumettre un fichier XML brut (cet objet PHP SOAP n’autorise pas l’envoi d’un fichier RAW XML). Vous devez donc toujours traduire votre code XML en un tableau, comme dans l’exemple ci-dessous. :

$originalXML = "
<xml>
  <firstClient>
      <name>someone</name>
      <adress>R. 1001</adress>
  </firstClient>
  <secondClient>
      <name>another one</name>
      <adress></adress>
  </secondClient>
</xml>"

//Translate the XML above in a array, like PHP SOAP function requires
$myParams = array('firstClient' => array('name' => 'someone',
                                  'adress' => 'R. 1001'),
            'secondClient' => array('name' => 'another one',
                                  'adress' => ''));

$webService = new SoapClient($someURL);
$result = $webService->someWebServiceFunction($myParams);

ou 

$soapUrl = "http://privpakservices.schenker.nu/package/package_1.3/packageservices.asmx?op=SearchCollectionPoint";

$xml_post_string = '<?xml version="1.0" encoding="utf-8"?><soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"><soap12:Body><SearchCollectionPoint xmlns="http://privpakservices.schenker.nu/"><customerID>XXX</customerID><key>XXXXXX-XXXXXX</key><serviceID></serviceID><paramID>0</paramID><address>RiksvŠgen 5</address><postcode>59018</postcode><city>Mantorp</city><maxhits>10</maxhits></SearchCollectionPoint></soap12:Body></soap12:Envelope>';

$headers = array(
"POST /package/package_1.3/packageservices.asmx HTTP/1.1",
"Host: privpakservices.schenker.nu",
"Content-Type: application/soap+xml; charset=utf-8",
"Content-Length: ".strlen($xml_post_string)
); 

$url = $soapUrl;

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_post_string);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$response = curl_exec($ch); 
curl_close($ch);

$response1 = str_replace("<soap:Body>","",$response);
$response2 = str_replace("</soap:Body>","",$response1);

$parser = simplexml_load_string($response2);
1
Saber Daagi