Haciendo solicitudes HTTP

El nodo HTTPRequest es la forma más fácil de realizar solicitudes HTTP en Godot. Está respaldado por el HTTPClient de más bajo nivel, para el cual hay un tutorial disponible aquí.

Por el bien de este ejemplo, crearemos una interfaz de usuario simple con un botón, que cuando se presione iniciará la solicitud HTTP a la URL especificada.

Preparando la escena

Crea una nueva escena vacía, añade un CanvasLayer como nodo raíz y añádele un script. Luego, añádele dos nodos hijos: un botón y un nodo HTTPRequest. Deberás conectar las siguientes señales al script de CanvasLayer:

  • Button.pressed: Cuando se presione el botón, comenzaremos la solicitud.
  • HTTPRequest.request_completed: Cuando se complete la solicitud, obtendremos los datos solicitados como un argumento.
../../_images/rest_api_scene.png

Scripting

Abajo se muestra todo el código que necesitamos para que funcione. La URL apunta a una API mocker en línea; devuelve una cadena JSON predefinida, que luego analizaremos para obtener acceso a los datos.

extends CanvasLayer

func _ready():
    $HTTPRequest.connect("request_completed", self, "_on_request_completed")

func _on_Button_pressed():
    $HTTPRequest.request("http://www.mocky.io/v2/5185415ba171ea3a00704eed")

func _on_request_completed(result, response_code, headers, body):
    var json = JSON.parse(body.get_string_from_utf8())
    print(json.result)

Con esto, deberías ver (hello:world) impreso en la consola; hello es una clave, y world es un valor, ambas son cadenas.

Para obtener más información sobre el análisis de JSON, mira las referencias de clase para JSON y JSONParseResult.

Nota que es posible que quieras comprobar si el resultado es igual a RESULT_SUCCESS y si se produjo un error de análisis JSON, mira la referencia de clase de JSON y HTTPRequest para obtener más información.

Por supuesto, también puedes establecer encabezados HTTP personalizados. Estos se dan como un array de cadenas, con cada cadena conteniendo un encabezado en el formato "encabezado:valor". Por ejemplo, para establecer un agente de usuario personalizado (el encabezado de agente-usuario de HTTP) puedes usar lo siguiente:

$HTTPRequest.request("http://www.mocky.io/v2/5185415ba171ea3a00704eed", ["user-agent: YourCustomUserAgent"])

Nota por favor, que para que el cifrado SSL/TLS y, por tanto, las URL HTTPS funcionen, es posible que necesites realizar algunos pasos, tal como se describe aquí.

Además, cuando llames APIs usando autorización, sé consciente que alguien puede analizar y descompilar tu aplicación lanzada y, por tanto, puede obtener acceso a cualquier información de autorización incrustada como tokens, nombres de usuario o contraseñas. Eso significa que generalmente no es una buena idea incluir cosas como las credenciales de acceso a la base de datos dentro de tu juego. Evita proporcionar información útil para un atacante siempre que sea posible.

Enviando datos al servidor

Hasta ahora nos hemos limitado a solicitar datos de un servidor. Pero, ¿Qué si necesitas enviar datos al servidor? Aquí hay una forma común de hacerlo:

func _make_post_request(url, data_to_send, use_ssl):
    # Convert data to json string:
    var query = JSON.print(data_to_send)
    # Add 'Content-Type' header:
    var headers = ["Content-Type: application/json"]
    $HTTPRequest.request(url, headers, use_ssl, HTTPClient.METHOD_POST, query)

Keep in mind that you have to wait for a request to finish before sending another one. Making multiple request at once requires you to have one node per request. A common strategy is to create and delete HTTPRequest nodes at runtime as necessary.