O servidor Web de 4D permite recuperar os dados "enviados", ou seja, os dados introduzidos pelos usuários através dos formulários web e são enviados ao servidor sob os botões ou os elementos de interface, em modo POST ou GET.
O servidor web aceita várias URLs específicas que podem ser associadas com os botões de modo que o envio do formulário desencadeie o processamento do lado do servidor. Estas URLs se descrevem na seção Ações URL e Formulário.
Este capítulo trata os princípios implementados com o propósito de recuperar os dados que se encontram nos formulários que foram devolvidos ao servidor.
Quando enviar uma página HTML utilizando WEB SEND FILE ou WEB SEND BLOB, também pode associar as variáveis 4D com os objetos HTML no endereço “navegador web a 4D”. A associação funciona de ambas formas: quando tiver o formulário HTML é devolvido, 4D pode copiar os valores dos objetos HTML nas variáveis processo 4D. Visando a compilação do banco, estas variáveis devem ser declaradas no método COMPILER_WEB (ver o parágrafo mais adiante).
O comando WEB GET VARIABLES recupera os valores em forma de texto, enquanto os comandos WEB GET BODY PART e WEB Get body part count podem recuperar os arquivos publicados, utilizando BLOBs.
Nota de compatibilidad (4D v13.4): Nas versões anteriores, 4D copiava diretamente os valores das variáveis recebidas sob um formulário web publicado ou um URL GET, nas variáveis processo 4D (em modo compilado, estas variáveis tinham que ter sido declaradas na método COMPILER_WEB). Este funcionamento se elimina a partir de 4D v13.4, se mantém por compatibilidade das bases de dados convertidas, mas pode ser desativada mediante a opção de compatibilidade
Atribuição automática de variáveis na Página Compatibilidade das Propriedades da base (se recomenda desativar esta opção e utilizar os comandos WEB GET VARIABLES ou WEB GET BODY PART em suas bases).
Considere esta página de código HTML:
<html>
<head>
<title>Welcome</title>
<script language="JavaScript"><!--
function GetBrowserInformation(formObj){
formObj.vtNav_appName.value = navigator.appName
formObj.vtNav_appVersion.value = navigator.appVersion
formObj.vtNav_appCodeName.value = navigator.appCodeName
formObj.vtNav_userAgent.value = navigator.userAgent
return true
}
function LogOn(formObj){
if(formObj.vtUserName.value!=""){
return true
} else {
alert("Enter your name, then try again.")
return false
}
}
//--></script>
</head>
<body>
<form action="/4DACTION/WWW_STD_FORM_POST" method="post"
name="frmWelcome"
onsubmit="return GetBrowserInformation(frmWelcome)">
<h1>Welcome to Spiders United</h1>
<p><b>Please enter your name:</b>
<input name="vtUserName" value="<!--#4DTEXT vtUserName-->" size="30" type="text"></p>
<p>
<input name="vsbLogOn" value="Log On" onclick="return LogOn(frmWelcome)" type="submit">
<input name="vsbRegister" value="Register" type="submit">
<input name="vsbInformation" value="Information" type="submit"></p>
<p>
<input name="vtNav_appName" value="" type="hidden">
<input name="vtNav_appVersion" value="" type="hidden">
<input name="vtNav_appCodeName" value="" type="hidden">
<input name="vtNav_userAgent" value="" type="hidden"></p>
</form>
</body>
</html>
Quando 4D envia a página ao navegador, tem essa aparência:
![](../../picture/37886/pict37886.pt.png)
As principais caraterísticas desta página são:
- Inclui três botões Enviar: vsbEntrar, vsbRegistrar e vsbInformação.
- Quando clicar em Log On, o envio do formulário primeiro é processado pela função JavaScript LogOn. Se nenhum nome for introduzido, o formulário não é nem ao menos enviado a 4D e se mostra um alerta JavaScript.
- O formulário tem um método POST 4D e um script Submit (GetBrowserInformation) que copia as propriedades do navegador em quatro objetos ocultos cujos nomes começam por vtNav_App.
- O valor inicial do objeto vtNomeUsuário é <!--#4DTEXT vtNomeUsuário-->.
Examinemos agora o método 4D (chamado WWW_STD_FORM_POST que se chama quando o usuário clicar em um dos botões nos formulários HTML.
<p>
ARRAY TEXT($arrNames;0)
ARRAY TEXT($arrValues;0)
GET WEB FORM VARIABLES($arrNames;$arrValues)</p><p>
Case of
:(vsbLogOn#"")
QUERY([WWW Users];[WWW Users]User Name=vtUserName)
$0:=(Records in selection([WWW Users])>0)
If($0)
WWW POST EVENT("Log On";WWW Log information)
Else
$0:=WWW Register
End if
:(vsbRegister#"")
$0:=WWW Register
:(vsbInformation#"")
SEND HTML FILE("userinfos.html")
End case
As caraterísticas deste método são:
- Os valores das variáveis 4D vtNav_appName, vtNav_appVersiom, vtNav_appCodeName e vtNav_userAgent (associadas aos objetos HTML do mesmo nome) são recuperados pelo comando WEB GET VARIABLES a partir dos objetos HTML criados pelo script JavaScript GetBrowserInformation.
- As variáveis 4D vsbLogOn, vsbRegister e vsbInformation estão associadas aos três botões Submit. Note que estas variáveis são reiniciadas cada vez que a página se envia ao navegador. Quando o envio se realiza por um desses botões, o navegador retorna o valor do botão sobre o qual foi feito clique. Como as variáveis 4D são reinicializadas cada vez, assim a variável que já não for igual a string vazia indica em que botão clicar. As outras duas variáveis são strings vazias, não porque o navegador devolva strings vazias, mas porque o navegador não “disse” nada sobre elas; portanto, 4D deixa as variáveis sem mudanças. Por esta razão é necessário reiniciar estas variáveis todas as vezes que a página for enviada ao navegador.
Esta é a maneira de diferenciar qual botão Submit foi clicado quando existirem vários botões Submit na página web. Note que os botões 4D em um formulário 4D são variáveis numéricas. Entretanto, com HTML, todos os objetos são objetos texto.
Se associar uma variável 4D com um objeto SELECT, também associa uma variável texto. Em 4D, para testar qual elemento de uma lista drop down foi selecionado, você testa o valor numérico do array 4D. Com HTML, este é o valor do elemento selecionado que é devolvido na variável 4D associada ao objeto HTML.
Sem importar qual objeto está associado à variável 4D, o valor devolvido é de tipo Texto, de maneira que deve associar as variáveis 4D processo de tipo Alfa ou Texto.
A partir de 4D v15 R3, 4D Web Server integrado suporta os arquivos carregados na codificação de transferência fragmentada desde qualquer cliente Web. A codificação de transferência fragmentada é um mecanismo de transferência de dados especificado em HTTP/1.1. Permite que os dados sejam transferidos em una série de "pedaços" (partes) sem conhecer o tamanho dos dados finais.
Nota: o servidor web 4D também suporta a codificação de transferência fragmentada desde o servidor aos clientes Web (ver WEB SEND RAW DATA).
Para saber mais sobre a implementação do lado do cliente para transferências fragmentadas, consulte RFC7230 ou a página correspondente em Wikipedia.
O método COMPILER_WEB, se existir, é chamado sistematicamente quando o servidor HTTP receber uma requisição dinâmica e chama o motor 4D. Este é o caso, por exemplo, quando o servidor 4D Web receber um formulário postado ou uma URL contendo a ação 4DCGI. Este método foi feito para conter digitação ou inicialização de variáveis diretivas usadas durando trocas Web. É usada pelo compilador quando o banco de dados for compilado. O método COMPILER_WEB é comum a todos os formulários Web. Como padrão, o método COMPILER_WEB não existe. Deve explicitamente criar esse método.
Serviços web: o método de projeto COMPILER_WEB é chamado, se existir, para cada petição SOAP aceitada. Deve utilizar este método para declarar todas as variáveis 4D associadas com os argumentos SOAP entrantes e para todos os métodos publicados como Serviços web. Na verdade, o uso de variáveis processo nos métodos de serviços web necessita que sejam declaradas antes de chamar ao método. Para maior informação sobre este ponto, consulte a descrição do comando SOAP DECLARATION