Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
Fazendo solicitações HTTP
Por que usar HTTP?
As requisições HTTP são úteis para se comunicar com servidores web e outros programas que não sejam o Godot.
Comparadas a outros recursos de rede do Godot (como o High-level multiplayer), as requisições HTTP possuem mais overhead e demoram mais para começar, portanto não são adequadas para comunicação em tempo real e não são boas para enviar muitas pequenas atualizações, como é comum no gameplay multijogador.
O HTTP, no entanto, oferece interoperabilidade com recursos web externos e é ótimo para enviar e receber grandes quantidades de dados, por exemplo, para transferir arquivos como assets do jogo. Esses assets podem então ser carregados usando o carregamento e salvamento de arquivos em tempo de execução.
Portanto, o HTTP pode ser útil para o sistema de login do seu jogo, navegador de lobbies, para recuperar alguma informação da web ou para baixar assets do jogo.
Requisições HTTP no Godot
O nó HTTPRequest é a maneira mais fácil de fazer requisições HTTP no Godot. Ele é baseado no HTTPClient, que é de nível mais baixo e para o qual um tutorial está disponível aqui.
Para este exemplo, faremos uma requisição HTTP ao GitHub para recuperar o nome da última versão do Godot.
Aviso
Ao exportar para o Android, certifique-se de ativar a permissão Internet no preset de exportação do Android antes de exportar o projeto ou usar o deploy de um clique. Caso contrário, qualquer tipo de comunicação de rede será bloqueada pelo sistema operacional Android.
Preparando a cena
Crie uma nova cena vazia, adicione um Node raiz e adicione um script a ele. Em seguida, adicione um nó HTTPRequest como filho.
Criando o script da requisição
Quando o projeto for iniciado (ou seja, no _ready()), enviaremos uma requisição HTTP para o Github usando nosso nó HTTPRequest e, assim que a requisição for concluída, analisaremos os dados JSON retornados, procuraremos pelo campo name e o exibiremos no console.
extends Node
func _ready():
$HTTPRequest.request_completed.connect(_on_request_completed)
$HTTPRequest.request("https://api.github.com/repos/godotengine/godot/releases/latest")
func _on_request_completed(result, response_code, headers, body):
var json = JSON.parse_string(body.get_string_from_utf8())
print(json["name"])
using Godot;
using System.Text;
public partial class MyNode : Node
{
public override void _Ready()
{
HttpRequest httpRequest = GetNode<HttpRequest>("HTTPRequest");
httpRequest.RequestCompleted += OnRequestCompleted;
httpRequest.Request("https://api.github.com/repos/godotengine/godot/releases/latest");
}
private void OnRequestCompleted(long result, long responseCode, string[] headers, byte[] body)
{
Godot.Collections.Dictionary json = Json.ParseString(Encoding.UTF8.GetString(body)).AsGodotDictionary();
GD.Print(json["name"]);
}
}
Salve o script e a cena, e execute o projeto. O nome da versão mais recente do Godot no Github deve ser impresso no log de saída. Para mais informações sobre a análise de JSON, consulte as referências da classe para JSON.
Observe que você pode querer verificar se o result é igual a RESULT_SUCCESS e se ocorreu um erro de análise JSON; veja a referência da classe JSON e HTTPRequest para mais detalhes.
Você deve esperar uma requisição terminar antes de enviar outra. Fazer múltiplas requisições ao mesmo tempo exige que você tenha um nó por requisição. Uma estratégia comum é criar e deletar nós HTTPRequest em tempo de execução conforme necessário.
Enviando dados para o servidor
Até agora, nos limitamos a solicitar dados de um servidor. Mas e se você precisar enviar dados para o servidor? Aqui está uma maneira comum de fazer isso:
var json = JSON.stringify(data_to_send)
var headers = ["Content-Type: application/json"]
$HTTPRequest.request(url, headers, HTTPClient.METHOD_POST, json)
string json = Json.Stringify(dataToSend);
string[] headers = ["Content-Type: application/json"];
HttpRequest httpRequest = GetNode<HttpRequest>("HTTPRequest");
httpRequest.Request(url, headers, HttpClient.Method.Post, json);
Definindo cabeçalhos HTTP personalizados
Claro, você também pode definir cabeçalhos HTTP personalizados. Eles são fornecidos como uma matriz de strings, com cada string contendo um cabeçalho no formato "cabeçalho: valor". Por exemplo, para definir um user agent personalizado (o cabeçalho HTTP User-Agent), você poderia usar o seguinte:
$HTTPRequest.request("https://api.github.com/repos/godotengine/godot/releases/latest", ["User-Agent: YourCustomUserAgent"])
HttpRequest httpRequest = GetNode<HttpRequest>("HTTPRequest");
httpRequest.Request("https://api.github.com/repos/godotengine/godot/releases/latest", ["User-Agent: YourCustomUserAgent"]);
Perigo
Be aware that someone might analyze and decompile your released application and thus may gain access to any embedded authorization information like tokens, usernames, or passwords. That means it is usually not a good idea to embed things such as database access credentials inside your game. Avoid providing information useful to an attacker whenever possible.