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.

Advertencia

Cuando exportes a Android, asegúrate de habilitar el permiso INTERNET en la configuración de exportación de Android antes de exportar el proyecto o utilizar el despliegue de un solo clic. De lo contrario, la comunicación de red de cualquier tipo será bloqueada por Android.

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 puede establecer cabeceras HTTP personalizadas. Éstas se proporcionan como una matriz de cadenas, en la que cada cadena contiene una cabecera con el formato "cabecera: valor". Por ejemplo, para establecer un agente de usuario personalizado (la cabecera HTTP user-agent) 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)

Ten en cuenta que tienes que esperar una solicitud de terminar antes que envíar otro. Se necesita un nodo por cada solicitud para hacer varias solicitudes a la vez. Una estrategía común es crear y borrar nodos de HTTPRequest durante el tiempo de ejecución.