it-swarm.com.de

Wie schreibe ich? SOAP Anfrage von PHP

Jeder weiß, wie ich eine SOAP - Anfrage von PHP posten kann?

46
Jin Yong

Nach meiner Erfahrung ist das nicht ganz so einfach. Der eingebaute PHP SOAP - Client funktionierte nicht mit dem .NET-basierten SOAP -Server, den wir verwenden mussten. Es beschwerte sich über eine ungültige Schemadefinition. Obwohl der .NET-Client mit diesem Server gut funktioniert hat. Übrigens möchte ich behaupten, dass SOAP Interoperabilität ein Mythos ist.

Der nächste Schritt war NuSOAP . Das hat eine ganze Weile funktioniert. Übrigens, um Himmels willen, vergiss nicht, WSDL zu cachen! Aber selbst mit WSDL-Cache-Usern klagt die verdammte Sache langsam.

Dann entschieden wir uns für HTTP, um die Anforderungen zusammenzustellen und die Antworten mit SimpleXMLElemnt zu lesen, wie folgt:

$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";
}

Beachten Sie, dass Sie in PHP 5.2 pecl_http benötigen, sofern (Überraschungsüberraschung!) Kein HTTP-Client eingebaut ist.

Durch das bloße HTTP gewannen wir über 30% an SOAP - Anforderungszeiten. Und von da an leiten wir alle Leistungsbeschwerden an die Server-Jungs weiter.

Am Ende würde ich diesen letzteren Ansatz empfehlen, und nicht wegen der Leistung. Ich denke, in einer dynamischen Sprache wie PHP gibt es keinen Nutzen von all dem, was WSDL/type-control ist. Sie benötigen keine ausgefallene Bibliothek zum Lesen und Schreiben von XML mit all dieser Stubs-Generierung und dynamischen Proxies. Ihre Sprache ist bereits dynamisch und SimpleXMLElement funktioniert einwandfrei und ist so einfach zu bedienen. Außerdem haben Sie less Code, was immer gut ist.

41
Ivan Krechetov

PHP unterstützt SOAP. Ruf einfach an

$client = new SoapClient($url);

um sich mit dem SoapServer zu verbinden, erhalten Sie eine Liste von Funktionen und rufen Funktionen auf, indem Sie einfach ...

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

$result = $client->functionName();  

für mehr http://www.php.net/manual/de/soapclient.soapclient.php

26
Sharj

Ich musste viele sehr einfache XML-Anforderungen erstellen und nachdem ich @Ivan Krechetovs Kommentar zum Geschwindigkeitstreffer von SOAP gelesen hatte, versuchte ich seinen Code und stellte fest, dass http_post_data () nicht in PHP 5.2 eingebaut ist. Ich wollte es nicht wirklich installieren, ich habe cURL auf allen Servern ausprobiert. Obwohl ich nicht weiß, wie schnell cURL im Vergleich zu SOAP ist, war es einfach, das zu tun, was ich brauchte. Nachfolgend finden Sie ein Beispiel mit cURL für alle, die dies benötigen.

$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

Wir können die cURL-Bibliothek PHP verwenden, um eine einfache HTTP-Anforderung POST zu generieren. Das folgende Beispiel zeigt Ihnen, wie Sie eine einfache SOAP - Anforderung mit cURL erstellen.

Erstellen Sie die soap-server.php, die die Anforderung SOAP in soap-request.xml im Webordner schreibt.

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

Vielleicht möchten Sie hier und hier suchen.

Ein kleines Codebeispiel vom ersten Link:

<?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

Nachfolgend finden Sie ein schnelles Beispiel dafür (was die Angelegenheit am besten für mich erklärt hat), das ich im Wesentlichen auf dieser Website gefunden habe. Dieser Website-Link erklärt auch WSDL, was für die Arbeit mit SOAP -Diensten wichtig ist. 

Ich glaube jedoch nicht, dass die API-Adresse, die sie im folgenden Beispiel verwendet haben, immer noch funktioniert. Wechseln Sie also einfach eine Ihrer eigenen Entscheidungen.

$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

Wenn das XML identische Identitäten auf verschiedenen Ebenen hat, gibt es eine Lösung. Sie müssen niemals ein Roh-XML übergeben (dieses PHP SOAP - Objekt erlaubt das Senden von RAW-XML nicht). Daher müssen Sie Ihr XML immer in ein Array übersetzen, wie im folgenden Beispiel :

$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);

oder 

$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