Vilarejo PK2P
Bem-vindo ao fórum Vilarejo PK2P! O fórum oficial do canal Press Key to Play do Youtube!

Grupo para reunir as pessoas que acompanham os vídeos no canal Press Key to Play e discutir os assuntos abrangidos pelo Blog PK2P.


Você não está conectado. Conecte-se ou registre-se

[tutorial] criar servidor http em delphi

Ir em baixo  Mensagem [Página 1 de 1]

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)



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



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:
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:
procedure TForm1.Button2Click(Sender: TObject);
begin
  IdHTTPServer1.Active := False;
end;



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:
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:
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:
<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>



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:
procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
  Memo1.Lines.LoadFromFile('.\' + ARequestInfo.Document);
  AResponseInfo.ContentText := Memo1.Lines.GetText;
end;



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:
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;



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



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

Ver perfil do usuário https://eofclub.in/forum

Voltar ao Topo  Mensagem [Página 1 de 1]

Permissão deste fórum:
Você não pode responder aos tópicos neste fórum