|
|
| Line 1: |
Line 1: |
| Сервер Multi Theft Auto предоставляет веб-интерфейс, который может различными способами использоваться ресурсами. Цель данной статьи - объяснить, что это за способы и как их можно использовать.
| |
|
| |
|
| ==Обзор==
| |
| У данной системы две ключевые составные части. Первая - стандартный веб-сервер, разрешающий веб-браузерам запрашивать страницы и файлы, которые входят в ресурсы. Вторая - система, разрешающая браузерам вызывать функции, которые вы экспортировали из своих ресурсов.
| |
|
| |
| ==Страницы==
| |
| ===Указание файла в meta===
| |
| В meta-файле вашего ресурса вы можете указать доступность определенных файлов через веб-браузер. Чтобы это сделать, добавьте строку:
| |
| <syntaxhighlight lang="lua" lang="xml">
| |
| <html src="имяфайла.расширение" />
| |
| </syntaxhighlight>
| |
| Затем вы сможете получить доступ к этому файлу через веб-браузер по адресу: http://адрес:порт/имяресурса/имяфайла.расширение<br/>
| |
| Например, на локальном сервере, использующем http-порт по умолчанию с запущенным webmap это: http://127.0.0.1:22005/webmap/map.htm
| |
|
| |
|
| |
| ===Бинарные файлы===
| |
| Несмотря на обманчивое название, файлы, указанные с использованием узла html, могут быть любого типа. Если они являются бинарными (двоичными) файлами (типа картинок, zip-архивов), вам понадобится указать это в meta-файле, добавив ''raw="true"'' к узлу (строке с) ''html''. Это значит, что файлы не будут предварительно обрабатываться перед отправкой веб-браузеру.
| |
|
| |
| Например:
| |
| <syntaxhighlight lang="lua" lang="xml">
| |
| <html src="image.gif" raw="true" />
| |
| </syntaxhighlight>
| |
|
| |
| ===Анализируемые файлы===
| |
| Если файл не имеет в meta-файле пометки "raw", тогда перед тем, как быть возвращенным клиенту, он проходит через процессор предварительной обработки. Этот препроцессор в целом работает как в PHP или ASP, но использует LUA. Вы можете встраивать стандартные MTA-скрипты вовнутрь HTML-страниц, имея контроль над выводом. Работают почти все стандартные функции MTA, плюс к ним добавляются еще некоторые специальные [[Template:HTTP functions|HTTP функции]], такие как [[httpWrite]] - функция, выводящая текст в буфер.
| |
|
| |
| Например:
| |
| <syntaxhighlight lang="lua" lang="html">
| |
| <html>
| |
| <body>
| |
| Этот ресурс называется <* httpWrite( getResourceName(getThisResource()) ) *>
| |
| </body>
| |
| <html>
| |
| </syntaxhighlight>
| |
|
| |
| Имеется краткая альтернатива (совместно с PHP и ASP) этого кода, а это значит, что код выше можно также записать как:
| |
|
| |
| <syntaxhighlight lang="lua" lang="html">
| |
| <html>
| |
| <body>
| |
| Этот ресурс называется <* = getResourceName(getThisResource()) *>
| |
| </body>
| |
| <html>
| |
| </syntaxhighlight>
| |
|
| |
| Отдельно от HTTP функций, встроенный Lua имеет доступ к следующим переменным среды, содержащим информацию про то, как была запрошена страница:
| |
| * table '''requestHeaders''': Эта таблица содержит все заголовки, которые были запрошены со страницей. Вы можете установить возвращаемые заголовки через использование [[httpSetResponseHeader]].
| |
| * table '''form''': Эта таблица содержит все данные формы, переданные странице с использованием HTTP POST совмщенно с любыми переменными, переданными в строке запроса с HTTP GET.
| |
| * table '''cookies''': Это таблица со всеми cookies. Вы можете редактировать cookies с использованием [[httpSetResponseCookie]].
| |
| * string '''hostname''': Это строка, содержащая IP адрес или имя хоста, запросившего страницу.
| |
| * string '''url''': Это URL страницы.
| |
| * account '''user''': Это аккаунт текущего пользователя.
| |
|
| |
| Важно заметить, что анализируемые файлы запущены в отдельной от остального кода вашего ресурса виртуальной машине. Следовательно, если вы хотите вызвать функцию из основного кода вашего ресурса, вам понадобится ее экспортировать и воспользоваться функцией [[call]] из анализируемого файла.
| |
|
| |
| ==Вызовы==
| |
| Вы можете указать, чтобы определенные экспортированные функции вашего ресурса могли быть вызваны через HTTP-интерфейс. Все SDK (указанные ниже) позволяют вам вызывать эти функции удаленно.
| |
|
| |
| Для указания экспортированной функции, доступной по http, добавьте в файл meta.xml следующее:
| |
| <syntaxhighlight lang="lua" lang="xml">
| |
| <export function='functionName' http='true' />
| |
| </syntaxhighlight>
| |
|
| |
| Вы можете писать свою функцию как и любую другую обычную, возвращать сколько вам угодно много значений, включия таблицы, ресурсы и, что более важно, элементы. Тем не менее вы ''не можете'' возвращать другие значения 'userdata' типа [[xmlnode|xmlnodes]] или функций.
| |
|
| |
| ===Протокол===
| |
| {{note_box|Вам не нужно этого знать за исключением случаев, если вы пишете свой собственный код HTTP-запроса. Можно просто воспользоваться одним из [[#SDK|SDK, указанных ниже]].}}
| |
|
| |
| Вызовы выполняются через запрос ''<nowiki>http://<ваш IP>:<ваш порт>/<имя_ресурса>/call/<имя_экспортированной_функции></nowiki>'' с использованием HTTP POST. Тело запроса должно быть JSON массивом из аргументов для функции.
| |
|
| |
| Запрос возвратит JSON-массив значений, возвращенных функцией как HTTP-ответ.
| |
|
| |
| Сервер поддерживает HTTP Basic идентификацию, вы можете конфигурировать доступ через ACL и встроенную систему аккаунтов.
| |
|
| |
| ===Вызовы из HTTP веб-интерфейса===
| |
| Вызовы, вероятно, наиболее легки из веб-интерфейса и могут выполняться практически без усилий.
| |
|
| |
| Во-первых, добавьте в файл meta.xml следующее:
| |
| <syntaxhighlight lang="lua" lang="xml">
| |
| <include resource="ajax" />
| |
| </syntaxhighlight>
| |
|
| |
| Во-вторых, в секцию <head> страницы, из который вы хотите производить вызов, добавьте следующее:
| |
| <syntaxhighlight lang="lua" lang="lua">
| |
| <* = exports.ajax:start(getResourceName(getThisResource())) *>
| |
| </syntaxhighlight>
| |
|
| |
| Наконец, вы можете создать на своей странице javascript-блок и вызывать свои функции практически так же, как если бы они были локальными. Единственное различие в том, что вызовы асинхронны - вам следует указывать callback-функцию последним аргументом для своего вызова. Она будет использоваться для возврата каких-либо значений основной функцией.
| |
|
| |
| Вот простой пример.
| |
|
| |
| '''meta.xml'''
| |
| <syntaxhighlight lang="lua" lang="xml">
| |
| <meta>
| |
| <include resource="ajax" />
| |
| <script src='code.lua' />
| |
| <html src='page.htm' default='true' />
| |
| <export function='showChatMessage' http='true' />
| |
| </meta>
| |
| </syntaxhighlight>
| |
|
| |
| '''code.lua'''
| |
| <syntaxhighlight lang="lua" lang="lua">
| |
| function showChatMessage ( message )
| |
| outputChatBox ( message )
| |
| return 5;
| |
| end
| |
| </syntaxhighlight>
| |
|
| |
| '''page.htm'''
| |
| <syntaxhighlight lang="lua" lang="html">
| |
| <html>
| |
| <head>
| |
| <* = exports.ajax:start(getResourceName(getThisResource())) *>
| |
| <script type='text/javascript'>
| |
| function say() {
| |
| var message = document.getElementById('message')
| |
| showChatMessage ( message.value,
| |
| function ( number ) {
| |
| // функция была вызвана и что-то вернула
| |
| message.value = "Функция вернула " + number;
| |
| }
| |
| );
| |
| }
| |
| </script>
| |
| </head>
| |
| <body>
| |
| <input type='text' id='message' /><input type='button' value='say' onclick='say();' />
| |
| </body>
| |
| </html>
| |
| </syntaxhighlight>
| |
|
| |
| Вы можете видеть (довольно сложные) образцы того, как это можно сделать, в ресурсах ''resourcebrowser'', ''resourcemanager'' и ''webadmin''.
| |
|
| |
| ==Обезопашивание веб-интерфейса==
| |
| [[ACL]] предоставляет некоторое количество прав, которые могут влиять на то, какие файлы смогут быть доступны.
| |
| * general.http: Если выключен, никакие из http файлов не будут доступны (за исключением игровых клиентов)
| |
| * resource.'''ResourceName''': Если выключен, никакие из файлов ресурса не будут доступны
| |
| * resource.'''ResourceName'''.file.'''FileName''': Если выключен, файл с данным названием не будет доступен
| |
| * resource.'''ResourceName'''.function.'''FunctionName''': Если выключен, функцию невозможно будет вызвать
| |
| Они работают как и другие ACL права - вы можете их отключить для обычных пользователей и просто включить для группы Admin, или любой другой, которой вы пожелаете.
| |
|
| |
| ==SDK==
| |
| Доступно некоторое количество так называемых 'SDK', которые позволяют вам сообщаться с сервером через другие языки программирования. С их помощью вы (теоретически) можете писать целые игровые режимы. На практике, возможно, не очень хорошая идея, но это тем не менее является очень полезным для статистики и администрирования. PHP SDK - наиболее развитая версия. Не стесняйтесь модифицировать или создавать собственные SDK - если решитесь, пожалуйста, пришлите нам копию.
| |
|
| |
| * [[Java SDK]]
| |
| * [[Javascript SDK]]
| |
| * [[Perl SDK]]
| |
| * [[PHP SDK]]
| |
| * [[CSharp SDK|C# SDK]]
| |
|
| |
| ==Также смотрите==
| |
| [[callRemote]] - Позволяет игровым серверам вызывать функции на PHP-страницах (с PHP SDK) и других игровых серверах.
| |
| [[Category:Понятия скриптинга]]
| |
| [[en:Resource Web Access]]
| |