In computing, a post request is used when the client needs to send data to the server as part of the retrieval request, such as when uploading a file or submitting a completed form, and the same is true of this function in GameMaker Studio 2. In contrast to the http_get request method where only a URL is sent to the server, http_post_string() also includes a string that is sent to the server and may result in the creation of a new resource or the update of an existing resource or both. It should be noted that HTTP request parameters (the bits sometimes "tacked on" to the end of a URL when you submit a form on a web page) are perfectly acceptable when using this function too.
This event will generate a "call back" which is picked up by any HTTP Events, in which case it will generate a ds_map (more commonly known as a "dictionary") that is exclusive to this event and is stored in the special variable async_load. This ds_map will contain different values depending on whether there is data being returned or not. For example, if you have requested a file, the event will trigger multiple times as each packet of data is received so that you can show a progress bar, for example. The general structure for the ds_map will be as follows:
- id: The ID which was returned from the command. If you fire off a series of http_ requests then you need to know which one you are getting the reply to, and so you would use this value to compare to the value you stored when you originally sent the request to find the right one.
- status: Returns a value of less than 0 for an error, 0 for complete and 1 for receiving packets (see below for more details).
- result: The data received (string only).
- url: The complete URL you requested.
- http_status: The raw http status code (if available). This returns the standard web status code for most browsers, eg: 304 for "Not Modified" or 204 for "No Content", etc...
If there are multiple packets being returned to your game, the callback "status" key will return 1, in which case the ds_map will have the following additional keys:
- "contentLength": This is the size of file that the web server has said you should expect to receive (may be -1 if the server does not return this data).
- "sizeDownloaded": The size of the data that has already been downloaded.NOTE: You should be aware that due to XSS protection in browsers, requests to and attempts to load resources from across domains are blocked and may appear to return blank results. Please see the section on Cross Domain Issues for further details.
Argument Description url The web address of the server that you wish to get information from string The string you wish to send to the specified URL
The http_post_string function can be called from any event, and since it is asynchronous the callback can be almost instantaneous or could take several seconds. Calling the function is simple and would look something like this:
var str = "name=" + global.player_name +
"&score=" + string(global.player_score);
post = http_post_string("http://www.angusgames.com/game?game_id=" + string(global.game_id), str);
The above code sends a retrieval request to the specified URL with the given parameters as well as sending the additional data (player name and score in URL-encoded form) stored in the variable str. This will trigger all defined asynchronous Http Events if a callback is received, and you can check the "id" returned against that stored in the variable post to make sure that you run the correct code should you have used various http_post_string() functions. The following example code shows how this would be done:
var r_str = "null";
if ds_map_find_value(async_load, "id") == post
if ds_map_find_value(async_load, "status") == 0
r_str = ds_map_find_value(async_load, "result");
The above code will first check the id of the ds_map that has been created, then check the status of the callback. If the value is equal to 0 (signalling success) the result from the callback will then be stored in a variable for future use, otherwise the variable will simply hold a default value (in this case "null").