Desvendando o CGI com o Flagship
Através do FlagShip, que utiliza
linguagem igual à do Clipper,
é possível desenvolver os mais
diversos produtos para a Internet
Vamos falar um pouco sobre como colocar um site na Internet, interagindo
com as suas bases de dados do FlagShip. Praticamente todos que têm
acesso à Internet já visitaram algum site de procura ou um
banco comercial, e em alguns deles puderam observar que o endereço
é muito longo, como em:
cgi.netscape.com/cgi-bin/rlc
CONTENT_LENGTH=3D232 Æ Quantidade de dados de formulário =
contendo nome dos campos
CONTENT_TYPE=3Dapplication/x-www-form-urlencoded Æ O tipo de dad=
o
DOCUMENT_ROOT=3D/home/httpd/html Æ Diretório raiz f&iacut=
e;sico do domínio
HTTP_COOKIE=3DMEUCOOKIE=3DVALOR DO COOKIE Æ Todos os cookies par=
a o endereço separados por ;
HTTP_PRAGMA=3Dno-cache Æ Se a página ficará arquiv=
ada no cache do cliente
HTTP_REFERER=3D*http Æ //linux/cgi-bin/fsweb.cgi Æ De onde=
veio a requisição, sites de procura etc..
HTTP_USER_AGENT=3DMozilla/4.7 [en] (Win98; U) Æ Nome do browser =
do cliente,neste caso foi utilizado Netscape 4.7
QUERY_STRING=3Dvariable=3Djorge Æ Quais os dados que foram envia=
dos pela linha de comando
REMOTE_ADDR=3D200.0.0.2 Æ IP do cliente
REQUEST_METHOD=3DPOST Æ Tipo de requisição
REQUEST_URI=3D/cgi-bin/fsweb.cgi?variable=3Djorge Æ Linha de com=
ando sem o domínio e com as variáveis
SCRIPT_FILENAME=3D/home/httpd/cgi-bin/fsweb.cgi Æ Path completo =
do CGI
SCRIPT_NAME=3D/cgi-bin/fsweb.cgi Æ Path a partir do diretó=
;rio raiz do domínio sem variáveis
SERVER_ADMIN=3Dwebmaster@somers.com.br Æ E-mail do administrador=
SERVER_NAME=3Dlinux.somers Æ Nome do servidor
SERVER_PORT=3D80 Æ Porta 80 =3D HTTP, 443 =3D HTTPS
gi.cgi?URL=3Dwww.somers.com.br. Nesse exemplo está
nítido que o servidor da Netscape está executando um pr=
ograma que receberá o endereço www.somers.com.br. Já=
no caso de bancos comerciais como o Itaú, poderemos ver um endere=
ço como bankline.itau.com.br/GRIPNET/montTela.exe, e nesse caso &e=
acute; nítido que o servidor do Itaú está executando=
um programa externo ao servidor Web.
Esses dois exemplos escolhidos aleatoriamente têm
em comum apenas o fato de estarem executando um programa externo, mas =
o método utilizado difere em muitas coisas. No primeiro exemplo, o=
s dados são enviados na mesma linha do endereço, e o dado e=
nviado para o programa rlcgi.cgi é o URL, com o valor de www.somer=
s.com.br. Já no caso do Itaú os dados são enviados d=
e forma a não aparecerem na linha de endereço. Então=
como os dados são enviados?
Se você pedir para ver o fonte, verá que cada imagem tem =
um formulário específico que tem um campo chamado ID que n&=
atilde;o aparece na tela, que tem um dado diferente. Cada vez que voc&eci=
rc; executa um novo login, esse dado muda, por motivos de seguranç=
a, e é assim que o Itaú controla o acesso às contas =
correntes. Esta é uma forma segura e muito simples de se implement=
ar segurança e flexibilidade
em uma tela com várias opções.
Uma dúvida freqüente, quanto ao programa CGI, é se=
ele fica "rodando" no servidor. Não fica, ele é =
executado
a cada requisição de cada cliente, e o programa nã=
;o
"permanece rodando". Vejamos então como funciona:
=
1.Você pode iniciar o seu CGI de duas formas:
Por um HTML, com um formulário a ser enviado
ao servidor
Diretamente no CGI, caso em que precisa prever que pode have=
r uma requisição sem dados de formulário
2. Uma vez enviado o dado para o CGI o programa é iniciado e ca=
ptura as variáveis, se houver.
3. É gerado um HTML resposta, que vai existir apenas na
tela do cliente.
Fisicamente o HTML não existe, ou seja, não é gra=
vado arquivo temporário algum, o qual contém um outro formu=
lário para que o usuário possa continuar a navegar pelo pro=
grama.
4.O programa é encerrado
E esse processo se repete a cada requisição de cada clie=
nte.
Como você pode ver, o programa CGI não fica parado espera=
ndo alguma resposta de teclado. Em suma, o CGI é um programa que n=
ão interage diretamente com o cliente, mas sim com um servidor Web=
, e todas as suas saídas são direcionadas para o servidor W=
eb, e é possível enviar dados para impressoras (locais ou r=
edirecionadas pelo servidor), arquivos em disco, etc.
Então muito cuidado se você costuma utilizar a seguinte e=
strutura:
while .t.
@ 10,10 say "nome" get nome
read
if !empty(nome)
exit
else
alert("erro nome não preenchido")
loop
endif
enddo
SSL_CIPHER_ALGKEYSIZE=3D128 Æ Tamanho da chave de criptografia d=
o servidor
SL_CIPHER_EXPORT=3Dfalse Æ Se o browser do cliente é para=
exportação apenas, entende-se 40 bits apenas
SSL_CIPHER_USEKEYSIZE=3D128 Æ Neste caso estou usando um Netscap=
e com chave de 128 bits.
Pois essa estrutura não pode ser utilizada em um CGI.
Como é que o programa recebe os dados do formulário?
=
Agora que entendemos as formas de se enviar os dados para o programa, =
devemos entender mais alguns fatos sobre como o dado chega no programa. Q=
uando o cliente clicar sobre uma imagem ou botão, os dados s&atild=
e;o enviados para o servidor Web que se encarregará de disponibili=
zar todos os campos e seus valores, e mais alguns dados que poderemos uti=
lizar de várias formas, por exemplo: como verificador de cliente, =
no caso de utilizarmos LPs (Linhas Privativas), para verificar se estamos=
utilizando um servidor seguro etc.
Você pode ver na tabela 1 alguns dos dados de minha intranet no =
meu servidor Web juntamente com uma explicação resumida. =
P>
Se você está usando um servidor seguro (HTTPS) verá=
; também vários dados iniciados por SSL. Pode-se ver alguns=
desses dados na tabela 2
E os dados do formulário?
Para simplificar a explicação, esses dados são li=
dos diretamente do servidor Web pelo FS_WEB.
Então para facilitar o acesso a esses dados eu criei uma vari&a=
acute;vel somente para o FS_WEB, que se chama Content_String, uma alus&a=
tilde;o às variáveis Content_Lenght
e Query_String, que contém todos os dados do formulário =
enviado. Os dados contidos nessa variável são de difí=
;cil manuseio, pois todos os caracteres que não estão entre=
a/z, 0/9 ou A/Z, são substituídos pelo seu código h=
exadecimal, processo que é conhecido como "escape", e ca=
da campo é separado por & e cada conteúdo de vari&aacut=
e;vel inicia com =3D, como podemos ver abaixo:
CONTENT_STRING=3DEscondido=3D2345&Nome=3D&Endereco=3D &Lon=
gTexto=3DArea+definida%3A+6+linhas+30+colunas+ com+wrap+autom%E1tico+m%E1=
ximo+de+200+
caracteres&cTipoDanca_1=3DBSEG&cTipoDanca_2=3D
RTER&TESTE1=3DLISTA2&TESTE2=3DMLISTA1&TESTE3=3D
LISTA3&ticavel=3DcLing1& Check=3DDBASE
Com a biblioteca FS_WEB o processo de "unescape" (revers&at=
ilde;o de um "escaped string"), e de recuperação =
de dados, se torna totalmente transparente e muito simples como podemos v=
er na próxima página:
cgiconnect():Transfere todos os dados para o executável do Flag=
Ship getfield "op" at cOp:Transfere o valor do campo op do form=
ulário para a variável cOp.
E para simplificar mais ainda, os nomes dos campos do formulári=
o não são "case sensitive", ou seja, tanto faz se=
estão em caixa alta ou baixa, logo não se pode ter dois ca=
mpos no formulário com o mesmo nome. Exemplo:
Nome, nome.
Fato que seria totalmente aceitável se utilizássemos Jav=
aScript, pois para oJavaScript, nome e Nome são dois dados totalme=
nte diferentes.
Finalização de tags
O FS_WEB ajuda muito na simplificação do uso dos comand=
o de HTML, normalmente chamados de Tags, pois a linguagem utilizada &eacu=
te; bastante simplificada, mas a maioria dos recursos está contemp=
lada.
Exemplo: se desejamos apresentar um texto em itálico e negrito =
com letras vermelhas escrevemos:
SAY TEXT "BOM DIA" NEGRITO ITALICO COLOR NS_RED
ou
SAY TEXT "BOM DIA" BOLD ITALIC COLOR NS_RED
a ordem dos atributos não tem importância alguma, e o res=
ultado na tela será:
BOM DIA
E o FS_WEB enviou:
<FONT COLOR=3D"#FF0000"><B><I>BOM DIA</I>=
</B></FONT>
Como você pode ver não foi necessário se preocupar=
com a finalização de cada um dos atributos, pois neste cas=
o o FS_WEB faz isto por você. Já em outros casos isto se tor=
na muito mais fácil pois é utilizada a sintaxe Begin / End =
veja abaixo:
BEGIN TABLE BORDER 0 ALIGN CENTER WIDTH "100%"
BGCOLOR NS_BLUE
CELLPADDING 0 CELLSPACE 0
BEGIN ROW
BEGIN DATA ALIGN CENTER
MENU LINK "MENU" MENU "Main" ONCLICK=
END DATA
END ROW
END TABLE
Geração de gráficos
Também a geração de gráficos tornou-se mu=
ito simples com o uso do FS_WEB, pois nele incorporei uma rotina que faz=
todos os cálculos quase automaticamente. No exemplo abaixo, apena=
s gráficos de barras verticais estão contemplados.
BEGIN GRAPH g1 size 300,200
GRAPH DATA 124,138,216,143,256,302
GRAPH DATA 201,234,340,210,314,320
GRAPH ATRIBUTES STACKED
GRAPH ATRIBUTES SCALE "50"
GRAPH ATRIBUTES TITLE "Meu primeiro gráfico"=
P>
GRAPH ATRIBUTES XLABEL "Horizontal"
GRAPH ATRIBUTES YLABEL "VERTICAL"
GRAPH ATRIBUTES TIME "20:23"
GRAPH ATRIBUTES LEGEND "Peixe voador",
"Total pescado"
END GRAPH
Este código resultará no seguinte gráfico:
É possível utilizar um código JavaScript?
Sim, é possível e muito simples, desde que você te=
nha algum conhecimento dessa linguagem. No exemplo abaixo, você pod=
e ver como fazer para que, ao se alterar um dado do formulário, el=
e seja procurado na base de dados e seja emitido um alerta no caso de j&a=
acute; estar cadastrado, tudo isto feito em uma segunda janela, que n&ati=
lde;o tem menu, barra de navegação etc. Veja tabela 3.
Na linha Get name Size 30 Maxlen 30 Onchange
testname() é gerado um código HTML. Ao ser feita alguma =
alteração nesse campo, será executada a funç&=
atilde;o testname(), que está logo acima.
A função testname() não abrirá uma nova ja=
nela se o nome estiver vazio, senão será criada uma nova ja=
nela (nova=3Dwindow.open(... ) e nela será criado um novo formul&a=
acute;rio que será enviado para o CGI automaticamente document.tes=
te.submit()), somente então o CGI irá processar a verifica&=
ccedil;ão da requisição.
Todo esse processo pode parecer muito lento, mas apesar de muitos de n=
ós não termos um link de mais de 56kbps, isto fica muito r&=
aacute;pido, desde que:
1. As telas resultantes não contenham mais de trezentos registr=
os com quatro ou cinco colunas.
2. Não existam tabelas muito grandes.
Outro fato que torna a velocidade de resposta muito boa, é que =
no caso do Linux, a resposta gerada pelo CGI é enviada diretamente=
para o cliente, ao contrário de outros sistemas operacionais que =
geram um arquivo intermediário para depois enviá-lo ao clie=
nte.
Veja no site o código completo desse exemplo no arquivo FSWEBCA=
D.PRG.
say SCRIPT ;
"function testname() {"+CRLF+" var retval =3D false=
"+CRLF+
"if (document.adddata.name.value.length=3D0) {"+CRLF+&qu=
ot;retval =3D false "+CRLF+"}"+CRLF+;
"else { "+CRLF+"document.adddata.name.focus()"=
+CRLF+;
"nova=3Dwindow.open(,erro,toolb=
ar=3D0,location=3D0,directories=3D0,status=3D1,menubar=3D0,scrollbars=3D1=
,;
resizable=3D1,width=3D350,height=3D100,dependent=3Dno,screenX=3D44=
0,screenY=3D20')"+CRLF+;
" nova.document.write(<body>)"+CRLF+=
;
" nova.document.write(<form name=3Dteste method=3D=
post action=3D/cgi-bin/cad.sh>)"+CRLF+;
" nova.document.write(<input type=3Dhidden name=3D=
op value=3Dshowname>)"+CRLF+;
" nova.document.write(<input type=3Dhidden name=3D=
name>)"+CRLF+;
" nova.document.write(</form>)"+CRLF=
+;
" nova.document.teste.name.value=3Ddocument.adddata.name.va=
lue"+ CRLF+;
" nova.document.write(<script>)"+CRL=
F+;
" nova.document.write(document.teste.submit())&=
quot;+CRLF+;
" nova.document.write(</script>)"+CR=
LF+;
" nova.document.write(</body>)"+CRLF=
+;
" }"+CRLF+;
"return retval"+CRLF+;
"}"+CRLF
begin form "adddata" action "/cgi-bin/cad.sh" =
hidden "op" value "adddata"
GET name SIZE 30 MAXLEN 30 ONCHANGE testname()
Outras perguntas comuns que envolvem transações via Inte=
rnet:
É possível utilizar o FS_WEB para e-commerce?
Sim, certamente que sim, mas lembre-se de que para realizar transa&cce=
dil;ões com número de cartões de crédito &eac=
ute; necessário dispor de um servidor com o que costumamos chamar =
de "site seguro", o que independe do FS_WEB e tem a ver s&oacu=
te; com seu servidor Web. Para se ter o que melhor nível de segura=
nça, é aconselhável utilizar o módulo ssl do =
apache (mod_ssl), que pode ser encontrado em www.modssl.org, o que permit=
e a instalação de um site com até 128 bits de cripto=
grafia, com uma chave a ser comprada de qualquer provedor de chave de cri=
ptografia como VeriSign e muitos outros. Não utilize a chave de de=
monstração, ela não é realmente segura, ela i=
mita a segurança de 128 bits.
Chave 128bit para o Netscape?
Para que o seu Netscape tenha um maior nível de criptografia ut=
ilize o programa Fortify (www.fortify.net). Ele eleva seu Netscape para u=
m nível de segurança maior. Não é ilegal mesm=
o para os que não moram nos Estados Unidos, mas é sempre bo=
m verificar se sua empresa permite que você utilize uma chave de 12=
8 bits. Se você está utilizando o Netscape que veio com o Li=
nux-Conectiva 4.0 não é necessário utilizar o Fortif=
y pois já está atualizado. Antes de baixar o programa, veri=
fique se o seu Netscape já não está fortificado?! &E=
acute; só utilizar o menu do Netscape em Help Æ About se ap=
arecer na tela algo como: This version supports U.S. Security with RSA Pu=
blic Key Cryptography, MD2, MD5, RC2-CBC, RC4,DES-CBC, DES-EDE3-CBC, o Ne=
tscape já está fortificado.
Caso você tenha alguma dúvida, dica ou comentário =
não deixe de nos enviar para que esta coluna traga sempre novidade=
s para todos.
Veja este programa sendo executado na Internet em www.somers.com.br =
151; em FS_WEB Æ Demonstração 2.