[tutorial] criar servidor http em delphi

Postagem de conteúdo sobre programação pascal e delphi
Post Reply
User avatar
Kodo no Kami
Admin
Admin
Posts: 723
Joined: Fri Jan 02, 2015 1:56 pm
Contact:

[tutorial] criar servidor http em delphi

Post by Kodo no Kami » Wed Jul 11, 2018 12:09 am

e ae galera nesse tutorial vamos criar um simples servidor HTTP usando o delphi e a biblioteca indy (o delphi que estarei utilizando nesse tutorial sera o delphi 7 com a biblioteca indy atualizada ~ pode ser feito o mesmo em um delphi mais recente que ja tem a biblioteca indy atualizada). Para começar essa brincadeira toda vamos criar uma simples interface para ele, a interface sera composta por dois botões para ligar e desligar o servidor, um Edit para especificar a porta e um Memo para escrever o nosso codigo html (css e js)

Image

agora colocamos o componente do servidor http (IdHttpServer) que fica na aba "Indy Servers"

Image

vamos editar o evento OnClick do botão que vai ligar aquele servidor. Naquele evento temos que desligar o servidor caso ele já esteja rodando (isso evitaria rodar duas instancia do mesmo servidor e acabar dando algum tipo de erro), para fazer isso setamos False no atributo Active daquele componente (IdHTTPServer1.Active). Mudamos a porta no atributo DefaultPort (como o texto no edit é uma string e o atributo DefaultPort so aceita Integer usamos o metodo strtoint para converter). Por fim ligamos o servidor novamente com o Active

Code: Select all

procedure TForm1.Button1Click(Sender: TObject);
begin
   IdHTTPServer1.Active := False;
   IdHTTPServer1.DefaultPort := StrToInt(Edit1.Text);
   IdHTTPServer1.Active := True;
end;
no evento OnClick do botão que vamos desligar o servidor, colocamos o Active do componente em false

Code: Select all

procedure TForm1.Button2Click(Sender: TObject);
begin
   IdHTTPServer1.Active := False;
end;
Image

teoricamente o nosso servidor já esta pronto, só precisamos processar a requisição que vem do cliente e a resposta que volta para o cliente. Para fazer isso vamos usar o AResponseInfo e ARequestInfo que são passadas junto com o evento OnCommandGet do nosso componente IdHttpServer. Primeiro vamos enviar apenas o nosso html para o cliente, depois pensamos em uma forma melhor para manipular a requisição que vem do lado cliente para deixar o servidor mais dinamico. Para a gente simplesmente enviar o html usamos o atributo ContentText do AResponseInfo (nesse caso vamos passar o atributo Lines.GetText do Memo, é nele que vamos colocar o nosso html)

Code: Select all

procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
  AResponseInfo.ContentText := Memo1.Lines.GetText;
end;
é necessario declarar tambem o idcontext em uses

Code: Select all

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdTCPServer, IdCustomHTTPServer,
  IdHTTPServer, StdCtrls, idcontext;
se a gente compilar e rodar o programa, colocar um codigo html nele, depois ligar o servidor e entrar na pagina pelo navegador, vai funcionar normalmente como um servidor HTTP (tá, eu sei que não é um apache da vida, mais funciona ué kkk)

Code: Select all

<html>
<head>
<title>by kodo no kami</title>
</head>
<body><center>
<h1>pagina de teste</h1><hr>
<img src="https://i.imgur.com/fa3QGBF.png">
</center></body>
</html>
Image

através do ARequestInfo podemos pegar as passagens de metodos e outras informações que vem do lado cliente. O atributo Document retorna o path completo sem os parametros passados (get/post), então se a gente passa a seguinte url "http://192.168.1.1/kodo/pagina.html?id=123" ira retornar apenas "/kodo/pagina.html" (podemos utilizar desse recurso para carregar uma pagina especifica no computador e com isso deixar o nosso servidor mais dinamico), um exemplo seria pegar esse path carregar o arquivo no Memo e dele mandar para o cliente (obs: não estamos tratando os erros aqui nesse servidor, então se colocar uma pagina não existente vai retornar um erro)

Code: Select all

procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
  Memo1.Lines.LoadFromFile('.\' + ARequestInfo.Document);
  AResponseInfo.ContentText := Memo1.Lines.GetText;
end;
Image

para a gente ler alguma passagem de parâmetro usamos o atributo Params, sendo ele uma lista de strings (TStrings) onde cada passagem é uma linha separada. Um exemplo de uma pagina onde precisamos passar dois parametros "usu" e "sen" para permitir o acesso a uma pagina especifica, se a gente passar os parametros errados, nesse caso o usuario e a senha vamos parar em uma pagina

Code: Select all

procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var cont: Integer;
 usuario, senha, temp: string;
begin
  for cont := 0 to (ARequestInfo.Params.Count - 1) do
  begin
     temp := ARequestInfo.Params[cont];
     if(StrPos(PChar(temp),PChar('usu=')) <> '') then
     begin
        usuario := StrRScan(PChar(temp),'=') + 1;
     end;

     if(StrPos(PChar(temp),PChar('sen=')) <> '') then
     begin
        senha := StrRScan(PChar(temp),'=') + 1;
     end;
  end;

  if((usuario = 'kodo') and (senha = '123456')) then
  begin
    Memo1.Lines.LoadFromFile('./login/sim.html');
    AResponseInfo.ContentText := Memo1.Lines.GetText;
  end
  else
  begin
    Memo1.Lines.LoadFromFile('./login/nao.html');
    AResponseInfo.ContentText := Memo1.Lines.GetText;
  end;
end;
Image

se a gente passar os parametros corretos, vamos parar em uma outra pagina

Image

bom galera esse tutorial termina aqui porem, existem muitas coisas que ainda podemos fazer para melhorar esse servidor, como manipular os cookies e headers, gerar logs de acessos, chamar pelo delphi scripts como o php e retornar a saida, entre muitas coisas ^^

by kodo no kami
Image

que desagradavel ~ mirai kuriyama

Post Reply

Return to “Pascal / Delphi”