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
no evento OnClick do botão que vamos desligar o servidor, colocamos o Active do componente em false
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)
é necessario declarar tambem o idcontext em uses
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)
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)
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
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
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