Este artigo descreve principalmente como fazer o DELPHI e a Internet funcionarem juntos. Duas tecnologias especializadas serão detalhadas neste artigo:
WININET: Construir programas clientes FTP, HTTP e Gopher ISAPI: Expandir os serviços de informação da Internet, por exemplo, obter informações no servidor e exibi-las no navegador.
No mundo da informática de hoje, uma enorme tendência de desenvolvimento foi desencadeada devido à estratégia da Microsoft para a Internet. aqueles que fazem
Os dias de CGI (Common Gateway Interface) e ferramentas de terceiros, mesmo para as ferramentas mais básicas da Internet, finalmente acabaram. Sempre haverá necessidade de ferramentas sofisticadas de terceiros, mas agora os programadores encontrarão a vasta gama de ferramentas da Internet de que precisam incorporadas ao sistema operacional. Em suma, sem investimento adicional, você pode usar os recursos gratuitos do DELPHI para:
*Desenvolver navegador WEB
*Execute FTP, HTTP e Gopher entre dois aplicativos DELPHI ou um aplicativo DELPHI e TCP
(Transmission Control Protocol) opera TCP entre servidores
Porque o DELPHI pode facilmente chamar a API do Windows e suporta OCX/ActiveX, a nova estratégia da Microsoft
A estratégia se encaixou perfeitamente em nosso plano. A Microsoft produz ferramentas e os programadores DELPHI colhem os frutos!
O que há neste artigo?
Este artigo contém três partes principais e algumas partes pequenas, com três temas principais:
*Encontre os materiais: A documentação técnica mencionada neste artigo está disponível lá e inclui uma breve descrição do hardware e software necessários para executar o código deste artigo.
*ISAPI: Como usar ISAPI
*WININET: Como usar o WININET
Na maioria dos casos, as seções ISAPI e WININET neste artigo são completamente independentes e você pode escolher a ordem em que as lerá.
Encontre informações, requisitos de hardware e software
Você precisará de uma cópia do Microsoft Windows NT 3.51 Server ou do NT 4.0 Server, que deverá vir acompanhada da documentação do Internet Information Services, pois precisará compreender as tecnologias nele mencionadas. Este documento deve ser incluído no NT Server4.0 e os usuários do NT 3.51 podem baixá-lo no site da Microsoft. Para executar o Windows NT, a configuração mínima da sua máquina deve ser compatível com 486 e 20 MB ou mais de memória.
Você deve ter outro computador com navegador instalado. Para que a parte ISAPI deste artigo funcione sem problemas, o segundo
A máquina deve ser capaz de executar todos os softwares compatíveis com navegadores da web. Se a sua máquina estiver executando o Windows 95 ou Windows NT
Então, o trecho de código WININET neste artigo funcionará melhor. Qualquer navegador qualificado pode ser usado neste ambiente técnico.
Nas versões do Delphi 2.0 e superiores lançadas após junho de 1996, existem as ferramentas necessárias para conectar o Delphi à Internet.
quase todos os recursos.
Se você não possui a versão mais recente do Delphi [Nota: o autor aqui se refere à versão 2.0 (tradutor)], então você precisa deste artigo
Os arquivos especiais mencionados no arquivo, todos disponíveis quase gratuitamente na World Wide Web [Nota: Se você estiver usando Delphi2.0 ou superior, você não tem permissão para considerar (Tradutor)]. Todas as técnicas mencionadas neste artigo podem funcionar perfeitamente no ambiente Delphi2.0, mas podem não funcionar perfeitamente no ambiente Delphi de 16 bits.
Caso precise baixar informações da World Wide Web, o link é: http://www.borland.com/TechInfo/delphi/i
index.html
[Nota: não existe mais! :-(( (Tradutor)]
A nova versão do Delphi2.0 vem com o documento WININET.PAS. Se a sua cópia não o contiver, então a acima.
O World Wide Web Node pode fornecer isso para você. WININET.PAS inclui uma lista de variáveis, funções, tipos e propriedades projetadas para estender o Microsoft Windows Internet. Isso significa que você pode adicionar facilmente suporte a FTP, HTTP e Gopher aos seus aplicativos. O WININET.DLL da Microsoft é distribuído gratuitamente. Se não estiver no diretório Windows/System ou Windows/System32, você pode obtê-lo na Microsoft. Aqui está o nó da World Wide Web onde o arquivo de ajuda da janela WININET.H está disponível:
http://www.microsoft.com/intdev/sdk/docs/wininet/default.htm [Nota: parece que não está mais disponível! : -( (Tradutor)]
De modo geral, a página inicial online dos Microsoft Internet Developers é a parte INTDEV do nó da Microsoft.
Além do WININET e do ICP, outra tecnologia importante suportada pelo Delphi é o ISAP. Conforme declarado na documentação corporativa da Microsoft
Conforme descrito, essa tecnologia permite "'escrever' scripts do lado do servidor e filtrar scripts, estendendo assim os Serviços de Informações da Internet da Microsoft e outros serviços da Web ISAPI".
Se precisar encontrar uma descrição sobre ISAPI, você pode acessar:
http://www.microsoft.com/intdev/sdk/servapi.htm [Nota: Deus o abençoe! ;-) (Tradutor)]
No final deste artigo, uma cópia do documento chave ISAPI denominado HTTPEXT.PAS está anexada.
O Internet Control Pack (ICP) lançado gratuitamente pela Microsoft é um conjunto de controles OCX/ActiveX que você pode usar no Delphi
Arraste e solte-os no aplicativo (o Delphi 2.0 inclui esses controles). Eles fornecem suporte imediato para a criação de aplicações Delphi e sabem navegar na web, usar FTP, WINSOCK e outras tecnologias da Internet. Se sua cópia do Delphi não contém esses controles, você deve adicionar esses documentos ao diretório Lib no diretório onde o Delphi está localizado antes de usá-los. Os documentos estão localizados no site INDEX.HTML da Borland no link mencionado acima. Não mencionei os controles ICP neste artigo, mas qualquer pessoa interessada nesta tecnologia deve definitivamente confirmar que possui esses
Uma cópia do controle.
Você pode baixar meus arquivos de aplicativos Pascal em meu site, seus nomes são STRBOX.PAS e MATHBOX.PAS.
Seria benéfico verificar este site frequentemente para atualizações das informações mencionadas neste artigo.
Aqui presumo que o leitor esteja familiarizado com Delphi e Object Pascal, e que o leitor esteja familiarizado com Internet, HTML,
Ter um conhecimento básico de navegadores e servidores da World Wide Web.
ISAPI
ISAPI é uma tecnologia fácil de usar, porém poderosa, que permite ampliar os recursos dos serviços de informações da Internet.
Esta tecnologia vem com o Windows NT 4.0 e permite criar sites WEB, FTP e GOPHER em seu servidor. Ao mesmo tempo, esta tecnologia é compatível com WindowsNT3.51 Server [Nota: refere-se à versão do servidor, a outra versão é a versão da estação de trabalho (tradutor)].
No passado, a melhor maneira de dimensionar um servidor web era construir aplicações CGI. São ferramentas poderosas, mas também são
Limitado pelo seu formato de execução [Nota: Por exemplo, PERL é interpretado e executado (tradutor)]. Quando você faz uma solicitação baseada em CGI ao servidor a partir de um navegador, o aplicativo CGI provavelmente será forçado primeiro a entrar na memória, o que consumirá muito tempo. Além disso, em algumas circunstâncias, a tecnologia CGI parece ser um pouco mais difícil de utilizar.
ISAPI é um método de substituição de aplicativos CGI escrevendo DLLs [Nota: Dynamic Link Program (Translator)]. Você também pode
É possível escrever texto filtrado através de ISAPI, mas não mencionarei esta tecnologia neste artigo. Comparado ao CGI, o ISAPI é mais fácil de usar, é mais rápido e faz melhor uso dos recursos do sistema. Nos pontos a seguir, explicarei em detalhes por que as DLLs ISAPI são melhores que os aplicativos CGI:
As DLLs ISAPI estão localizadas no mesmo endereço do serviço HTTP, portanto, podem acessar o serviço HTTP diretamente do servidor. Comparados aos aplicativos CGI, eles podem carregar na memória mais rapidamente; quando fazem uma solicitação no servidor, exigem menos tempo de pausa [Nota: refere-se ao tempo entre fazer uma solicitação e receber uma resposta do servidor (Tradutor)] Muito. Isto é ainda mais importante quando o servidor está sob carga pesada.
Você pode controlar quando as DLLs são carregadas e descarregadas. Por exemplo: você pode pré-carregar DLLs na primeira solicitação quando;
Descarregue as DLLs do aplicativo ISAPI quando elas não estiverem em uso para liberar recursos do sistema.
Como mencionado anteriormente, você pode usar ISAPI para escrever texto filtrado [Nota: geralmente se refere a scripts na estrutura C/S (tradutor)], mais
De acordo com a documentação da Microsoft, você pode filtrar texto via ISAPI para fazer o seguinte:
Esquema de autorização do usuário
compressão
criptografia
Conecte-se
Análise de tráfego ou outra análise de solicitação (por exemplo, procurar solicitações em "....etcpassWord")
Neste artigo, focarei em como escrever DLLs que retornam conjuntos de dados ou como interagir com usuários que executam navegadores.
Faça um contato simples.
Noções básicas de ISAPI
O arquivo HTTPEXT.PAS contém instruções-chave para usar ISAPI. Este documento deverá acompanhar o
Versão Delphi distribuída. Ele também pode ser encontrado no site da Borland, anexado à seção ISAPI deste artigo. Como isso é baseado na tecnologia NT, você deve usar Delphi2.0 ou superior para aplicar esta tecnologia. Você não pode usar isso em um editor de 16 bits.
HTTPEXT.PAS contém a interface da tecnologia ISAPI criada pela Microsoft [Nota: refere-se à interface Delphi, ISAPI é compilado em C++
escrita (tradutor)]. Ao escrever Delphi, não há interface de usuário ISAPI fornecida. Descreverei apenas como usar a tecnologia existente da Microsoft. Entretanto, ISAPI é muito fácil de usar e, para a maioria dos usuários, a versão do objeto Delphi do usuário não é necessária.
Existem três funções que podem ser usadas como entradas para DLLs ISAPI. As duas primeiras são obrigatórias e a terceira é opcional.
GetExtensionVersion: Verifique a versão mínima
HttpExtensionPRoc: Este é o ponto de entrada da DLL, assim como o bloco inicial...final em uma aplicação Delphi
TerminateExtension: Este é um programa opcional que pode ser usado como thread para limpar outras alocações de memória.
Ao criar uma DLL ISAPI, você deve fazer referência às duas primeiras das três funções listadas acima, execute este
Duas funções são a chave para toda a programação ISAPI.
Todas as três instruções contêm "saída de palavra", um termo usado porque as DLLs ISAPI estendem os Serviços de Informações da Internet
dispositivo. (Lembre-se, Internet Information Server refere-se ao Microsoft Server. Se você deseja usar um servidor NT como um servidor web físico, então esta é exatamente a ferramenta que você precisa. DLLs ISAPI são distribuídas com NT4.0 e são instaladas durante a instalação do sistema operacional . é instalado automaticamente.)
ISAPI fornece um padrão que os servidores de produção podem seguir. Por exemplo, pode usar a complexa interface NSAPI do Netscape
Compactado no ISAPI conciso e bonito relevante para operar a interface NSAPI.
A seguir está a declaração dessas duas funções importantes
função GetExtensionVersion (var Ver: THSE_VERSION_INFO): BOOL;
função HttpExtensionProc(var ECB: TExtensionControlBlock): DWORD;
Basta colar GetExtensionVersion em suas DLLs e pronto. Você só precisará fazer pequenas alterações quando a ISAPI lançar novas versões ao público.
função GetExtensionVersion (var Ver: THSE_VERSION_INFO):
BOOL;
começar
Ver.dwExtensionVersion := $00010000; // suporte 1.0
Ver.lpszExtensionDesc := 'DLL Delphi 2.0 ISAPI';
Resultado := Verdadeiro;
fim;
O parâmetro passado para esta função é declarado em HTTPEXT.PAS da seguinte forma:
Os parâmetros relevantes são declarados em HTTPEXT.PAS da seguinte forma:
PHSE_VERSION_INFO = ^THSE_VERSION_INFO;
THSE_VERSION_INFO = registro compactado
dwExtensionVersion: DWORD;
lpszExtensionDesc: array[0..HseMaxExtDLLNameLen-1] de Char;
fim;
A constante HseMaxExtDllNameLen possui um valor de 256 na declaração. As duas variáveis no registro são "autodeclaradas". A primeira contém o número da versão ISAPI [Nota: a variável dwExtensionVersion (Tradutor)] e a última representa uma string definida pelo usuário usada para descrever DLLs.
Ao fazer referência à instrução GetExtensionVersion, você deve adicionar entrada à seção do arquivo DPR do seu programa DLL.
parte de fora. Ao escrever esta declaração, você também deve escrever:
exportações
GetExtensionVersion
HttpExtensionProc;
Isto é o que você faz ao configurar funções para essas duas DLLs ISAPI importantes. A próxima etapa, usar HttpExtensionProc, é um pouco mais complicada, então deixarei isso em uma seção separada.
Trabalhando com HttpExtensionProc
A instrução HttpExtensionProc é o ponto de entrada da DLL. Sua função é como a instrução main() na linguagem C, ou
A parte inicial...final no Delphi
Aqui está um exemplo simples usando a instrução GetExtensionVersion
função HttpExtensionProc(var ECB: TExtensionControlBlock):
DWORD;
var
ResStr: string;
StrLen: Inteiro;
começar
ECB.lpszLogData := 'Log DLL Delphi';
ECB.dwHTTPStatusCode := 200;
ResStr := ' +
'
'Olá do ISAPI
' +
';
ResStr := Formato(
'HTTP/1.0 200 OK'#13#10+
'Tipo de conteúdo: texto/html'#13#10+
'Comprimento do conteúdo: %d'#13#10+
'Conteúdo:'#13#10#13#10'%s'
[Comprimento(ResStr)
ResStr]);
StrLen := Comprimento(ResStr);
BCE.WriteClient(ECB.ConnID
Ponteiro (ResStr)
StrLen
0);
Resultado:=HSE_STATUS_SUCCESS;
fim;
Se você fizer uma solicitação a esta DLL durante a navegação, receberá uma resposta como esta:
Resultados do servidor de teste
Olá do ISAPI
A maioria dos campos no corpo da função está intimamente relacionada ao código HTML simples que fornece informações básicas. Você também precisa preencher alguns campos no TExtensionControlBlock conforme mostrado abaixo.
Observe que há um ponteiro de função chamado WriteClient neste registro. Você pode consultar esta função para passar informações.
Envie de volta para o navegador. Ao chamar esta função, você usa o campo ConnID no bloco TExtensionControl mencionado abaixo. Quando a função é chamada, o ConnID é preenchido automaticamente para você.
Antes de examinar o código da função, deixe-me demonstrar para você todas as funções HttpExtensionProc mencionadas acima
Programa completo de ISAPI DLL
biblioteca Isapi1;
biblioteca Isapi1;
usa
Windows
SysUtils
HTTPExt;
função GetExtensionVersion (var Ver: THSE_VERSION_INFO): BOOL;
começar
Ver.dwExtensionVersion := $00010000; // Esperamos suporte à versão 1.0
Ver.lpszExtensionDesc := 'Escrito em Delphi 2.0';
Resultado := Verdadeiro;
fim;
função HttpExtensionProc( var ECB: TEXTENSION_CONTROL_BLOCK ): DWORD;
chamada padrão;
var
ResStr: string;
StrLen: Inteiro;
começar
ECB.lpszLogData := 'Log DLL Delphi';
ECB.dwHTTPStatusCode := 200;
ResStr := '
' +
'
Resultados do servidor de teste
' +
'
Isapi diz olá para DevRel
';
ResStr := Formato(
'HTTP/1.0 200 OK'#13#10+
'Tipo de conteúdo: texto/html'#13#10+
'Comprimento do conteúdo: %d'#13#10+
'Conteúdo:'#13#10#13#10'%s'
[Comprimento(ResStr)
ResStr]);
StrLen := Comprimento(ResStr);
BCE.WriteClient(ECB.ConnID
Ponteiro (ResStr)
StrLen
0);
Resultado:=HSE_STATUS_SUCCESS;
fim;
exportações
GetExtensionVersion
HttpExtensionProc;
começar
fim.
Para executar este programa DLL, você deve copiá-lo para o diretório de scripts em seu servidor NT. Na minha máquina NT4.0
É assim:
c:winntsystem32inetsrvscriptsmystuffisapi1.dll
Neste exemplo eu criei meu diretório chamado "mystuff"
É usado apenas para armazenar o que eu criei
DLL ISAPI. Seu diretório, é claro, não será exatamente o mesmo da minha máquina, dependendo da localização do seu diretório "inetsrv" e de outros fatores.
Para chamar esta DLL com sucesso, você deve adicionar este hiperlink à sua página HTML:
ISAPI Um
Quando o usuário clicar neste hiperlink, a DLL ISAPI1 será chamada, e então a string "Hello from ISAPI" será exibida
exibido no navegador do usuário. Se você não colocar ISAPI.DLL no diretório mystuff, deverá modificar o código HTML acima para adaptá-lo à sua situação. Observe que seu diretório deve ser relativo ao diretório inetsrv e não deve, e não pode, conter o diretório onde toda a sua DLL está localizada.
Aqui está o script HTML completo da chamada:
Esta é a página inicial do meu computador doméstico.
ISAPI Um
Observe que se você copiar o programa ISAPI1.DLL para o diretório mystuff várias vezes, deverá
Feche a porta World Wide Web do servidor web. Isso porque, na primeira vez que você copia essa DLL, você fica livre de restrições, mas depois ela passa a pertencer ao servidor. Portanto, ao copiar a versão atualizada da primeira cópia, você deve desabilitar o serviço World Wide Web. Você pode usar um programa de gerenciamento de rede para desativar o serviço World Wide Web. Este programa deve estar no grupo Microsoft Internet Server e ser instalado no Explorer/Program Manager ao instalar o Network Information Services.
Funciona com TExtensionControlBlock
Com este ponto deste artigo, você poderá construir sua primeira DLL ISAPI e executá-la online em uma segunda máquina.
O navegador da web chama isso.
O restante do ISAPI será mais detalhado neste artigo.
Aqui está a parte mais complicada dos parâmetros HttpExtensionProc
PExtensionControlBlock = ^TExtensionControlBlock;
TExtensionControlBlock = registro compactado
cbSize: DWORD; // = sizeof(TExtensionControlBlock)
dwVersion: DWORD; // informações da versão desta especificação
ConnID: HCONN; // Contexto Não modifique!
dwHttpStatusCode: DWORD; // Código de status HTTP
// informações de log terminadas em nulo específicas para esta DLL de extensão
lpszLogData: matriz [0..HSE_LOG_BUFFER_LEN-1] de Char;
lpszMethod: PChar; // REQUEST_METHOD
lpszQueryString: PChar; //QUERY_STRING
lpszPathInfo: PChar; // PATH_INFO
lpszPathTranslated: PChar; // PATH_TRANSLATED
cbTotalBytes: DWORD; // Total de bytes do cliente
cbAvailable: DWORD; // Número disponível de bytes
lpbData: Ponteiro; // ponteiro para bytes cbAvailable
lpszContentType: PChar; // Tipo de conteúdo dos dados do cliente
GetServerVariable: TGetServerVariableProc;
WriteClient: TWriteClientProc;
ReadClient: TReadClientProc;
ServerSupportFunction: TServerSupportFunctionProc;
fim;
Observe que este registro contém o campo ConnID mencionado acima e passa o primeiro parâmetro para WriteClient.
O primeiro parâmetro neste registro é para controle de versão. Deve ser o tamanho do TExtensionControlBlock especificado. Se a Microsoft alterar sua estrutura, ela poderá determinar com qual versão da estrutura está lidando, verificando o tamanho do registro. Você nunca deseja os três primeiros campos deste registro, eles já foram preenchidos pelo ISAPI e só podem ser acessados, e não alterados, em seu programa.
Provavelmente o campo mais importante neste registro é lpszQueryString, que contém a solicitação do servidor
Informação. Por exemplo, suponha que você criou um arquivo chamado ISAPI1.Dll. Para chamar esta DLL, você cria um HREF como este [Nota: um formato em linguagem HTML (tradutor)] em uma página do seu navegador:
Teste um
Se você quiser responder a esta DLL, você precisa alterar a linha acima assim:
Teste um
Se o trecho de código HTML contiver algo como a segunda das duas linhas acima, sua DLL terá o parâmetro lpszQueryString
Obtenha a string de "MyQuery", preste atenção especial ao uso do sinalizador de solicitação após a string de solicitação.
Claro, você pode alterar a string da solicitação como quiser. Por exemplo, você pode escrever:
Teste um
Nesta solicitação, esta DLL responderá com o nome do servidor. Você não está sujeito a nenhuma restrição ao passar este parâmetro. você
Você pode passar o que quiser e cabe a você decidir como deseja analisar as informações na DLL.
Ao retornar informações do servidor para o navegador, você usa o ponteiro da função "WriteClient" neste registro
. Você não precisa fazer nada ao inicializar esse ponteiro; ele é automaticamente passado para você pelo servidor de informações da rede.
Os autores de aplicações CGI notarão que a sintaxe para passar strings de solicitação é muito familiar. Na verdade, o ISAPI seguiu o CGI
Tal como acontece com a maioria das convenções, a maioria dos campos em TExtensionControlBlock podem simplesmente ser emprestados pela tecnologia CGI.
Outro campo-chave em TExtensionControlBlock é lpbData, que contém informações adicionais enviadas para você durante a navegação.
Por exemplo, se você possui um formulário HTML com vários campos, as informações contidas nesses campos serão chamadas de "
lpData". O próximo tópico deste artigo, "Obtendo informações do botão 'OK'", se concentrará em como lidar com essa situação.
Até agora, apresentei os quatro campos principais em TExtensionControlBlock:
WriteClient: um ponteiro que permite passar dados HTML formatados para o navegador. Esta função é usada
Campo ConnID de TExtensionControlBlock.
lpszQueryString: a solicitação vinda do navegador.
lpbData: dados adicionais enviados para você a partir do navegador. Geralmente o conteúdo de qualquer campo em um formulário HTML
. Discutirei isso mais detalhadamente na seção "Botão Confirmar".
Para ter uma ideia de como funcionam os outros campos do TExtensionControlBlock, a melhor maneira é
Navegue e compare-os. Em outras palavras, você desejará criar uma página HTML que permita ao usuário chamar a DLL ISAPI do cliente. O objetivo desta DLL ISAPI é simplesmente formatar cada campo no TExtensionControlBlock em HTML e depois passá-los de volta ao navegador. Isso transforma seu navegador em um depurador um tanto assustador que exibe todos os campos do TExtensionControlBlock.
Aqui está um programa, escrito por Danny Thorpe da Borland, que executa esta tarefa:
biblioteca teste1;
usa
Windows
SysUtils
HTTPExt;
função GetExtensionVersion (var Ver: THSE_VERSION_INFO): BOOL;
começar
Ver.dwExtensionVersion := $00010000; // suporte 1.0
Ver.lpszExtensionDesc := 'Uma DLL de teste escrita em Delphi 2.0';
Resultado := Verdadeiro;
fim;
função HttpExtensionProc( var ECB: TEXTENSION_CONTROL_BLOCK ):
DWORD;
var
ResStr: string;
StrLen: Inteiro;
Buf: array [0..1024] de Char;
começar
ECB.lpszLogData := 'Log DLL Delphi';
ECB.dwHTTPStatusCode := 200;
ResStr := Formato(
' +
'
'Tamanho = %d
'+
'Versão = %.8x
'+
'ConnID = %.8x
'+
'Método = %s
' +
'Consulta = %s
' +
'PathInfo = %s
'+
'Caminho traduzido = %s
'+
'TotalBytes=%d
'+
'DisponíveisBytes = %d
'+
'ContentType = %s
'+
'
[ECB.cbTamanho
ECB.dwVersão
BCE.ConnID
ECB.lpszMethod
BCE.lpszQueryString
ECB.lpszPathInfo
ECB.lpszPathTranslated
BCE.cbTotalBytes
BCE.cbDisponível
BCE.lpszContentType]);
com o BCE fazer
começar
StrLen := Tamanhode(Buf);
GetServerVariable(ConnID
'REMOTE_ADDR'
@Buf
StrLen);
ResStr := ResStr + 'REMOTE_ADDR = '+Buf+'
';
StrLen := TamanhoOf(Buf);
GetServerVariable(ConnID
'REMOTE_HOST'
@Buf
StrLen);
ResStr := ResStr + 'Remote_Host = '+Buf+'
';
StrLen := TamanhoOf(Buf);
GetServerVariable(ConnID
'REMOTE_USER'
@Buf
StrLen);
ResStr := ResStr + 'Remote_User = '+Buf+'
';
StrLen := TamanhoOf(Buf);
GetServerVariable(ConnID
'SERVER_NAME'
@Buf
StrLen);
ResStr := ResStr + 'SERVER_NAME = '+Buf+'
';
StrLen := TamanhoOf(Buf);
GetServerVariable(ConnID
'SERVER_PORT'
@Buf
StrLen);
ResStr := ResStr + 'SERVER_PORT = '+Buf+'
';
StrLen := TamanhoOf(Buf);
GetServerVariable(ConnID
'SERVIDOR_PROTOCOLO'
@Buf
StrLen);
ResStr := ResStr + 'SERVER_PROTOCOL = '+Buf+'
';
StrLen := TamanhoOf(Buf);
GetServerVariable(ConnID
'SERVIDOR_SOFTWARE'
@Buf
StrLen);
ResStr := Formato('%sSERVER_SOFTWARE =%s
'+
'ThreadID = %.8x
'
[ResStr
Buf
GetCurrentThreadID]);
fim;
ResStr := ResStr + ';
ResStr := Formato(
'HTTP/1.0 200 OK'#13#10+
'Tipo de conteúdo: texto/html'#13#10+
'Comprimento do conteúdo: %d'#13#10+
'Conteúdo:'#13#10#13#10'%s'
[Comprimento(ResStr)
ResStr]);
StrLen := Comprimento(ResStr);
BCE.WriteClient(ECB.ConnID
Ponteiro (ResStr)
StrLen
0);
Resultado:=HSE_STATUS_SUCCESS;
fim;
exportações
GetExtensionVersion
HttpExtensionProc;
começar
fim.
Para chamar esta DLL, você deve criar um script HRML que inclua a seguinte linha
Teste um
Obtenha informações no botão "Confirmar"
Normalmente, os formulários HTML que enviam informações possuem um botão de confirmação. Contanto que a quantidade de informações seja inferior a 49 KB, você pode
Considere que o campo lpbData em TExetensionControlBlock esteja disponível. Veja como você pode
Na maioria dos casos a informação enviada pelo ponteiro para este campo é obtida:
var
S: corda;
começar
…
S := PChar(ECB.lpbData);
…
fim;
Se as informações provenientes deste campo forem maiores que 48 KB, você deverá chamar ReadClient para obter as informações restantes.
Se quiser saber exatamente quais informações estão disponíveis no campo lpbData, você pode usar as duas funções a seguir para transmitir os dados de volta ao seu navegador:
função SetUpResString: string;
começar
Resultado := ' +
' +
'
'lpbData = %s ' +
';
fim;
função HttpExtensionProc(var ECB: TExtensionControlBlock):
DWORD;
var
ResStr: string;
StrLen: Inteiro;
S
S1: sequência;
começar
ECB.lpszLogData := 'Log DLL Delphi';
ECB.dwHTTPStatusCode := 200;
ResStr := SetUpResString;
S := PChar(ECB.lpbData);
ResStr := Formato(ResStr
[S]);
StrLen := Comprimento(ResStr);
BCE.WriteClient(ECB.ConnID
Ponteiro(ResStr)
StrLen
0);
Resultado:=HSE_STATUS_SUCCESS;
fim;
Suponha que você já tenha um formulário HTML com o seguinte código anexado:
Este código produzirá um formulário com uma área de texto para você inserir números e um botão “enviar” chamado “GetSquare”. Se você tiver este formulário, poderá esperar que os dois programas acima retornem a seguinte string, supondo que o usuário insira o número 23 na área de texto do formulário:
lpbData = GetSquare=23&GetSquare=Enviar
Para entender o que está acontecendo neste momento, preste atenção à parte principal da instrução HTML extraída da função acima. Esta parte da instrução reside no servidor e é refletida da seguinte forma:
'lpbData = %s ' +
Se você estudar o código da função HttpExtensionProc acima, descobrirá que, logo antes desta frase, ele usa o parâmetro %s na instrução Format em vez do valor em ECB.lpbData. (Se você não sabe como funciona a instrução Format, consulte a documentação Delphi relevante) [Nota: Na Enciclopédia de Programação Delphi2 do autor (Delphi2
Há instruções detalhadas no Capítulo 3 "Strings e arquivos de texto" em Unleashed (Tradutor)]
Suponha que no formato mostrado acima, quando o usuário pressiona o botão “Confirmar”, o valor passado por lpbData para a DLL ISAPI é:
GetSquare=23&GetSquare=Enviar
Para lhe dar uma ideia clara, deixe-me repetir que a informação passada de volta ao navegador pelas duas instruções acima é a seguinte string, que você já viu:
lpbData = GetSquare=23&GetSquare=Enviar
A melhor maneira de ver esse processo é testar a execução do programa ISAPI2 listado abaixo. ISAPI2 é semelhante a ISAPI1, mas inclui a nova função HttpExtensionProc mostrada acima e também inclui a função de utilitário SetUpResString.
biblioteca Isapi2;
usa
Windows
SysUtils
HTTPExt;
função GetExtensionVersion (var Ver: THSE_VERSION_INFO):
BOOL;
começar
Ver.dwExtensionVersion := $00010000; // suporte 1.0
Ver.lpszExtensionDesc := 'DLL escrita em Delphi 2.0';
Resultado := Verdadeiro;
fim;
função SetUpResString: string;
começar
Resultado := ' +
' +
'
'lpbData = %s ' +
';
fim;
função HttpExtensionProc( var ECB: TEXTENSION_CONTROL_BLOCK ):
DWORD;
var
ResStr: string;
StrLen: Inteiro;
S
S1: sequência;
Len: Inteiro;
começar
ECB.lpszLogData := 'Log DLL Delphi';
ECB.dwHTTPStatusCode := 200;
ResStr := SetUpResString;
S := PChar(ECB.lpbData);
ResStr := Formato(ResStr
[S]);
StrLen := Comprimento(ResStr);
BCE.WriteClient(ECB.ConnID
Ponteiro(ResStr)
StrLen
0);
Resultado:=HSE_STATUS_SUCCESS;
fim;
exportações
GetExtensionVersion
HttpExtensionProc;
começar
fim.
Depois de obter as informações passadas pela variável lpbData do formulário, você pode analisar as informações ou devolvê-las ao usuário. Por exemplo, você poderia extrair o número 23 do exemplo acima, elevá-lo ao quadrado e devolvê-lo ao usuário. Isso permite obter informações do usuário, neste caso números, realizar algumas operações matemáticas com os números e, finalmente, retornar o resultado ao usuário. Isso significa que você pode criar páginas da web interativas diretamente nas ondas do rádio, que é o aspecto mais popular da programação da Internet no momento!
A seguir está um código de programa completo que envia o quadrado de um número ao navegador pela rede:
biblioteca Isapi3;
{Este código mostra como receber informações do usuário por meio de um navegador
analisar essa informação
e então retornar uma resposta ao usuário em particular.
o usuário envia um número
este código é quadrado
e depois envia o resultado de volta ao usuário. Aqui está o formulário do navegador que envia as informações para análise:
}
usa
Windows
SysUtils
HTTPExt
StrBox;
função GetExtensionVersion (var Ver: THSE_VERSION_INFO):
BOOL;
começar
Ver.dwExtensionVersion := $00010000; // suporte à versão 1.0
Ver.lpszExtensionDesc := 'ISAPI3.DLL';
Resultado := Verdadeiro;
fim;
// analisa lpbData e recupera o número que o usuário nos passou.
função ParseData (S: string): Inteiro;
começar
S := StripLastToken(S
'&');
S := StripFirstToken(S
'=');
Resultado := StrToInt(S);
fim;
função SetUpResString: string;
começar
Resultado := ' +
' +
'
'Resposta = %d ' +
';
fim;
função HttpExtensionProc( var ECB: TEXTENSION_CONTROL_BLOCK ):
DWORD;
var
ResStr: string;
StrLen: Inteiro;
S
S1: sequência;
Num: Inteiro;
começar
ECB.lpszLogData := 'Log DLL Delphi';
ECB.dwHTTPStatusCode := 200;
ResStr := SetUpResString;
S := PChar(ECB.lpbData);
Num := ParseData(S);
Núm := Quadrado(Núm);
ResStr := Formato(ResStr
[Número]);
StrLen := Comprimento(ResStr);
BCE.WriteClient(ECB.ConnID
Ponteiro (ResStr)
StrLen
0);
Resultado:=HSE_STATUS_SUCCESS;
fim;
exportações
GetExtensionVersion
HttpExtensionProc;
começar
fim.
Este código aceita a seguinte string do usuário que pressionou o botão confirmar e solicitou o número quadrado:
GetSquare=5&GetSquare=Enviar
Supondo uma entrada como esta, este código retornará a seguinte string ao usuário pela Internet:
Resposta = 25
Em uma frase, o usuário insere o número 5 e você retorna ao usuário o número 25. Se o usuário enviar o número 10, você retornará o número 100. Isto pode parecer trivial, mas o que importa aqui é o que acontece na Internet [Nota: refere-se a páginas web interativas (traduzidas
Quem)]
Analise a função passada pelo usuário assim:
// analisa lpbData e recupera o número que o usuário nos passou.
função ParseData (S: string): Inteiro;
começar
S := StripLastToken(S
'&');
S := StripFirstToken(S
'=');
Resultado := StrToInt(S);
fim;
Essas duas afirmações estão na unidade mencionada no início deste artigo e também estão incluídas no meu site. [Nota: Este documento pode ser encontrado em quase todos os lugares da Internet
Você também pode solicitá-lo ao tradutor (Tradutor)][Neste artigo
Eu só quero falar muito sobre ISAPI. Isso deve ser suficiente para inspirar você a se divertir aproveitando as vantagens dessa excelente tecnologia. A seguir, quero falar sobre as duas instruções GetServerVariable e ReadClient. Conduzi apenas experimentos extremamente limitados nesse sentido. Neste artigo, anexei o arquivo HTTPEXT.PAS porque você não o encontrará em nenhum outro lugar além deste documento crítico.
Instruções GetServerVariable e ReadClient
Assim como solicitar informações em seu aplicativo CGI, você pode usar instruções para obter informações do servidor. Aqui está um exemplo de como chamar esta instrução:
Len := HseMaxExtDllNameLen;
DefinirComprimento(S1
Len);
Dez(Len);
BCE.GetServerVariable(ECB.ConnID
'CONTENT_LENGTH'
PChar(S1)
Len);
Primeiro, esse código define o comprimento do buffer que contém as informações recuperadas do servidor. Em seguida, ele chama o servidor e faz uma solicitação, neste caso pede o "CONTENT_LENGTH" da mensagem do servidor.
A documentação da Microsoft nos diz que você pode passar a seguinte string como segundo parâmetro de GetServerVariable:
AUTH_TYPE Contém o tipo de autorização utilizada. Por exemplo, se você estiver usando autorização básica, então
A sequência é "básica"; se for uma resposta de desafio do NT, a sequência será "NTLM". Outras autorizações possuem sequências correspondentes específicas. Como novos tipos de autorização são constantemente adicionados ao servidor, não é viável listar todas as sequências possíveis. Se a sequência estiver vazia, nenhuma autorização será usada.
CONTENT_LENGTH O número de bytes que o script espera recuperar do cliente.
CONTENT_TYPE O tipo de conteúdo das informações fornecidas pelo corpo do anúncio de solicitação. [Nota: O irmão mais novo é menos talentoso e menos experiente, um
A solicitação POST foi temporariamente traduzida como "aviso de solicitação", corrija-me (tradutor)]
PATH_INFO Informações adicionais de roteamento, fornecidas pelo cliente. Ele contém o caminho para o URL após o nome do script
Depender de. Se presente, precede a sequência de solicitações.
PATH_TRANSLATADO Este é o valor de PATH_INFO, mas contém os nomes de todas as rotas virtuais expandidas para um sinalizador de caminho.
Query_string as informações após o "?"
REMOTE_ADDR O endereço IP do cliente solicitante ou de seu agente (por exemplo, um gateway ou firewall).
Remote_host O nome do host do cliente solicitante ou seu agente (por exemplo, um gateway ou firewall).
Remote_user, isso contém o nome de usuário fornecido pelo cliente e autorizado pelo servidor. Se uma string vazia for retornada, o usuário
em seu nome (mas com autorização).
Unmapp_remote_user é o nome de um usuário com as seguintes características: Este usuário faz uma solicitação à conta de usuário do NT (essa é a identidade dele), antes da qual o filtro de aplicativo ISAPI mapeou o usuário.
Request_method é o método de solicitação HTTP.
Script_name O nome do script executado.
Server_name o nome do host ou endereço IP quando aparecer em URLs auto-referenciais.
Server_port a porta TCP/IP que aceita solicitações.
Server_port_secure uma string que é 0 ou 1. É 1 quando a solicitação é tratada por uma porta segura;
Server_protocol aceita o nome e a versão das informações do protocolo associadas a esta solicitação. Geralmente é http/1.0.
Server_software é o nome e a versão do servidor da Web, onde o programa DLL do Application ISAPI é executado. All_http A variável anterior não analisou todos os cabeçalhos HTTP. Essas variáveis são derivadas de http_ <nome do cabeçalho do campo>. Os cabeçalhos de campo (separados por marcadores de linha) contêm strings individuais, que não são encerradas.
Http_accept caso especial do cabeçalho do campo HTTP. Os valores aceitos são: campos separados por vírgulas (,). Por exemplo: se
As linhas a seguir fazem parte do cabeçalho HTTP:
Aceite: */ *, q = 0.1
Em seguida, o URL (um novo recurso na versão 2.0) fornece sua parte básica.
Observe que a peça de informação fornecida acima é passada automaticamente pelo registro textionControlblock. porque
Você não precisa chamar GetServerVariable para isso. No entanto, você pode chamá -lo se realmente precisar, especialmente se quiser obter informações do ReadClient e precisar saber quanta informação lê.
Muitas vezes, você não precisa ligar para o ReadClient. No entanto, o tamanho da mensagem enviado pelo seu navegador é maior que 48kb
Tempo, você precisa ligar para o ReadClient para obter o restante das informações.