Tanto em aplicações Web quanto em sites, temos necessidade de criar interação com o usuário, seja recebendo informações dele através de formulários ou gerenciando como o conteúdo será exibido. 
As páginas e aplicações Web utilizam os métodos GET e POST para passagem de parâmetros e ambos têm formas distintas, mas muito simples de serem utilizadas.
Lidando com GET e POST
Vamos aproveitar nosso projeto já aberto e preparar uma ação que irá lidar com os métodos GET e POST, identificando-os e exibindo o valor de um parâmetro passado.
Selecione o WebModule, vá ao Object Inspector e em "Actions", crie uma nova Action com o name "acao2". No evento "OnRequest" dessa nova ação, insira o código a seguir:
procedure TFPWebModule1.acao2Request(Sender: TObject; ARequest: TRequest; AResponse: TResponse; var Handled: Boolean);
begin
     //tipo de resposta (header)
     AResponse.ContentType:= 'text/html';
     //checa como vieram os parâmetros
     if( LowerCase( ARequest.Method ) = 'get') then //via GET
       begin
            AResponse.Contents.Add( 'Rebebido método GET<br/>' );
            AResponse.Contents.Add( 'O valor do parâmetro é: ' );
            AResponse.Contents.Add( ARequest.QueryFields.Values['edtCampo'] );
       end
       else
       begin //via POST
            AResponse.Content:= 'Rebebido método POST<br/>';
            AResponse.Contents.Add( 'O valor do parâmetro é: ' );
            AResponse.Contents.Add( ARequest.ContentFields.Values['edtCampo'] );
       end;
     //informa o CGI de que a ação foi realizada
     Handled:= True;
end;
O código acima prepara a "acao2" para receber parâmetros por GET e POST, primeiro verificando o método utilizado e em seguida exibindo o valor do campo passado como parâmetro (estou assumindo que você já sabe a diferença entre ambos, pois senão terei que escrever demais para explicar). 
Assim, toda vez que a "acao2" do CGI for chamada, ela irá avaliar como a informação foi passada e, se um campo de nome (name no HTML) "edtCampo" for chamado, irá mostrar seu valor.
O leitor deve notar que a única diferença entre os comandos que carregam os valores de GET e POST são as propriedades "QueryFields" e "ContentFields" de ARequest respectivamente.
Compile o projeto e coloque na pasta 
cgi-bin (lembre-se de dar as permissões necessárias).
   
Recebendo dados de páginas HTML
Agora que sabemos como nosso CGI irá receber e tratar os dados vindos da URL e de formulários, vamos criar uma página HTML com dois formulários e um link comum. 
Esta página deverá ser colocada na raiz do seu site que, segundo nosso exemplo,  encontra-se em 
/var/www - como é apenas uma página HTML que vai chamar nosso CGI, não precisa ser colocada na pasta 
cgi-bin.
O código está comentado. Digite-o e salve a página como: 
chamaCGI.html
<html>
   <head>
       <title>Chamando CGI por GET e POST</title>
   </head>
 
   <body>
 
       <h3>Chamar por GET</h3>
    
       <form action="/cgi-bin/projeto/acao2" method="GET">
           <input type="text" name="edtCampo">
           <input type="submit" value="enviar por GET"/>
       </form>
      
       <hr/>
    
       <h3>Chamar por POST</h3>
      
       <form action="/cgi-bin/projeto/acao2" method="POST">
           <input type="text" name="edtCampo">
           <input type="submit" value="enviar por POST"/>
       </form>
       
       <hr/>
       <h3>Links usam GET</h3&ggt;
       <a href="/cgi-bin/projeto/acao2?edtCampo=Link clicado!">Clique aqui para acessar via GET</a>
   </body>
</html>
Agora abra seu navegador e acesse:
-  http://127.0.0.1/chamaCGI.html
Podemos agora testar cada um dos formulários da página e o link no final dela. Se tudo estiver OK, as respostas deverão ser aquelas que preparamos no CGI anteriormente. 
Deve-se observar que o nome do campo no HTML, especificado pelo parâmetro name, é o nome que será lido no CGI. Para cada campo que desejar pegar seu valor, deve haver uma identificação única (e de preferência, coerente).