criar servidor http em delphi

Discussão em 'Dicas e tutoriais' iniciado por kodo no kami, 11 Julho 2018.

  1. kodo no kami
    Offline

    kodo no kami Membro Conhecido

    Afiliado:
    16 Dezembro 2015
    Mensagens:
    228
    Sexo:
    Masculino
    Avaliações:
    +299 / -0
    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)

    [​IMG]

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

    [​IMG]

    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

    Código (Forge Crash):
    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

    Código (Forge Crash):
    procedure TForm1.Button2Click(Sender: TObject);
    begin
       IdHTTPServer1.Active := False;
    end;
    [​IMG]

    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)

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

    Código (Forge Crash):
    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)

    Código (Forge Crash):
    <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>
    [​IMG]

    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)

    Código (Forge Crash):
    procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext;
      ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
    begin
      Memo1.Lines.LoadFromFile('.\' + ARequestInfo.Document);
      AResponseInfo.ContentText := Memo1.Lines.GetText;
    end;
    [​IMG]

    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

    Código (Forge Crash):
    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;
    [​IMG]

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

    [​IMG]

    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
     
    • Gostei Gostei x 2
    • Top Top x 1
    • Informativo Informativo x 1

Compartilhe esta Página