Episódio 28 — Requisições REST com segurança e performance usando TSafeThread
Em aplicações modernas, o consumo de APIs REST se tornou algo trivial. Porém, quando isso é feito de forma síncrona ou com controle precário de threads, o resultado é quase sempre desastroso: UI travada, erros não tratados, cancelamentos impossíveis e dificuldades para atualizar a interface em tempo real.
Com a TSafeThreadInterface, podemos reverter esse cenário de forma elegante, mantendo o controle total da execução e, o mais importante, sem abrir mão da clareza do código.
🚧 O problema comum
Você quer buscar um JSON de uma API e mostrar na tela. A sequência lógica seria:
- Disparar a requisição HTTP
- Esperar a resposta (sem bloquear a interface)
- Tratar erros (timeout, erro 500, JSON inválido)
- Atualizar a UI com os dados
- Permitir cancelamento, caso o usuário desista
A maioria dos exemplos por aí falha em pelo menos dois desses pontos.
✅ A solução com TSafeThread
Vamos ver como resolver tudo isso de maneira clara:
var
Params := TSafeThreadParams.New
.SetOnInitialize(
procedure(Context: TThreadContext)
begin
MemoLog.Lines.Add('Iniciando requisição REST...');
AniIndicatorREST.Enabled := True;
end)
.SetOnExecute(
procedure(Context: TThreadContext)
begin
var Http := TNetHttpClient.Create(nil);
try
var Resp := Http.Get('https://jsonplaceholder.typicode.com/posts');
if Resp.StatusCode = 200 then
FData := Resp.ContentAsString
else
raise Exception.Create('Erro na requisição: ' + Resp.StatusText);
finally
Http.Free;
end;
end)
.SetOnSuccess(
procedure(Context: TThreadContext)
begin
MemoResultado.Lines.Text := FData;
end)
.SetOnComplete(
procedure(Context: TThreadContext)
begin
AniIndicatorREST.Enabled := False;
end)
.SetOnError(
procedure(const Msg: string)
begin
ShowMessage('Erro: ' + Msg);
end)
.SetOnCancel(
procedure(Context: TThreadContext)
begin
MemoLog.Lines.Add('Requisição cancelada pelo usuário.');
end)
.SetCompleteWithError(True)
.SetThreadName('RequisicaoREST')
.SetThreadId(1);
TSafeThread.ExecuteThread(Params);
🧠 O que aprendemos
- Separar claramente cada etapa da execução
- Tratar exceções corretamente sem travar a UI
- Garantir atualização visual suave
- Adicionar cancelamento de forma intuitiva
A clareza do código acima mostra o verdadeiro poder de abstração da TSafeThreadInterface. Não estamos escondendo complexidade, estamos organizando a execução para que ela seja controlável.
No próximo episódio, vamos integrar essa estrutura com autenticação e headers dinâmicos. Vamos além do GET. Prepare-se para chamadas reais e seguras em aplicações empresariais.
"O que dá trabalho não é criar um bom código. É manter um ruim funcionando."
Bem-vindo ao modelo de requisições REST com classe — literalmente.