Technologieaustausch

Interaktion mit TrinityCore über SOAP (TBD)

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Original:SOAP mit TrinityCore | TrinityCore MMo-Projekt-Wiki

 

So interagieren Sie mit TC mithilfe von SOAP

SOAP steht für Simple Object Access Protocol und ist eine ältere Form eines auf Standards basierenden Webservices-Zugriffsprotokolls, das REST ähnelt. Solange die erforderliche Konfiguration vorhanden ist, können Sie SOAP nutzen, um Befehle an den TrinityCore-Server zu senden.
Eine gute Möglichkeit, SOAP zu verstehen, besteht darin, es mit zeitgenössischem REST zu vergleichen. Der folgende Artikel erklärt dies sehr gut – https://smartbear.com/blog/soap-vs-rest-whats-the-difference/.
Der Hauptunterschied zwischen den beiden besteht darin, dass SOAP vollständig auf XML basiert, um Antworten bereitzustellen und Nutzlasten zu akzeptieren. PHP bietet einige Methoden, um diesen Prozess zu vereinfachen. Abhängig von Ihrem Anwendungsfall müssen Sie jedoch möglicherweise mit XML vertraut sein.

Aufbau


worldserver.conf
Stellen Sie sicher, dass die Einstellungen in der Konfigurationsdatei richtig eingestellt sind.

  1. # SOAP.Enable
  2. # Description: Enable soap service.
  3. # Default: 0 - (Disabled)
  4. # 1 - (Enabled)
  5. SOAP.Enabled = 1
  6. # SOAP.IP
  7. # Description: Bind SOAP service to IP/hostname.
  8. # Default: "127.0.0.1" - (Bind to localhost)
  9. SOAP.IP = "127.0.0.1"
  10. # SOAP.Port
  11. # Description: TCP port to reach the SOAP service.
  12. # Default: 7878
  13. SOAP.Port = 7878

Aufgrund Ihrer spezifischen RBAC-Zugriffskonfiguration benötigen Sie außerdem ein Benutzerkonto mit Berechtigungen zur Verwendung von GM-Befehlen. Es könnte eine gute Idee sein, speziell für diesen Zweck ein Konto mit eingeschränktem Zugriff zu erstellen, anstatt eines, das nur von einer Person verwendet wird.

HINWEIS: Zum Zeitpunkt des Verfassens dieses Artikels unterstützt TC 335a nur HTTP. Achten Sie daher darauf, keine Geheimnisse (Passwörter usw.) auf diese Weise zu senden. Es wird davon ausgegangen, dass alles, was weitergegeben wird, im Klartext vorliegt und von jedem gelesen werden kann.
Wenn Sie eine Remote-Verbindung über SOAP planen, sollten Sie unbedingt Maßnahmen ergreifen, um eine sichere Verbindung zu gewährleisten. Ein möglicher Ansatz ist ein Reverse-SSL-Proxy über Apache oder Nginx. Dies liegt jedoch außerhalb des Rahmens dieses Leitfadens und wird nicht berücksichtigt.

HTTP-Client für Prototyping


Um schnell eine Verbindung aufzubauen und Konsolenbefehle zu testen, gibt es Clients:
Postbote: https://www.postman.com/ (Netzwerk, Desktop-Agent/Client)
Schlaflosigkeit: https://insomnia.rest/
Nachtigall Nachtigall: https://nightingale.rest/
Sie alle bieten eine Vielfalt an Details, funktionieren aber letztendlich in etwa gleich. Vielen Dank an Jackpoz für die Bereitstellung der spezifischen Schritte für Postman – https://www.postman.com/.
Postman gibt es in zwei Varianten: als Webschnittstelle (sowie als Proxy, der installiert werden kann, um Localhost-Anfragen auszuführen) und als vollständige Client-Desktopanwendung. Die Anweisungen sind in beiden Fällen gleich.
Suchen Sie unter „Mein Arbeitsbereich“ die Schaltfläche „Importieren“. Sie verwenden die Originaltextoption.
Kopieren Sie den folgenden JSON-Code und fügen Sie ihn in das Textfeld ein. Bitte stellen Sie sicher, dass Sie die Anmeldeinformationen unter item.request.auth.basic auf den zuvor genannten GM-Benutzer aktualisieren.

  1. {
  2. "info": {
  3. "name": "TC SOAP",
  4. "schema": "https://schema.getpostman.com/json/collection/v2.0.0/collection.json"
  5. },
  6. "item": [
  7. {
  8. "name": "server info",
  9. "request": {
  10. "auth": {
  11. "type": "basic",
  12. "basic": {
  13. "username": "CHANGEME",
  14. "password": "CHANGEME",
  15. "showPassword": false
  16. }
  17. },
  18. "method": "POST",
  19. "header": [],
  20. "body": {
  21. "mode": "raw",
  22. "raw": "<?xml version="1.0" encoding="utf-8"?>rn<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:TC">rn<SOAP-ENV:Body>rn<ns1:executeCommand>rn<command>server info</command>rn</ns1:executeCommand>rn</SOAP-ENV:Body>rn</SOAP-ENV:Envelope>",
  23. "options": {
  24. "raw": {
  25. "language": "xml"
  26. }
  27. }
  28. },
  29. "url": "http://127.0.0.1:7878"
  30. },
  31. "response": []
  32. }
  33. ]
  34. }

Sie sollten sich TC SOAP als eine zu importierende Sammlung vorstellen. Klicken Sie auf Importieren.
Dadurch wird die neue Sammlung mit der richtigen HTTP-Methode (POST) und den Details auf den Registerkarten „Autorisierung“ und „Text“ gefüllt.
Beachten Sie auf der Registerkarte „Body“ die XML-Nutzlast- und Serverinformationsbefehle, die für Sie vorab ausgefüllt sind.
Durch Klicken auf die Schaltfläche „Senden“ wird die Anfrage gesendet und eine XML-Antwort bereitgestellt.
Auf der rechten Seite der Postman-Benutzeroberfläche befindet sich a</> Das Symbol öffnet ein Code-Snippet, das die Anfrage in die Sprache Ihrer Wahl umwandeln kann.
¶Mit PHP
Um mit TrinityCore über PHP zu interagieren, müssen Sie sicherstellen, dass die PHP-Soap-Erweiterung installiert ist. Stellen Sie außerdem sicher, dass Sie eine PHP-Version verwenden, die noch aktiv unterstützt wird. Codebeispiele wurden auf PHP7.4 bis PHP8.1 getestet.
In all diesen Beispielen ist der URI urn:TC ein erforderlicher Parameter, da wir kein WSDL-Dokument bereitgestellt haben.
SoapClient-https://www.php.net/manual/en/class.soapclient.php

  1. $command = 'server info';
  2. $opts = [
  3. 'http' => [
  4. 'header' => "Authorization: Basic " . base64_encode("USERNAME:PASSWORD")
  5. ]];
  6. $client = new SoapClient($wsdl = null, [
  7. 'stream_context' => stream_context_create($opts),
  8. 'location' => 'http://127.0.0.1:7878',
  9. 'uri' => 'urn:TC',
  10. ]);
  11. try {
  12. $result = $client->executeCommand(new SoapParam($command, 'command'));
  13. } catch (Exception $e) {
  14. die($e->getMessage());
  15. }
  16. echo $result;

Beachten Sie, dass wir einen HTTP-Basisautorisierungsheader mit base64-kodiertem Benutzernamen und Passwort (getrennt durch einen Doppelpunkt) übergeben. Alternativ können Sie denstream_contextParameter und fügen Sie stattdessen einen (Anmelde-)Benutzernamen und ein Passwort in Ihre SoapClient-Konfiguration ein.

  1. $command = 'server info';
  2. $client = new SoapClient($wsdl = null, [
  3. 'location' => 'http://127.0.0.1:7878',
  4. 'uri' => 'urn:TC',
  5. 'login' => 'USERNAME',
  6. 'password' => 'PASSWORD',
  7. ]);
  8. try {
  9. $result = $client->executeCommand(new SoapParam($command, 'command'));
  10. } catch (Exception $e) {
  11. die($e->getMessage());
  12. }
  13. echo $result;

Beide Ansätze sind in Ordnung - aber lassen Sie sich nicht täuschen! Die Base64-Kodierung macht es nicht automatisch sicherer.

Bedenken Sie, dass der SOAP-Client nur Verbindungsfehler oder Fehlkonfigurationen erkennen kann.Es wird nicht erkannt, wenn Sie einen ungültigen Befehl eingegeben haben.. Es liegt also an Ihnen, die Ergebnisse zu analysieren und zu entscheiden, ob das gewünschte Ergebnis erfolgreich war oder nicht. Die Ausgabe erfolgt so, als hätten Sie den Befehl auf der Konsole ausgeführt.

Wenn Sie sich nicht auf die SOAP-Erweiterung oder den SOAP-Client verlassen möchten, können Sie die XML-Nutzlast selbst erstellen und die resultierende XML-Antwort selbst analysieren. Sie benötigen weiterhin diecURL-Erweiterung, aber dies ist normalerweise verfügbar, wenn es nicht standardmäßig aktiviert ist.

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <SOAP-ENV:Envelope
  3. xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
  4. xmlns:ns1="urn:TC">
  5. <SOAP-ENV:Body>
  6. <ns1:executeCommand>
  7. <command>server info</command>
  8. </ns1:executeCommand>
  9. </SOAP-ENV:Body>
  10. </SOAP-ENV:Envelope>
  1. $curl = curl_init();
  2. curl_setopt_array($curl, [
  3. CURLOPT_POSTFIELDS => $payload, // $payload is the XML provided above
  4. CURLOPT_URL => 'http://127.0.0.1:7878',
  5. CURLOPT_TIMEOUT => 0,
  6. CURLOPT_CUSTOMREQUEST => 'POST',
  7. CURLOPT_HTTPHEADER => [
  8. "Authorization: Basic " . base64_encode("{$user}:{$pass}"),
  9. 'Content-Type: application/xml',
  10. ],
  11. ]);
  12. $response = curl_exec($curl);
  13. curl_close($curl);
  14. echo $response;