Heim  >  Artikel  >  Backend-Entwicklung  >  So implementieren Sie WebService mithilfe der SOAP-Erweiterung in PHP

So implementieren Sie WebService mithilfe der SOAP-Erweiterung in PHP

高洛峰
高洛峰Original
2017-01-24 10:06:091241Durchsuche

Das Beispiel in diesem Artikel beschreibt, wie PHP die SOAP-Erweiterung verwendet, um WebService zu implementieren. Ich teile es mit Ihnen als Referenz:

In einem PHP-Projekt gibt es nicht viele verwandte Artikel zu Suchmaschinen zu NuSOAP, einer Open-Source-Software, die als sehr leistungsfähig gilt (Download-Adresse: http://sourceforge.net/projects/nusoap/), also einige Klassen. Die im Artikel beschriebene Umgebung ist PHP 4.3. Heutzutage ist PHP 5.2 oder PHP 5.3 beliebt. Ich habe es zuerst versucht und es falsch ausgeführt. Es stellte sich heraus, dass die von NuSOAP bereitgestellte SoapClient-Klasse mit der SoapClient-Klasse in Konflikt steht, die über eine neue integrierte SOAP-Erweiterung in PHP 5 verfügt.

Obwohl NuSOAP angeblich in allen PHP-Umgebungen verwendet wird, wird es nicht von den Serversicherheitseinstellungen beeinflusst. Da ich jedoch viele Klassendateien referenzieren muss, halte ich es immer noch für besser, die in PHP 5 hinzugefügte integrierte SOAP-Erweiterung zu verwenden, sofern dies praktisch ist. Erfahren Sie zunächst etwas über SOAP:

1. Vergleich zwischen SOAP und XML-PRC

In den Anfängen der Entwicklung von Webdiensten wurden XML-formatierte Nachrichten erstmals in großem Umfang verwendet das XML-RPC-Protokoll, wobei RPC für Remote Procedure Call steht. Beim XML Remote Procedure Call (XML-RPC) sendet der Client eine bestimmte Nachricht, die den Namen, das Programm, das den Dienst ausführt, und die Eingabeparameter enthalten muss.

XML-RPC kann nur eine begrenzte Vielfalt an Datentypen und einige einfache Datenstrukturen verwenden. Die Leute dachten, dass dieses Protokoll nicht leistungsfähig genug sei, also erschien SOAP – seine ursprüngliche Definition war Simple Object Access Protocol. Danach wurde allen nach und nach klar, dass SOAP nicht einfach ist und keine objektorientierte Sprache erfordert. Daher verwenden die Leute jetzt einfach den Namen SOAP.

XML-RPC verfügt nur über einen einfachen Satz von Datentypen. Stattdessen definiert SOAP Datentypen durch Nutzung der kontinuierlichen Weiterentwicklung des XML-Schemas. Gleichzeitig kann SOAP auch XML-Namespaces nutzen, was für XML-RPC nicht erforderlich ist. Dies ermöglicht, dass der Anfang einer SOAP-Nachricht eine beliebige Art von XML-Namespace-Deklaration sein kann, was jedoch zu mehr Komplexität und Inkompatibilität zwischen Systemen führt.

Mit dem Erwachen der Computerindustrie entdeckten die Menschen das Geschäftspotenzial von XML-basierten Webdiensten, sodass Unternehmen begannen, kontinuierlich Ideen, Meinungen, Argumente und Standardisierungsversuche zu erforschen. Das W3C versuchte einmal, eine Erfolgsausstellung unter dem Namen „Web Services Activities“ zu organisieren, zu der auch die XML Protocol Working Group (XML Protocol Working Group) gehörte, die tatsächlich SOAP erstellte. Die Zahl der Standardisierungsbemühungen im Zusammenhang mit Webdiensten, die in irgendeiner Weise mit SOAP in Zusammenhang stehen oder von SOAP abhängig sind, hat sich in erstaunlichem Maße verdoppelt.

Ursprünglich wurde SOAP als Erweiterung von XML-RPC entwickelt. Sein Hauptaugenmerk liegt auf der Durchführung von Remote-Prozeduraufrufen über Methoden- und Variablennamen, die aus WSDL-Dateien abgerufen werden. Durch kontinuierliche Weiterentwicklung haben die Menschen nun mehr Möglichkeiten gefunden, SOAP als nur die „Datei“-Methode zu verwenden – im Wesentlichen die Verwendung eines SOAP-Umschlags zum Senden von XML-formatierten Dateien. Um SOAP zu beherrschen, ist es in jedem Fall von grundlegender Bedeutung, die Rolle von WSDL zu verstehen.

2. SOAP-Paketstrukturanalyse

SOAP-Nachricht wird als SOAP-Envelope bezeichnet, einschließlich SOAP-Header und SOAP-Body. Darunter kann der SOAP-Header problemlos verschiedene andere Nachrichten einfügen, um die Funktionen des Webdienstes zu erweitern, z. B. Sicherheit (Verwendung von Zertifikaten für den Zugriff auf den Webdienst), und der SOAP-Körper ist der spezifische Nachrichtentext, der die Informationen nach Marshall darstellt.

Beim Aufruf von SOAP wird eine HTTP-Post-Nachricht an eine URL (z. B. http://api.google.com/search/beta2) gesendet (gemäß der SOAP-Spezifikation kann auch eine HTTP-Get-Nachricht unterstützt werden). ), wird der Name der aufrufenden Methode in der HTTP-Request-Header-SOAP-Aktion angegeben und der nächste Schritt ist der SOAP-Envelope. Der Server empfängt die Anfrage, führt die Berechnung durch, transformiert das zurückgegebene Ergebnis in XML und sendet es über HTTP an den Client zurück.

3. Einfaches SOAP-Beispiel

Für die SOAP-Entwicklung stehen im Allgemeinen drei Möglichkeiten zur Auswahl:

1), PEARs eigene SOAP-Erweiterung;
2), PHP eigene SOAP-Erweiterung;
3), NuSOAP (reines PHP).

PHP 5 fügt integrierte SOAP-Erweiterungen hinzu, die als Teil von PHP bereitgestellt werden, sodass keine separaten Pakete heruntergeladen, installiert und verwaltet werden müssen. Dies ist die erste SOAP-Implementierung, die in C statt in PHP für PHP geschrieben wurde, daher behauptet der Autor, sie sei deutlich schneller. Die entsprechende Dokumentation ist im Abschnitt „Funktionsreferenz“ des PHP-Handbuchs (php_soap.dll) enthalten.

Ein Beispiel für einen Client, der auf .NET WEB-Dienste zugreift:

< ? php
$objSoapClient = new SoapClient("http://www.webservicemart.com/uszip.asmx?WSDL");
$param = array("ZipCode"=>&#39;12209&#39;);
$out = $objSoapClient->ValidateZip($param);
$data = $out->ValidateZipResult;
echo $data;
?>

4. Beispiele

1) Verwenden Sie PHP, um eine SOAP zu erstellen service

Soap_server.php erstellen (virtueller Pfad ist: http://localhost/php/soap/soap_server.php)

< ? php
/**
* A simple math utility class
*/
class math{
  /**
  * Add two integers together
  *
  * @param integer $a The first integer of the addition
  * @param integer $b The second integer of the addition
  * @return integer The sum of the provided integers
  */
  public function add($a, $b){
    return $a + $b;
  }
  /**
  * Subtract two integers from each other
  *
  * @param integer $a The first integer of the subtraction
  * @param integer $b The second integer of the subtraction
  * @return integer The difference of the provided integers
  */
  public function sub($a, $b){
    return $a - $b;
  }
  /**
  * Div two integers from each other
  *
  * @param integer $a The first integer of the subtraction
  * @param integer $b The second integer of the subtraction
  * @return double The difference of the provided integers
  */
  public function div($a, $b){
    if($b == 0){
      throw new SoapFault(-1, "Cannot divide by zero!");
    }
    return $a / $b;
  }
}
$server = new SoapServer(&#39;math.wsdl&#39;, array(&#39;soap_version&#39;=>SOAP_1_2));
$server->setClass("math");
$server->handle();
?>

Hinweis:

a) Der Mathematikunterricht ist ein Webservice, der bald veröffentlicht wird.
b), $server->setClass, nicht $server->addClass.
2) Verwenden Sie den PHP-Client, um auf den neu erstellten SOAP-Dienst zuzugreifen

< ? php
// $client = new SoapClient(&#39;http://localhost/php/soap/math.wsdl&#39;);
$client = new SoapClient("http://localhost/php/soap/soap_server.php?WSDL");
try{
  $result = $client->div(8, 2); // will cause a Soap Fault if divide by zero
  print "The answer is: $result";
}catch(SoapFault $e){
  print "Sorry an error was caught executing your request: {$e->getMessage()}";
}
?>

Im Wesentlichen ist http://localhost/php/soap/soap_server.php?WSDL Zugriff auf den WSDL-Beschreibungsdatei, auf die in der Kommentarzeile verwiesen wird, daher muss diese WSDL-Datei im Voraus generiert werden. Für andere Sprachen wie Java kann es dynamisch generiert werden. Für die mit PHP gelieferte SOAP-Erweiterung muss diese WSDL-Datei vorab generiert werden.

Sie können ZendStudio verwenden, um statische WSDL-Dateien zu generieren. Zu diesem Zeitpunkt wird das PHPdoc der Mathematikklasse als Metadaten zum Generieren von WSDL verwendet. Wenn Sie ZendStudio zum Generieren von WSDL-Dateien verwenden, muss die Webdienst-Zieladresse korrekt angegeben werden. Das Snippet lautet wie folgt:

...
  <service name="mathService">
    <port binding="typens:mathBinding" name="mathPort">
      <soap:address location="http://localhost/php/soap/soap_server.php"></soap:address>
    </port>
  </service>
...

   

注:调用PHP Webserver的方法必须传入命名参数。

更多PHP使用SOAP扩展实现WebService的方法相关文章请关注PHP中文网!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn