TheCodeNaked

Paralelismo - Episódio 28 (Copy)

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:

  1. Disparar a requisição HTTP
  2. Esperar a resposta (sem bloquear a interface)
  3. Tratar erros (timeout, erro 500, JSON inválido)
  4. Atualizar a UI com os dados
  5. 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.

Sobre o autor

TheCodeNaked

No TheCodeNaked, programar é consequência, não ponto de partida. Antes do código, vem a dúvida, a análise, o contexto. Não seguimos fórmulas — questionamos. Criar software é pensar com clareza. O resto é só digitação.

TheCodeNaked

Criar com clareza. Codificar com intenção.

TheCodeNaked

Ótimo! Você se inscreveu com sucesso.

Bem-vindo de volta! Você acessou com sucesso.

Você se inscreveu com sucesso o TheCodeNaked.

Sucesso! Verifique seu e-mail para acessar com o link mágico.

As suas informações de faturamento foram atualizadas.

Seu pagamento não foi atualizado