Repository navigation
quick examples
Home > Primeiro servidor e cliente
Vale para a 1.1 em diante · Delphi e Lazarus · Nível: iniciante
Em uma frase: em 5 minutos, um programa que responde pong quando alguém
acessa http://localhost:8000/ping, e outro programa que faz essa pergunta.
Você vai precisar: o RAL instalado (Instalação) com o motor Indy (ou outro, veja a tabela no fim).
Não sabe o que é servidor, rota ou motor? Leia antes O que é o PascalRAL.
| Delphi | Lazarus | |
|---|---|---|
| Novo projeto | File > New > Console Application - Delphi |
Project > New Project... > Program |
| Ligar ao RAL | já está, pelo library path da instalação |
Project > Project Inspector > Add > New Requirement: pascalral e indyral
|
| Salvar |
File > Save All, numa pasta sua |
idem |
Apague tudo o que a IDE escreveu e cole. O mesmo código serve para os dois.
program PrimeiroServidor;
{$IFDEF FPC}{$MODE DELPHI}{$ENDIF}
{$APPTYPE CONSOLE}
uses
{$IFDEF UNIX}cthreads,{$ENDIF} // Linux: obrigatório, e sempre o primeiro
SysUtils,
RALServer, RALRequest, RALResponse, RALConsts, RALMIMETypes,
RALIndyServer; // o motor: troque aqui para usar outro
// o que a rota faz: responder "pong" em texto
procedure Ping(ARequest: TRALRequest; AResponse: TRALResponse);
begin
AResponse.Answer(HTTP_OK, 'pong', rctTEXTPLAIN);
end;
var
Servidor: TRALServer;
begin
Servidor := TRALIndyServer.Create(nil); // o motor, de novo
try
Servidor.CreateRoute('ping', Ping, 'responde pong'); // endereço /ping
Servidor.Port := 8000;
Servidor.Start;
WriteLn('No ar: abra http://localhost:8000/ping no navegador');
WriteLn('Tecle Enter para parar');
ReadLn;
finally
Servidor.Stop;
Servidor.Free;
end;
end.-
F9(Run). Abre uma janela preta com a mensagem "No ar". - No navegador, abra
http://localhost:8000/ping. Aparecepong. - Abra
http://localhost:8000/xyz: aparece um erro 404, porque essa rota não existe. - Volte à janela preta e tecle Enter para parar.
Na linha de comando, o mesmo teste: curl http://localhost:8000/ping.
Tip
O Windows pode perguntar se libera o programa no firewall. Para testar só na sua
máquina (localhost) não precisa liberar; para outro computador acessar, precisa.
Crie outro projeto console (no Lazarus, requisitos pascalral e indyral) e cole.
Deixe o servidor rodando.
program PrimeiroCliente;
{$IFDEF FPC}{$MODE DELPHI}{$ENDIF}
{$APPTYPE CONSOLE}
uses
{$IFDEF UNIX}cthreads,{$ENDIF}
SysUtils,
RALClient, RALResponse,
RALIndyClient; // o motor do cliente: precisa estar no uses
var
Cliente: TRALClient;
Resposta: TRALResponse;
begin
Cliente := TRALClient.Create(nil);
try
Cliente.EngineType := 'Indy'; // o mesmo nome do motor
Cliente.BaseURL.Text := 'http://localhost:8000';
Cliente.Get('/ping', Resposta); // pergunta e espera
try
WriteLn('Status: ', Resposta.StatusCode); // 200
WriteLn('Texto: ', Resposta.ResponseText); // pong
finally
Resposta.Free; // a resposta é sua: libere
end;
finally
Cliente.Free;
end;
ReadLn;
end.Troque as duas linhas marcadas "o motor" (e, no Lazarus, o requisito do projeto).
| Motor | Servidor (uses / classe) |
Cliente (uses / EngineType) |
|---|---|---|
| Indy |
RALIndyServer / TRALIndyServer
|
RALIndyClient / 'Indy'
|
| mORMot2 |
RALSynopseServer / TRALSynopseServer
|
RALSynopseClient / 'mORMot2'
|
| fpHTTP (só Lazarus) |
RALfpHTTPServer / TRALfpHttpServer
|
RALfpHTTPClient / 'fpHTTP'
|
| Sagui |
RALSaguiServer / TRALSaguiServer
|
— |
| NetHTTP (só Delphi) | — |
RALnetHTTPClient / 'netHTTP'
|
Qual escolher: Qual motor escolher?.
Num projeto com formulário, arraste da paleta RAL - Server um servidor (ex.:
TRALIndyServer), dê dois cliques em Routes no Object Inspector, adicione uma
rota, preencha Route com ping e dê dois cliques no evento OnReply.
Ou deixe o assistente montar o projeto (pacote RALWizard / ralwizardpack; na 2.0 🚧, RALWizardDsgn / ralwizarddsgn):
- Delphi:
File > New > Other... > Pascal RAL > Pascal RAL - Server Wizard - Lazarus:
Project > New Project... > Pascal RAL Application Wizard
Ele cria um servidor com janela, console ou CGI, já com a rota ping.
| O que aparece | Causa | O que fazer |
|---|---|---|
File not found: 'RALServer.dcu' / Can't find unit RALServer
|
o RAL não está no library path / no projeto |
Instalação; no Lazarus, o requisito pascalral
|
Could not bind socket / Address already in use
|
outro programa já usa a porta 8000 | troque Port para 8001, ou feche o outro programa |
| o navegador diz "não foi possível conectar" | o servidor não está rodando, ou a porta é outra | confira a janela preta e o número da porta |
| 404 | o endereço não bate com a rota | a rota é ping; o endereço, /ping
|
cliente: Engine Indy not found: the unit that registers it is not in the uses
|
a unit do motor não está no uses
|
acrescente RALIndyClient (ou a do seu motor) |
Mais casos: Problemas comuns.
-
Rotas e parâmetros:
/clientes/:id, GET e POST - Ler o pedido e responder: JSON, arquivos, cabeçalhos
- O cliente: enviar dados, em segundo plano, vários servidores
Começar
Servidor
- Rotas e parâmetros
- Ler o pedido e responder
- Plugins 🚧
- Autenticação
- Banco de dados (DBWare)
- Servir site e arquivos
- Swagger e Postman
- Servidor SOAP 🚧
- HTTPS
- Criptografia ponto a ponto
- Segurança para produção
- Colocar no ar
- Desempenho
Cliente
Motores
Avançado
Ajuda
- Problemas comuns
- Atualizar o Indy
- Várias versões do Delphi
- Vídeos e guias
- Módulos de terceiros
- Licenças
- Contribuir
- Roadmap e changelog
🚧 = em desenvolvimento, pode mudar