Skip to content
mobius1qwe edited this page Oct 7, 2026 · 1 revision

Home > Criar um plugin

Criar um plugin

Important

Em desenvolvimento (1.3). Ainda não está numa versão lançada e pode mudar.

Nível: avançado

Em uma frase: um plugin é uma classe que herda TRALPlugin e diz em que momento do pedido quer agir; o servidor chama só aquele momento.

Você vai precisar: entender Plugins. Para um grupo de rotas, o caminho é outro: Criar um módulo.

Os momentos (Phases)

Fase Método que você sobrescreve Quando roda Para quê
ppValidate ValidateRequest antes de o corpo ser lido recusar cedo: responder 400 ou mais encerra o pedido
ppProcess ProcessRequest(..., var AHandled) antes das rotas mexer no pedido/resposta; AHandled := True responde ali mesmo
ppResolveRoute ResolveRoute ao procurar a rota oferecer uma rota própria (como a /gettoken do JWT)
ppAuthenticate Authenticate ao autenticar ser um tipo de login
ppAuthResult AfterAuthenticate, AuthAttempt depois do veredito do login reagir ao resultado (é onde a força bruta conta)

Além disso: ServerActivating e ServerDeactivating, quando o servidor liga e desliga.

A ordem entre plugins é a Priority, maior primeiro. Os do RAL vão de 950 (cabeçalhos de segurança) a 50 (fila); um plugin novo nasce com 100. As constantes estão em RALPlugin (RALPriorityCORS, RALPriorityAuthentication...).

Exemplo: exigir uma chave de API

unit PluginChaveAPI;

interface

uses
  Classes, SysUtils,
  RALPlugin, RALRequest, RALResponse, RALTypes, RALConsts;

type
  TPluginChaveAPI = class(TRALPlugin)
  private
    FChave: StringRAL;
  protected
    function Phases: TRALPluginPhases; override;
  public
    procedure ValidateRequest(ARequest: TRALRequest; AResponse: TRALResponse); override;
  published
    property Chave: StringRAL read FChave write FChave;
  end;

implementation

function TPluginChaveAPI.Phases: TRALPluginPhases;
begin
  Result := [ppValidate]; // só este momento é chamado
end;

procedure TPluginChaveAPI.ValidateRequest(ARequest: TRALRequest; AResponse: TRALResponse);
begin
  if ARequest.GetHeader('X-Api-Key') <> FChave then
    AResponse.Answer(HTTP_Unauthorized, '{"erro":"chave inválida"}');
    // status >= 400: o pedido para aqui, a rota não roda
end;

end.

Usar:

vChave := TPluginChaveAPI.Create(Self);
vChave.Chave := 'abc123';
vChave.Server := Servidor;

Na paleta

procedure Register;
begin
  RegisterComponents('RAL - Plugins', [TPluginChaveAPI]);
end;

O que saber

  • Só as fases de Phases são chamadas. Uma fase que nenhum plugin usa não custa nada. Se as fases dependem de uma propriedade, chame Changed quando ela mudar.
  • Vários pedidos ao mesmo tempo. O mesmo objeto atende todas as threads: estado compartilhado (listas, contadores) precisa de trava.
  • ServerDeactivating roda com pedidos ainda em andamento: não libere o que uma rota pode estar usando.
  • Exceção em ServerActivating impede o servidor de ligar.
  • Enabled := False tira o plugin do caminho sem desligá-lo do servidor.

Veja também

Clone this wiki locally