Faire des requêtes HTTP

Le nœud HTTPRequest est le moyen le plus simple de faire des requêtes HTTP dans Godot. Il est soutenu par le nœud de plus bas niveau HTTPClient, pour lequel un tutoriel est disponible ici.

Pour les besoins de cet exemple, nous allons créer une interface utilisateur simple avec un bouton qui, une fois pressé, lancera la requête HTTP vers l'URL spécifiée.

Préparer la scène

Créez une nouvelle scène vide, ajoutez un CanvasLayer comme nœud racine et ajoutez-y un script. Ajoutez ensuite deux nœuds enfants : un nœud Button et un nœud HTTPRequest. Vous devrez connecter les signaux suivants au script CanvasLayer :

  • Button.pressed : Lorsque le bouton est pressé, nous lançons la requête.
  • HTTPRequest.request_completed : Lorsque la requête sera terminée, nous obtiendrons les données demandées comme argument.
../../_images/rest_api_scene.png

Les scripts

Vous trouverez ci-dessous tout le code dont nous avons besoin pour le faire fonctionner. L'URL pointe vers une simulation d' API en ligne ; elle renvoie une chaîne JSON prédéfinie, que nous allons ensuite analyser pour avoir accès aux données.

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)

Avec cela, vous devriez voir (hello:world) imprimé sur la console ; hello étant une clé, et world étant une valeur, toutes deux des chaînes.

Pour plus d'informations sur l'analyse de JSON, voir les références des classes JSON et JSONParseResult.

Notez que vous pouvez vérifier si le result est égal à RESULT_SUCCESS et si une erreur d'analyse JSON s'est produite, voir la référence de la classe JSON et HTTPRequest pour en savoir plus.

Bien entendu, vous pouvez également définir des en-têtes HTTP personnalisés. Elles sont données sous forme de tableau de chaînes, chaque chaîne contenant un en-tête au format "header: value". Par exemple, pour définir un agent utilisateur personnalisé (l'en-tête HTTP user-agent), vous pouvez utiliser ce qui suit :

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

Veuillez noter que, pour que le cryptage SSL/TLS et donc pour que les URL HTTPS fonctionnent, vous devrez peut-être prendre certaines mesures comme décrit ici.

De plus, lorsque vous appelez des API en utilisant une autorisation, sachez que quelqu'un pourrait analyser et décompiler votre application publiée et ainsi avoir accès à toute information d'autorisation intégrée comme des jetons, des noms d'utilisateur ou des mots de passe. Cela signifie que ce n'est généralement pas une bonne idée d'intégrer dans votre jeu des éléments tels que les identifiants d'accès aux bases de données. Évitez autant que possible de fournir des informations utiles à un agresseur.

Envoi de données au serveur

Jusqu'à maintenant, nous nous sommes limités à demander des données à un serveur. Mais comment faire si vous avez besoin d'envoyer des données au serveur ? Voici une manière courante de le faire :

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)

Rappelez-vous qu’il faut attendre qu’une requête finisse avant d’en envoyer une autre. Pour faire plusieurs requête à la fois, il faut avoir un nœud par requête. Une stratégie courante est de créer et supprimer des nœuds HTTPRequest à l’exécution, selon les besoins.