Обмен технологиями

Взаимодействие с TrinityCore с использованием SOAP (TBD)

2024-07-12

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

оригинал:SOAP с TrinityCore | TrinityCore MMo Project Wiki

 

Как взаимодействовать с TC с помощью SOAP

SOAP расшифровывается как Simple Object Access Protocol и является более старой формой стандартизированного протокола доступа к веб-службам, аналогичного REST. Если необходимая конфигурация имеется, вы можете использовать SOAP для отправки команд на сервер TrinityCore.
Хороший способ понять SOAP — сравнить его с современным REST. Следующая статья очень хорошо объясняет это – https://smartbear.com/blog/soap-vs-rest-whats-the-difference/.
Основное различие между ними заключается в том, что SOAP полностью полагается на XML для предоставления ответов и приема полезных данных. PHP предоставляет некоторые методы, упрощающие этот процесс, но в зависимости от вашего варианта использования вам может потребоваться знание XML.

Конфигурация


worldserver.conf
Убедитесь, что настройки в файле конфигурации установлены правильно.

  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

Учитывая вашу конкретную конфигурацию доступа RBAC, вам также потребуется учетная запись пользователя с разрешениями на использование команд GM. Возможно, было бы хорошей идеей создать учетную запись с ограниченным доступом специально для этой цели, а не ту, которая используется одним человеком.

ПРИМЕЧАНИЕ. На момент написания TC 335a поддерживает только HTTP, поэтому будьте осторожны и не отправляйте секреты (пароли и т. д.) таким способом. Предполагается, что все передаваемое передается в виде открытого текста и может быть прочитано кем угодно.
Если вы планируете подключаться удаленно через SOAP, вам обязательно следует принять меры для обеспечения безопасного соединения. Один из возможных подходов — использование обратного прокси-сервера SSL через Apache или Nginx. Однако это выходит за рамки настоящего руководства и не будет включено.

HTTP-клиент для прототипирования


Есть клиенты для быстрого установления соединения и проверки консольных команд:
почтальон: https://www.postman.com/ (сеть, настольный агент/клиент)
бессонница:https://insomnia.rest/
Соловей-соловей: https://nightingale.rest/
Все они предлагают множество деталей, но в конечном итоге работают примерно одинаково. Спасибо Jackpoz за конкретные действия для Postman — https://www.postman.com/.
Postman поставляется в двух вариантах: веб-интерфейс (а также прокси-сервер, который можно установить для выполнения запросов локального хоста) и полноценное клиентское настольное приложение. Инструкция в обоих случаях одинакова.
В разделе «Моя рабочая область» найдите кнопку «Импорт». Вы будете использовать исходный текстовый вариант.
Скопируйте и вставьте следующий JSON в текстовое поле. Обязательно обновите учетные данные в item.request.auth.basic для пользователя GM, упомянутого ранее.

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

Вы должны думать о TC SOAP как о коллекции для импорта. Нажмите «Импортировать».
В результате в новую коллекцию будет добавлен правильный метод HTTP (POST) и сведения на вкладках «Авторизация» и «Тело».
На вкладке «Тело» обратите внимание на команды полезной нагрузки XML и информации о сервере, которые предварительно заполнены.
Нажатие кнопки «Отправить» отправит запрос и предоставит ответ в формате XML.
В правой части интерфейса Postman есть</> Символ откроет фрагмент кода, который может преобразовать запрос на выбранный вами язык.
¶Использование PHP
Чтобы взаимодействовать с TrinityCore с помощью PHP, вам необходимо убедиться, что у вас установлено расширение PHP-soap. Также убедитесь, что вы используете версию PHP, которая все еще активно поддерживается. Примеры кода были протестированы на PHP7.4–PHP8.1.
Во всех этих примерах URI urn:TC является обязательным параметром, поскольку мы не предоставили документ WSDL.
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;

Обратите внимание, что мы передаем заголовок HTTP basic authorization с именем пользователя и паролем в кодировке base64 (разделенными двоеточием). В качестве альтернативы вы можете пропуститьstream_contextи вместо этого включите имя пользователя (для входа) и пароль в конфигурацию 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;

Оба подхода хороши, но не обманывайтесь! Кодировка Base 64 сама по себе не делает ее более безопасной.

Помните, что клиент SOAP может распознавать только сбои подключения или неправильные настройки.Он не будет знать, если вы предоставили недействительную команду.. Так что вам решать, проанализировать результаты и решить, был ли ожидаемый результат успешным или нет. Вывод будет таким же, как если бы вы выполнили команду на консоли.

Наконец, если вы не хотите полагаться на расширение или клиент SOAP, вы можете сформировать полезную нагрузку XML и разобрать полученный ответ XML самостоятельно. Вам все равно понадобитсярасширение cURL, но обычно он доступен, если не включен по умолчанию.

  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;