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".http://localhost:8000/ping. Aparece pong.http://localhost:8000/xyz: aparece um erro 404, porque essa rota nãoNa 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?.
CreateNum 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):
File > New > Other... > Pascal RAL > Pascal RAL - Server WizardProject > New Project... > Pascal RAL Application WizardEle 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.
/clientes/:id, GET e POST