Como Consumir API REST no Delphi: Guia Completo com JSON, GET, POST e Autenticação
Como Consumir API REST no Delphi: Guia Completo com JSON, GET, POST e Autenticação
As APIs REST estão presentes praticamente em todos os tipos de sistemas modernos.
Aplicações comerciais, sistemas financeiros, plataformas de pagamento, serviços de mapas, sistemas de emissão fiscal, plataformas de comunicação e aplicações mobile normalmente precisam conversar com outros sistemas através de APIs.
Para quem desenvolve em Delphi, consumir uma API REST é uma tarefa relativamente simples quando utilizamos os recursos disponíveis no próprio Delphi.
Neste artigo vamos construir, passo a passo, uma estrutura profissional para consumir APIs REST utilizando Delphi, trabalhando com:
- REST API;
- HTTP;
- GET;
- POST;
- PUT;
- DELETE;
- JSON;
- Headers;
- Query Parameters;
- Bearer Token;
- autenticação;
- tratamento de erros;
- timeout;
- conversão de JSON;
- classes de serviço;
- organização do projeto;
- exemplos práticos.
A ideia é que, ao final do artigo, você consiga utilizar esse conhecimento em aplicações reais.
1. O que é uma API REST?
REST significa Representational State Transfer.
Na prática, uma API REST permite que uma aplicação converse com outra aplicação através de requisições HTTP.
Imagine, por exemplo, que seu sistema Delphi precise consultar os dados de um cliente em um servidor.
O Delphi pode fazer uma requisição:
GET https://api.exemplo.com/clientes/10
O servidor processa a solicitação e devolve uma resposta, normalmente em JSON:
{
"codigo": 10,
"nome": "João da Silva",
"email": "joao@exemplo.com"
}
O Delphi recebe esse JSON e transforma os dados em objetos, registros ou simplesmente acessa os campos diretamente.
A comunicação pode ser representada assim:
┌─────────────────┐
│ Aplicação Delphi│
└────────┬────────┘
│
│ HTTP/HTTPS
▼
┌─────────────────┐
│ API REST │
└────────┬────────┘
│
▼
┌─────────────────┐
│ Banco de dados │
└─────────────────┘
2. O que é JSON?
JSON é um dos formatos mais utilizados para troca de informações entre aplicações.
JSON significa:
JavaScript Object Notation
Um objeto JSON pode ser:
{
"codigo": 1,
"nome": "Maria",
"cidade": "Belém"
}
Também podemos receber uma lista:
[
{
"codigo": 1,
"nome": "Maria"
},
{
"codigo": 2,
"nome": "João"
}
]
No Delphi moderno, podemos trabalhar com JSON utilizando classes como:
TJSONObject
TJSONArray
TJSONValue
3. Métodos HTTP mais utilizados
As APIs REST normalmente utilizam os métodos HTTP para indicar a operação desejada.
| Método | Utilização |
|---|---|
| GET | Consultar dados |
| POST | Criar/enviar dados |
| PUT | Atualizar dados |
| PATCH | Atualização parcial |
| DELETE | Excluir dados |
Um CRUD de clientes poderia utilizar:
GET /clientes
GET /clientes/10
POST /clientes
PUT /clientes/10
DELETE /clientes/10
4. O REST Client do Delphi
O Delphi possui componentes para trabalhar com REST.
Entre os principais estão:
TRESTClient
TRESTRequest
TRESTResponse
Uma arquitetura básica fica assim:
TRESTClient
│
▼
TRESTRequest
│
▼
TRESTResponse
O TRESTClient representa o cliente HTTP.
O TRESTRequest representa a requisição.
O TRESTResponse recebe a resposta da API.
5. Criando nosso primeiro projeto
Crie uma aplicação:
VCL Forms Application
No formulário, adicione:
TRESTClient
TRESTRequest
TRESTResponse
TButton
TMemo
Podemos utilizar os seguintes nomes:
RESTClient1
RESTRequest1
RESTResponse1
btnConsultar
Memo1
Configure:
RESTRequest1.Client = RESTClient1
RESTRequest1.Response = RESTResponse1
6. Units necessárias
Uma implementação básica poderá utilizar:
uses
System.SysUtils,
System.Classes,
System.JSON,
REST.Client,
REST.Types,
REST.Request,
REST.Response.Adapter;
Dependendo da versão do Delphi e dos recursos utilizados, outras units podem ser necessárias.
7. Fazendo nossa primeira requisição GET
Vamos utilizar uma API pública de testes.
Por exemplo:
https://jsonplaceholder.typicode.com/posts/1
A ideia é solicitar o registro número 1.
Código:
procedure TForm1.btnConsultarClick(Sender: TObject);
begin
RESTClient1.BaseURL :=
'https://jsonplaceholder.typicode.com';
RESTRequest1.Resource := 'posts/1';
RESTRequest1.Method := rmGET;
RESTRequest1.Execute;
Memo1.Lines.Text :=
RESTResponse1.Content;
end;
Se tudo estiver funcionando, o Memo deverá receber algo semelhante a:
{
"userId": 1,
"id": 1,
"title": "sunt aut facere repellat provident occaecati",
"body": "quia et suscipit..."
}
Parabéns.
Você acabou de consumir uma API REST usando Delphi.
8. Entendendo o código
Esta linha define a URL base:
RESTClient1.BaseURL :=
'https://jsonplaceholder.typicode.com';
Depois informamos o recurso:
RESTRequest1.Resource := 'posts/1';
Juntando os dois:
https://jsonplaceholder.typicode.com/posts/1
Depois definimos o método:
RESTRequest1.Method := rmGET;
Finalmente:
RESTRequest1.Execute;
executa a requisição.
A resposta fica disponível em:
RESTResponse1.Content
9. Trabalhando com JSON
Em uma aplicação profissional, normalmente não queremos simplesmente jogar o JSON em um Memo.
Queremos interpretar os dados.
Podemos utilizar:
TJSONObject
Exemplo:
var
JSON: TJSONObject;
begin
RESTRequest1.Execute;
JSON :=
TJSONObject.ParseJSONValue(
RESTResponse1.Content
) as TJSONObject;
try
if Assigned(JSON) then
begin
ShowMessage(
JSON.GetValue<string>('title')
);
end;
finally
JSON.Free;
end;
end;
Assim conseguimos acessar diretamente o campo:
"title"
10. Verificando se o JSON é válido
Não devemos assumir que toda resposta recebida será um JSON válido.
Uma API pode retornar:
- JSON;
- HTML;
- mensagem de erro;
- resposta vazia;
- erro do servidor;
- timeout.
Por isso, devemos verificar.
var
JSONValue: TJSONValue;
begin
JSONValue :=
TJSONObject.ParseJSONValue(
RESTResponse1.Content
);
try
if not Assigned(JSONValue) then
raise Exception.Create(
'A API retornou um JSON inválido.'
);
finally
JSONValue.Free;
end;
end;
11. Verificando o HTTP Status Code
Outro ponto extremamente importante é verificar o status HTTP.
Alguns códigos comuns:
| Código | Significado |
|---|---|
| 200 | OK |
| 201 | Criado |
| 204 | Sem conteúdo |
| 400 | Requisição inválida |
| 401 | Não autenticado |
| 403 | Acesso proibido |
| 404 | Não encontrado |
| 409 | Conflito |
| 422 | Dados não processados |
| 429 | Muitas requisições |
| 500 | Erro interno |
| 502 | Bad Gateway |
| 503 | Serviço indisponível |
Podemos verificar:
if RESTResponse1.StatusCode <> 200 then
begin
raise Exception.Create(
Format(
'Erro HTTP %d: %s',
[
RESTResponse1.StatusCode,
RESTResponse1.StatusText
]
)
);
end;
Uma API que retorna 404, por exemplo, não deve ser tratada como se tivesse retornado dados normalmente.
12. Criando uma função para GET
Em vez de repetir código em todos os formulários, podemos criar uma função:
function TForm1.ExecutarGET(
const Recurso: string
): string;
begin
RESTRequest1.Client := RESTClient1;
RESTRequest1.Response := RESTResponse1;
RESTRequest1.Resource := Recurso;
RESTRequest1.Method := rmGET;
RESTRequest1.Execute;
if RESTResponse1.StatusCode < 200 then
raise Exception.Create(
'Erro na comunicação com a API.'
);
if RESTResponse1.StatusCode >= 300 then
raise Exception.Create(
Format(
'Erro HTTP %d: %s',
[
RESTResponse1.StatusCode,
RESTResponse1.StatusText
]
)
);
Result := RESTResponse1.Content;
end;
Uso:
Memo1.Lines.Text :=
ExecutarGET('posts/1');
13. GET com parâmetros
Imagine uma API:
GET /clientes?nome=Joao
Podemos adicionar parâmetros.
Uma forma de trabalhar com parâmetros é:
RESTRequest1.Params.AddItem(
'nome',
'Joao',
pkGETorPOST
);
Depois:
RESTRequest1.Execute;
A API receberá algo semelhante a:
?nome=Joao
14. GET com vários parâmetros
Por exemplo:
/clientes?nome=Joao&cidade=Belem
Podemos fazer:
RESTRequest1.Params.Clear;
RESTRequest1.Params.AddItem(
'nome',
'Joao',
pkGETorPOST
);
RESTRequest1.Params.AddItem(
'cidade',
'Belem',
pkGETorPOST
);
Depois:
RESTRequest1.Execute;
15. Consumindo uma lista de registros
Agora imagine que a API retorne:
[
{
"codigo": 1,
"nome": "João"
},
{
"codigo": 2,
"nome": "Maria"
}
]
Nesse caso utilizamos:
TJSONArray
Exemplo:
var
JSON: TJSONValue;
ArrayJSON: TJSONArray;
I: Integer;
begin
RESTRequest1.Execute;
JSON :=
TJSONObject.ParseJSONValue(
RESTResponse1.Content
);
try
if not (JSON is TJSONArray) then
raise Exception.Create(
'A API não retornou uma lista.'
);
ArrayJSON := JSON as TJSONArray;
for I := 0 to ArrayJSON.Count - 1 do
begin
Memo1.Lines.Add(
ArrayJSON.Items[I]
.GetValue<string>('nome')
);
end;
finally
JSON.Free;
end;
end;
16. Consumindo POST
GET normalmente é utilizado para consulta.
Quando precisamos enviar dados para a API, geralmente utilizamos POST.
Imagine:
POST /clientes
Enviaremos:
{
"nome": "João da Silva",
"email": "joao@exemplo.com"
}
Podemos construir o JSON:
var
JSON: TJSONObject;
begin
JSON := TJSONObject.Create;
try
JSON.AddPair(
'nome',
'João da Silva'
);
JSON.AddPair(
'email',
'joao@exemplo.com'
);
finally
JSON.Free;
end;
end;
17. Enviando JSON para a API
Podemos utilizar um parâmetro de corpo.
Exemplo:
var
JSON: TJSONObject;
begin
JSON := TJSONObject.Create;
try
JSON.AddPair(
'nome',
'João da Silva'
);
JSON.AddPair(
'email',
'joao@exemplo.com'
);
RESTRequest1.Params.Clear;
RESTRequest1.AddBody(
JSON.ToJSON,
ctAPPLICATION_JSON
);
RESTRequest1.Method := rmPOST;
RESTRequest1.Resource :=
'clientes';
RESTRequest1.Execute;
finally
JSON.Free;
end;
end;
O servidor receberá:
{
"nome": "João da Silva",
"email": "joao@exemplo.com"
}
18. POST com dados de um formulário
Imagine:
edtNome
edtEmail
edtTelefone
Podemos fazer:
JSON.AddPair(
'nome',
edtNome.Text
);
JSON.AddPair(
'email',
edtEmail.Text
);
JSON.AddPair(
'telefone',
edtTelefone.Text
);
Assim podemos transformar os dados da tela em JSON.
19. Utilizando PUT
PUT normalmente é utilizado para atualização.
Por exemplo:
PUT /clientes/10
JSON:
{
"nome": "João da Silva",
"email": "novoemail@exemplo.com"
}
No Delphi:
RESTRequest1.Resource :=
'clientes/10';
RESTRequest1.Method := rmPUT;
RESTRequest1.Params.Clear;
RESTRequest1.AddBody(
JSON.ToJSON,
ctAPPLICATION_JSON
);
RESTRequest1.Execute;
20. Utilizando DELETE
Para excluir:
DELETE /clientes/10
No Delphi:
RESTRequest1.Resource :=
'clientes/10';
RESTRequest1.Method := rmDELETE;
RESTRequest1.Execute;
Depois podemos verificar:
if RESTResponse1.StatusCode = 204 then
begin
ShowMessage(
'Cliente excluído com sucesso.'
);
end;
O status retornado depende do contrato da API.
21. Headers HTTP
APIs frequentemente exigem headers.
Um dos mais comuns é:
Content-Type: application/json
Outro muito utilizado:
Accept: application/json
Podemos configurar:
RESTRequest1.Params.AddItem(
'Content-Type',
'application/json',
pkHTTPHEADER
);
RESTRequest1.Params.AddItem(
'Accept',
'application/json',
pkHTTPHEADER
);
22. Autenticação Bearer Token
Muitas APIs exigem autenticação.
Um padrão muito comum é:
Authorization: Bearer TOKEN
Exemplo:
RESTRequest1.Params.AddItem(
'Authorization',
'Bearer ' + Token,
pkHTTPHEADER
);
Por exemplo:
Token :=
'eyJhbGciOiJIUzI1NiIs...';
E:
RESTRequest1.Params.AddItem(
'Authorization',
'Bearer ' + Token,
pkHTTPHEADER
);
23. Não deixe o token espalhado pelo código
Evite:
RESTRequest1.Params.AddItem(
'Authorization',
'Bearer 123456789',
pkHTTPHEADER
);
Principalmente em sistemas comerciais.
O ideal é obter o token de uma configuração, processo de autenticação ou serviço específico.
Por exemplo:
Token := AuthService.Token;
E então:
RESTRequest1.Params.AddItem(
'Authorization',
'Bearer ' + Token,
pkHTTPHEADER
);
24. API com login
Um fluxo bastante comum é:
Delphi
│
│ POST /login
▼
API
│
│ token
▼
Delphi
│
│ Authorization: Bearer TOKEN
▼
API
O Delphi envia:
{
"usuario": "admin",
"senha": "123456"
}
A API responde:
{
"token": "abc123..."
}
Depois o Delphi utiliza:
Authorization: Bearer abc123...
nas próximas requisições.
25. Criando uma classe para API
Em projetos pequenos podemos utilizar os componentes diretamente nos formulários.
Em projetos profissionais, entretanto, é melhor criar uma camada específica.
Por exemplo:
Services
│
├── ApiClient.pas
├── AuthService.pas
├── ClienteService.pas
└── ProdutoService.pas
A ideia é:
Formulário
│
▼
Service
│
▼
ApiClient
│
▼
REST API
Assim o formulário não precisa conhecer todos os detalhes de HTTP.
26. Classe ApiClient
Podemos começar com:
type
TApiClient = class
private
FBaseURL: string;
FToken: string;
public
constructor Create(
const ABaseURL: string
);
function Get(
const AResource: string
): string;
function Post(
const AResource: string;
const ABody: string
): string;
function Put(
const AResource: string;
const ABody: string
): string;
function Delete(
const AResource: string
): string;
property Token: string read FToken write FToken;
end;
Essa classe pode concentrar toda a comunicação.
27. Por que criar uma ApiClient?
Imagine um sistema com:
50 formulários
Se cada formulário implementar:
RESTClient
RESTRequest
RESTResponse
teremos muita duplicação.
Agora imagine centralizar:
BaseURL
Token
Headers
Timeout
Tratamento de erro
Logs
SSL
Status HTTP
em uma única classe.
A manutenção fica muito mais simples.
28. Tratamento profissional de exceções
Nunca é uma boa ideia fazer:
try
RESTRequest1.Execute;
except
end;
Isso simplesmente ignora o problema.
Prefira:
try
RESTRequest1.Execute;
if RESTResponse1.StatusCode >= 400 then
raise Exception.Create(
Format(
'API retornou HTTP %d: %s',
[
RESTResponse1.StatusCode,
RESTResponse1.Content
]
)
);
except
on E: Exception do
begin
// Registrar log
raise;
end;
end;
29. Diferencie erro de comunicação e erro HTTP
Essa distinção é importante.
Um erro pode ocorrer porque:
Servidor está fora do ar
ou porque:
Servidor respondeu 401
São situações diferentes.
Por exemplo:
Erro de comunicação
↓
Não conseguimos falar com a API
Erro HTTP 401
↓
Falamos com a API
↓
API recusou autenticação
Essa diferença deve ser tratada pelo sistema.
30. Timeout
Nunca deixe uma aplicação desktop ficar indefinidamente esperando uma API.
Configure timeout de acordo com a necessidade do projeto.
Os valores exatos dependem da versão e da camada HTTP utilizada, mas a ideia é estabelecer limites para:
- conexão;
- envio;
- recebimento.
Em uma aplicação comercial, também é importante apresentar uma mensagem apropriada ao usuário:
Não foi possível comunicar com o servidor.
Verifique sua conexão com a Internet e tente novamente.
Em vez de simplesmente:
Socket Error #...
31. HTTPS
Ao consumir uma API na Internet, prefira:
https://
em vez de:
http://
Por exemplo:
https://api.meusistema.com
HTTPS protege a comunicação durante o transporte.
Isso é especialmente importante quando são transmitidos:
- usuários;
- senhas;
- tokens;
- dados financeiros;
- informações pessoais;
- documentos;
- dados de clientes.
32. Não confie apenas no HTTPS
HTTPS protege o transporte, mas não resolve todos os problemas de segurança.
Também devemos considerar:
- autenticação;
- autorização;
- expiração de tokens;
- armazenamento de credenciais;
- validação dos dados;
- permissões;
- logs;
- proteção contra replay;
- controle de acesso.
33. Serialização de objetos
Em projetos maiores, trabalhar diretamente com:
JSON.GetValue<string>('nome')
para dezenas de campos pode ficar trabalhoso.
Podemos criar classes.
Por exemplo:
type
TCliente = class
public
Codigo: Integer;
Nome: string;
Email: string;
Telefone: string;
end;
E então criar uma camada de conversão JSON ↔ objeto.
Isso deixa o código muito mais organizado.
34. Criando um modelo de cliente
Por exemplo:
type
TCliente = class
private
FCodigo: Integer;
FNome: string;
FEmail: string;
FTelefone: string;
public
property Codigo: Integer
read FCodigo write FCodigo;
property Nome: string
read FNome write FNome;
property Email: string
read FEmail write FEmail;
property Telefone: string
read FTelefone write FTelefone;
end;
Agora temos um modelo de domínio.
35. Separando Model, Service e View
Uma arquitetura simples pode ser:
MODEL
│
▼
SERVICE
│
▼
API CLIENT
│
▼
REST API
E a tela:
FORM
│
▼
SERVICE
Por exemplo:
ClienteService.Listar;
ClienteService.Buscar(10);
ClienteService.Incluir(Cliente);
ClienteService.Alterar(Cliente);
ClienteService.Excluir(10);
Isso é muito mais fácil de manter do que espalhar requisições REST por dezenas de formulários.
36. Exemplo de ClienteService
Uma classe poderia ter:
type
TClienteService = class
private
FApi: TApiClient;
public
constructor Create(
AApi: TApiClient
);
function Listar: string;
function Buscar(
ACodigo: Integer
): string;
function Inserir(
const ACliente: TCliente
): string;
function Alterar(
const ACliente: TCliente
): string;
procedure Excluir(
ACodigo: Integer
);
end;
Assim o formulário fica extremamente simples.
37. Exemplo de uso no formulário
Em vez de:
RESTClient1.BaseURL := ...;
RESTRequest1.Resource := ...;
RESTRequest1.Params.Clear;
RESTRequest1.Execute;
o formulário pode fazer:
JSON := ClienteService.Listar;
Ou:
JSON := ClienteService.Buscar(10);
Essa é uma grande evolução arquitetural.
38. Paginação
APIs que retornam muitos registros normalmente utilizam paginação.
Por exemplo:
GET /clientes?page=1&limit=50
A API pode responder:
{
"page": 1,
"limit": 50,
"total": 327,
"data": [
...
]
}
No Delphi, podemos enviar:
RESTRequest1.Params.AddItem(
'page',
'1',
pkGETorPOST
);
RESTRequest1.Params.AddItem(
'limit',
'50',
pkGETorPOST
);
Em aplicações com muitos dados, paginação é fundamental para evitar respostas excessivamente grandes.
39. API retornando mensagens de erro
Uma API pode responder:
{
"error": true,
"message": "Cliente não encontrado."
}
Não devemos simplesmente mostrar o JSON inteiro ao usuário.
Podemos interpretar:
var
JSON: TJSONObject;
Mensagem: string;
begin
JSON :=
TJSONObject.ParseJSONValue(
RESTResponse1.Content
) as TJSONObject;
try
if Assigned(JSON) then
begin
Mensagem :=
JSON.GetValue<string>(
'message',
''
);
if Mensagem <> '' then
ShowMessage(Mensagem);
end;
finally
JSON.Free;
end;
end;
40. Logs
Uma aplicação profissional deve considerar logs.
Por exemplo:
2026-09-15 10:20:01
GET /clientes/10
HTTP 200
245 ms
Ou:
2026-09-15 10:21:35
POST /clientes
HTTP 500
Mensagem: Internal Server Error
O log pode ajudar muito na identificação de problemas.
Mas atenção:
Nunca registre tokens, senhas ou dados sensíveis sem uma justificativa e proteção adequada.
41. Retry
Nem todo erro significa que devemos tentar novamente.
Um erro:
401 Unauthorized
normalmente não deve simplesmente ser repetido.
Já um erro temporário:
503 Service Unavailable
pode, dependendo do contrato da API, permitir uma nova tentativa.
Em sistemas mais sofisticados podemos implementar:
Tentativa 1
↓
falhou
↓
aguarda
↓
Tentativa 2
↓
falhou
↓
aguarda
↓
Tentativa 3
O intervalo pode utilizar backoff.
É importante respeitar limites e orientações da própria API.
42. Rate Limit
Algumas APIs limitam o número de requisições.
Podemos receber:
HTTP 429
que indica excesso de requisições.
Se a API informar um tempo de espera, o cliente deve respeitar essa orientação.
Isso é particularmente importante em integrações com:
- APIs de pagamento;
- APIs de mensagens;
- APIs de mapas;
- serviços de terceiros;
- serviços públicos;
- APIs SaaS.
43. API REST em sistemas Delphi comerciais
Uma arquitetura muito interessante para sistemas comerciais é:
┌───────────────────────┐
│ Aplicação │
│ Delphi │
└───────────┬───────────┘
│
HTTPS
│
▼
┌───────────────────────┐
│ API REST │
│ │
│ Autenticação │
│ Regras de negócio │
│ Validações │
│ Permissões │
└───────────┬───────────┘
│
▼
┌───────────────────────┐
│ Banco SQL │
└───────────────────────┘
Essa arquitetura pode ser muito interessante quando existem:
- aplicativo desktop;
- aplicativo Android;
- aplicativo iOS;
- painel web;
- integrações externas.
Todos podem consumir a mesma API.
44. Delphi como cliente de uma API PHP
Um cenário muito comum é:
Delphi
│
▼
API PHP
│
▼
MySQL
O Delphi não acessa diretamente o MySQL.
Em vez disso:
Delphi
│
│ JSON
▼
PHP REST API
│
│ SQL
▼
MySQL
Essa arquitetura pode oferecer vantagens importantes de centralização das regras de negócio e controle de acesso.
45. Delphi + API + Flutter
Outra arquitetura interessante é:
┌──────────────┐
│ Delphi │
│ Desktop │
└──────┬───────┘
│
│
┌──────▼───────┐
│ API REST │
└──────┬───────┘
│
┌────────┴────────┐
│ │
┌─────▼─────┐ ┌─────▼─────┐
│ MySQL │ │ PostgreSQL│
└───────────┘ └───────────┘
▲
│
┌─────┴─────┐
│ Flutter │
│ Android/iOS│
└───────────┘
Nesse modelo, Delphi e Flutter podem consumir a mesma API.
Isso é especialmente útil para sistemas que possuem desktop e aplicativo mobile.
46. Boas práticas
Ao desenvolver clientes REST em Delphi, procure seguir algumas regras.
1. Utilize HTTPS
Evite transmitir informações sensíveis por HTTP puro.
2. Não espalhe URLs
Centralize:
BaseURL
em uma configuração.
3. Centralize autenticação
O gerenciamento de token deve ficar em uma camada específica.
4. Utilize parâmetros
Não monte URLs manualmente com valores sem tratamento.
5. Valide o JSON
Não assuma que a resposta sempre terá o formato esperado.
6. Verifique o status HTTP
Um HTTP 400, 401 ou 500 precisa ser tratado adequadamente.
7. Utilize timeout
Evite deixar a interface congelada esperando indefinidamente.
8. Registre logs
Mas nunca exponha credenciais e tokens nos logs.
9. Separe responsabilidades
Utilize:
Form
Service
ApiClient
Model
10. Documente a API
Se você controla a API, mantenha documentação clara dos endpoints.
47. Estrutura profissional sugerida
Um projeto Delphi que consome várias APIs poderia ter:
MeuProjeto
│
├── Forms
│ ├── frmPrincipal.pas
│ ├── frmClientes.pas
│ └── frmProdutos.pas
│
├── Models
│ ├── uCliente.pas
│ └── uProduto.pas
│
├── Services
│ ├── uClienteService.pas
│ ├── uProdutoService.pas
│ └── uAuthService.pas
│
├── Infrastructure
│ ├── uApiClient.pas
│ ├── uApiConfig.pas
│ └── uApiException.pas
│
├── Utils
│
└── config.ini
Essa organização funciona muito bem para projetos que irão crescer.
48. Configurando a API através de INI
Assim como podemos utilizar INI para configurar banco de dados, também podemos configurar a API.
Exemplo:
[API]
BaseURL=https://api.meusistema.com
Timeout=30000
Version=v1
No Delphi:
Ini.ReadString(
'API',
'BaseURL',
''
);
Isso permite mudar o endereço da API sem recompilar o aplicativo.
49. Ambiente de desenvolvimento e produção
Podemos utilizar:
[API]
BaseURL=https://api-dev.meusistema.com
durante o desenvolvimento.
E:
[API]
BaseURL=https://api.meusistema.com
em produção.
O executável pode ser o mesmo.
Somente a configuração muda.
Essa abordagem reduz a necessidade de recompilar o sistema para cada ambiente.
50. Cuidado com credenciais no INI
Embora o INI seja muito útil para configurações, não devemos tratar um arquivo INI comum como um cofre de segredos.
Evite armazenar:
Password=senha_super_secreta
Token=token_completo
sem avaliar o risco.
Dependendo do tipo de aplicação, considere:
- armazenamento seguro do sistema operacional;
- credenciais temporárias;
- tokens com expiração;
- autenticação apropriada;
- criptografia;
- servidor intermediário;
- permissões adequadas.
51. Uma API REST não é apenas HTTP + JSON
É importante entender que uma integração profissional depende de um contrato.
Esse contrato precisa definir:
Endpoint
Método HTTP
Headers
Autenticação
Parâmetros
Formato da requisição
Formato da resposta
Status HTTP
Mensagens de erro
Paginação
Limites
Versionamento
Por exemplo:
POST /api/v1/clientes
Request:
{
"nome": "João",
"email": "joao@email.com"
}
Response:
{
"codigo": 15,
"nome": "João",
"email": "joao@email.com"
}
Status:
201 Created
Isso é muito melhor do que simplesmente "fazer um POST".
52. Versionamento de API
Em projetos profissionais, é comum versionar APIs.
Por exemplo:
/api/v1/clientes
e posteriormente:
/api/v2/clientes
Isso permite evoluir a API sem necessariamente quebrar aplicações antigas.
Para aplicações Delphi distribuídas para muitos clientes, isso pode ser particularmente importante.
53. Checklist para uma integração REST
Antes de colocar uma integração em produção, verifique:
☐ URL configurada
☐ HTTPS
☐ Método HTTP correto
☐ Headers
☐ Content-Type
☐ Accept
☐ Autenticação
☐ Token
☐ Timeout
☐ Tratamento de erros
☐ Status HTTP
☐ JSON validado
☐ Logs
☐ Retry quando apropriado
☐ Rate limit
☐ Versionamento
☐ Configuração de produção
☐ Segurança das credenciais
54. Exemplo de fluxo completo
Um fluxo profissional pode ser:
Usuário
│
▼
Formulário Delphi
│
▼
ClienteService
│
▼
ApiClient
│
├── URL
├── Headers
├── Token
├── Timeout
└── HTTP
│
▼
API REST
│
▼
JSON
│
▼
ApiClient
│
▼
Service
│
▼
Model
│
▼
Formulário
Essa separação proporciona uma arquitetura muito mais organizada.
55. Exemplo de implementação simplificada
Um cliente REST básico pode seguir este conceito:
procedure TApiClient.ConfigurarRequest(
ARequest: TRESTRequest
);
begin
ARequest.Params.Clear;
ARequest.Params.AddItem(
'Accept',
'application/json',
pkHTTPHEADER
);
ARequest.Params.AddItem(
'Content-Type',
'application/json',
pkHTTPHEADER
);
if FToken <> '' then
begin
ARequest.Params.AddItem(
'Authorization',
'Bearer ' + FToken,
pkHTTPHEADER
);
end;
end;
Agora todos os requests podem passar pela mesma configuração.
56. Consumindo APIs reais
Depois de entender os exemplos, você poderá utilizar a mesma estrutura para consumir APIs de:
- pagamentos;
- mapas;
- CEP;
- emissão fiscal;
- WhatsApp;
- bancos;
- e-commerce;
- transportadoras;
- serviços governamentais;
- sistemas internos;
- ERPs;
- CRMs;
- plataformas SaaS.
O princípio é sempre semelhante:
Request
↓
HTTP
↓
API
↓
Response
↓
JSON
↓
Delphi
O que muda é o contrato específico de cada API.
57. Conclusão
Consumir uma API REST no Delphi não precisa ser complicado.
Com os componentes:
TRESTClient
TRESTRequest
TRESTResponse
podemos realizar requisições HTTP e trabalhar com serviços externos de maneira bastante prática.
Entretanto, em aplicações profissionais, o mais importante não é apenas conseguir executar:
RESTRequest1.Execute;
É criar uma estrutura que seja:
- organizada;
- segura;
- reutilizável;
- testável;
- fácil de manter;
- preparada para crescer.
Para projetos pequenos, os componentes REST podem ser utilizados diretamente.
Para projetos maiores, uma arquitetura baseada em:
Form
↓
Service
↓
ApiClient
↓
REST API
é uma abordagem muito mais interessante.
Quando combinamos essa arquitetura com:
Delphi
+
REST API
+
JSON
+
HTTPS
+
Autenticação
+
MySQL/PostgreSQL
podemos construir aplicações modernas capazes de conversar com praticamente qualquer serviço que disponibilize uma API HTTP.
Perguntas frequentes
O Delphi consegue consumir API REST?
Sim. O Delphi possui componentes REST próprios, como TRESTClient, TRESTRequest e TRESTResponse, além de outras alternativas disponíveis no ecossistema.
Preciso instalar um componente externo para consumir REST?
Não necessariamente. Para muitas integrações, os recursos REST disponíveis no próprio Delphi são suficientes.
Delphi consegue trabalhar com JSON?
Sim. O Delphi possui classes para trabalhar diretamente com JSON, incluindo TJSONObject e TJSONArray.
Posso consumir uma API PHP usando Delphi?
Sim. Desde que a aplicação PHP disponibilize uma API HTTP, o Delphi pode consumi-la através de requisições REST.
Posso utilizar Bearer Token?
Sim. Um dos padrões mais comuns é enviar o token no header:
Authorization: Bearer TOKEN
Posso consumir API REST em aplicativo Android desenvolvido com Delphi?
Sim. A arquitetura precisa considerar as particularidades da plataforma, permissões, HTTPS, certificados e biblioteca HTTP utilizada.
É possível utilizar Delphi com uma API e MySQL?
Sim. Uma arquitetura comum é:
Delphi → API REST → MySQL
Nesse modelo, a aplicação Delphi não precisa acessar diretamente o banco de dados.
É melhor acessar MySQL diretamente ou através de API?
Depende da arquitetura do sistema. Uma API pode ser interessante quando existem múltiplos clientes, como desktop, mobile e web, porque centraliza regras de negócio, autenticação e acesso ao banco.
Posso colocar a URL da API diretamente no código?
Pode, mas para aplicações que possuem diferentes ambientes ou precisam de manutenção frequente, é melhor centralizar a configuração, por exemplo, em um arquivo INI ou outro mecanismo de configuração adequado.
Como tratar erros da API?
Verifique tanto os erros de comunicação quanto o código HTTP retornado e, quando disponível, interprete a estrutura de erro definida pelo contrato da API.
Resumo
Se você precisa lembrar apenas do essencial:
TRESTClient
+
TRESTRequest
+
TRESTResponse
↓
HTTP
↓
REST API
↓
JSON
E, para projetos maiores:
Form
↓
Service
↓
ApiClient
↓
REST API
↓
JSON
↓
Model
↓
Form
Essa separação é um excelente ponto de partida para construir integrações REST profissionais em Delphi.