Compartir tecnología

Interactuar con TrinityCore usando SOAP (TBD)

2024-07-12

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

original:SOAP con TrinityCore | Wiki del proyecto TrinityCore MMo

 

Cómo interactuar con TC usando SOAP

SOAP significa Protocolo simple de acceso a objetos y es una forma más antigua de protocolo de acceso a servicios web basado en estándares similar a REST. Siempre que exista la configuración necesaria, puede aprovechar SOAP para enviar comandos al servidor TrinityCore.
Una buena forma de entender SOAP es compararlo con REST contemporáneo. El siguiente artículo explica esto muy bien: https://smartbear.com/blog/soap-vs-rest-whats-the-difference/.
La principal diferencia entre los dos es que SOAP se basa completamente en XML para proporcionar respuestas y aceptar cargas útiles. PHP proporciona algunos métodos para facilitar este proceso, pero dependiendo de su caso de uso, es posible que necesite estar familiarizado con XML.

Configuración


servidormundial.conf
Asegúrese de que la configuración en el archivo de configuración esté configurada correctamente.

  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

Dada su configuración de acceso RBAC específica, también necesitará una cuenta de usuario con permisos para usar comandos GM. Podría ser una buena idea crear una cuenta de acceso limitado específicamente para este propósito, en lugar de una que sea utilizada por una sola persona.

NOTA: Al momento de escribir este artículo, TC 335a solo admite HTTP, así que tenga cuidado de no enviar secretos (contraseñas, etc.) de esta manera. Se supone que todo lo que se transmite está en texto claro y cualquiera puede leerlo.
Si planea conectarse de forma remota a través de SOAP, definitivamente debe tomar medidas para garantizar una conexión segura. Un posible enfoque es a través de un proxy SSL inverso a través de Apache o nginx. Sin embargo, esto está fuera del alcance de esta guía y no se incluirá.

Cliente HTTP para creación de prototipos


Hay clientes para establecer rápidamente una conexión y probar los comandos de la consola:
cartero: https://www.postman.com/ (red, agente de escritorio/cliente)
Insomnio: https://insomnia.rest/
Ruiseñor ruiseñor: https://nightingale.rest/
Todos ofrecen una variedad de detalles, pero en última instancia funcionan más o menos igual. Gracias a Jackpoz por proporcionar los pasos específicos para Postman: https://www.postman.com/.
Postman viene en dos versiones: una interfaz web (así como un proxy que se puede instalar para realizar solicitudes de host local) y una aplicación de escritorio de cliente completa. Las instrucciones son las mismas en ambos casos.
En "Mi espacio de trabajo", busque el botón "Importar". Utilizarás la opción de texto original.
Copie y pegue el siguiente JSON en el cuadro de texto. Asegúrese de actualizar las credenciales en item.request.auth.basic para el usuario GM mencionado anteriormente.

  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. }

Deberías pensar en TC SOAP como una colección para importar. Haga clic en Importar.
Esto completará la nueva colección con el método HTTP correcto (POST) y los detalles en las pestañas Autorización y Cuerpo.
En la pestaña Cuerpo, observe los comandos XML de carga útil e información del servidor que ya están completos para usted.
Al hacer clic en el botón "Enviar", se enviará la solicitud y se proporcionará una respuesta XML.
En el lado derecho de la interfaz de Postman, un</> El símbolo abrirá un fragmento de código que puede convertir la solicitud al idioma que elija.
¶Usando PHP
Para interactuar con TrinityCore usando PHP, debe asegurarse de tener instalada la extensión PHP-soap. También asegúrese de estar utilizando una versión de PHP que todavía sea compatible activamente. Los ejemplos de código se probaron en PHP7.4 a PHP8.1.
En todos estos ejemplos, el URI urn:TC es un parámetro obligatorio porque no proporcionamos un documento WSDL.
SoapClient-https://www.php.net/manual/es/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;

Tenga en cuenta que estamos pasando un encabezado de autorización básica HTTP con nombre de usuario y contraseña codificados en base64 (separados por dos puntos). Alternativamente, puede omitir el encabezado de autorización básica HTTP.stream_contextparámetro y, en su lugar, incluya un nombre de usuario y una contraseña (de inicio de sesión) en su configuración de SoapClient.

  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;

Cualquiera de los dos enfoques es válido, pero no se deje engañar. La codificación Base 64 no la hace inherentemente más segura.

Recuerde que el cliente SOAP sólo puede reconocer fallos de conexión o configuraciones incorrectas.No sabrá si has proporcionado un comando no válido.Depende de usted analizar los resultados y decidir si el resultado esperado fue un éxito o no. El resultado será igual que si hubiera ejecutado el comando en la consola.

Por último, si prefiere no depender de la extensión o el cliente SOAP, puede formar la carga XML y analizar la respuesta XML resultante usted mismo. Aún necesitará elExtensión cURL, pero normalmente está disponible si no está habilitado de forma predeterminada.

  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;