HU/Resource Web Access: Difference between revisions
Line 32: | Line 32: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Itt egy rövidítés (gyakori a PHP-ban és az ASP-ben), azaz, a fenti kódot is írhajta így: | |||
<syntaxhighlight lang="html4strict"> | <syntaxhighlight lang="html4strict"> |
Revision as of 14:20, 4 November 2018
A Multi Theft Auto Server egy olyan webes felületet biztosít, melyet a resource-ok sokféle módon tudnak használni. Ennek a dokumentumnak az a célja, hogy elmagyarázza mik ezek a módszerek, és hogy hogyan kell őket használni.
Összefoglalás
Két fontos rész alkotja ezt a rendszert. Az első az egy szabványos webszerver, amely lehetővé teszi a webböngészők számára, hogy oldalakat, és fájlokat kérjenek a resource-ból. A második egy olyan rendszer, amely lehetővé teszi a webböngészők számára, hogy a resource-ból exportált function-öket meghívja.
Oldalak
A fájl megadása a meta-ban
Megadhatja a resource meta fájljában, hogy bizonyos fájlok hozzáférhetőek legyenek a webszerveren keresztül. Ehhez adja hozzá ezt a sort:
<html src="filename.ext" />
Ezt követően elérheti ezt a fájlt a webböngészőn keresztül: http://host:port/resourcename/filename.ext
Például, egy helyileg futattott szerveren az alapéretelmezett http port-ot használja a webmap indításakor: http://127.0.0.1:22005/webmap/map.htm
Bináris fájlok
A félrevezető név ellenére a html segítségével megadott fájlok bármilyen típusúak lehetnek. Ha ezek bináris fájlok (például képek, zip fájlok), akkor meg kell adnia ezt a meta fájlban a raw="true" hozzáadásával a html-hez. Ez azt jelenti, hogy a fájlok nem kerülnek előfeldolgozásra mielőtt a webböngészőnek küldenénk.
Például:
<html src="image.gif" raw="true" />
Parsed files
Ha egy fájlt nem adjuk meg a meta-ban, mint "raw", akkor az végig megy egy előfeldolgozáson mielőtt a klienshez visszatérne. Ez az előfeldolgosás hasonlóképp műkodik, mint a PHP-nál vagy ASP-nél, csak LUA-t használ. A szabványos MTA szkripteket beágyazhatja a HTML oldalakba, ellenőrizve a kimenetet. Szinte az összes szabványos MTA funkciók működnek, plusz néhány speciális HTTP funkciók, mint például httpWrite, ez egy olyan function, amely szöveget küld a pufferbe.
Például:
<html> <body> This resource is called <* httpWrite( getResourceName(getThisResource()) ) *> </body> <html>
Itt egy rövidítés (gyakori a PHP-ban és az ASP-ben), azaz, a fenti kódot is írhajta így:
<html> <body> This resource is called <* = getResourceName(getThisResource()) *> </body> <html>
Aside from HTTP functions, embedded Lua has access to the following environment variables that contain information about how the page was requested:
- table requestHeaders: This is a table containing all the headers that were requested with the page. You can set returned headers using httpSetResponseHeader.
- table form: This is a table containing all the form data submitted to the page using HTTP POST combined with any variables passed in the querystring with HTTP GET.
- table cookies: This is a table of all the cookies. You can modify cookies using httpSetResponseCookie.
- string hostname: This is a string containing the IP address or hostname that requested the page.
- string url: This is the URL of the page.
- account user: This is the account of the current user.
It's important to note that parsed files are run in a separate virtual machine from the rest of your resource's code. As such, if you want to call a function in your resource's main code, you need to export the function and use the call function from your parsed file.
Calls
You can specify that certain exported functions in your resource are able to be called from the HTTP interface. All the SDKs (listed below) allow you to call these functions from a remote location.
To specify an exported http-accessible function, add the following to your meta.xml file:
<export function='functionName' http='true' />
You can code your function just as you would any normal function, returning as many values as you want, including tables and resources and most importantly elements. You cannot however return other 'userdata' values such as xmlnodes or functions.
Protocol
This template is no longer in use as it results in poor readability.
Calls are done by requesting http://<your IP>:<your port>/<resource_name>/call/<exported_function_name> using HTTP POST. The body of the request should be a JSON array of the arguments for the function.
The request will return a JSON array of the value(s) returned from the function as the HTTP response.
The server supports HTTP Basic authentication and you can configure access via the ACL and the built-in accounts system.
Calls from the HTTP web interface
Using calls is probably easiest from the web interface and can be done almost seamlessly.
First, add this to your meta.xml file:
<include resource="ajax" />
Secondly, add the following to the <head> section of the page you want to call from:
<* = exports.ajax:start(getResourceName(getThisResource())) *>
Finally, you can create a javascript block in your page and call your functions almost as if they were local. The only difference is that the calls are aysnchronous - you should specify a callback function as the last argument for your call. This is called when the function returns.
Here's a simple example.
meta.xml
<meta> <include resource="ajax" /> <script src='code.lua' /> <html src='page.htm' default='true' /> <export function='showChatMessage' http='true' /> </meta>
code.lua
function showChatMessage ( message ) outputChatBox ( message ) return 5; end
page.htm
<html> <head> <* = exports.ajax:start(getResourceName(getThisResource())) *> <script type='text/javascript'> function say() { var message = document.getElementById('message') showChatMessage ( message.value, function ( number ) { // the function has been called and returned something message.value = "The function returned " + number; } ); } </script> </head> <body> <input type='text' id='message' /><input type='button' value='say' onclick='say();' /> </body> </html>
You can see (fairly complex) examples of how this can be done in the resources resourcebrowser, resourcemanager and webadmin.
Securing the web interface
The ACL has a number of rights that can affect what files can be accessed.
- resource.ResourceName.http: If enabled, the resource will be accessible from http://server_ip:22005/ResourceName/
This works as with other ACL rights - You can enable it just for Admin users, or any other group of users you wish.
SDK
There are a number of so-called 'SDKs' available that allow you to interface with the server from other programming languages. With these you could (in theory) write whole gamemodes. In practice this is probably a bad idea, but it is useful for statistics and administration. The PHP SDK is the most developed version. Feel free to modify or create your own SDKs - if you do please send us a copy.
See Also
callRemote - Allows game servers to call functions on PHP pages (with the PHP SDK) and on other game servers.