📄 55.htm
字号:
如果您想要确切地知道在 lpbData 字段中哪些信息是可用的,您可以使用下面两个 <br>
函数把数据传回到您的网页浏览器中: <br>
<br>
function SetUpResString: string; <br>
begin <br>
Result := '<HTML>' + <br>
'<TITLE>Test server result</TITLE>' + <br>
'<H1>Test server results</H1>' + <br>
'<BODY>lpbData = %s </BODY>' + <br>
'</HTML>'; <br>
end; <br>
<br>
function HttpExtensionProc(var ECB: TExtensionControlBlock): <br>
DWORD; stdcall; <br>
var <br>
ResStr: string; <br>
StrLen: Integer; <br>
S, S1: string; <br>
begin <br>
ECB.lpszLogData := 'Delphi DLL Log'; <br>
ECB.dwHTTPStatusCode := 200; <br>
ResStr := SetUpResString; <br>
S := PChar(ECB.lpbData); <br>
ResStr := Format(ResStr, [S]); <br>
StrLen := Length(ResStr); <br>
ECB.WriteClient(ECB.ConnID, Pointer(ResStr), StrLen, 0); <br>
Result := HSE_STATUS_SUCCESS; <br>
end; <br>
<br>
<br>
假设您已经有了附有下面代码的HTML窗体: <br>
<br>
<FORM ACTION="/scripts/mystuff/isapi2.dll" METHOD="POST" <br>
ENCTYPE="application/x-www-form-urlencoded"> <br>
<br>
<P> <br>
Enter Number to Square: <INPUT NAME="GetSquare" VALUE="" <br>
MAXLENGTH="25" SIZE=25> <br>
<P> <br>
<INPUT TYPE=SUBMIT VALUE="Submit" NAME="GetSquare"> <br>
</FORM> <br>
<br>
<br>
这段代码会产生一个包含一个供您输入数字的文本区和一个叫做“submit”按钮的窗 <br>
体,按钮的名字叫做“GetSquare”。如果有了这个窗体,接着您可以预计上面的两段程 <br>
序会返回如下的字符串,假设用户在窗体中的文本区输入了数字23: <br>
<br>
lpbData = GetSquare=23&GetSquare=Submit <br>
<br>
为了理解这时究竟发生了什么,注意一下从上面函数中摘录HTML语句中的主体部分, <br>
这部分语句驻留在服务器上,反映如下: <br>
<br>
<br>
'<BODY>lpbData = %s </BODY>' + <br>
<br>
如果您研究过上面 HttpExtensionProc 函数中的代码,您会发现就在这句之前,它 <br>
使用了 Format 语句中的 %s 参数来代替了 ECB.lpbData 中的值。(如果您不清楚语句 <br>
Format 是怎样工作的,请参阅有关的 Delphi 文档)[注:在作者所著的 Delphi2 编程 <br>
大全(Delphi2 <br>
Unleashed)中的第三章《字符串与文本文件》中有详细说明(译者)] <br>
<br>
<br>
<br>
假设上面所示的窗体中,当用户按下“确认”按钮时,lpbData 传递给 <br>
ISAPI DLL的值是: <br>
<br>
<br>
GetSquare=23&GetSquare=Submit <br>
<br>
为了让您有清晰的概念,让我重复一下上面两个语句传回给浏览器的信息是下面的字 <br>
符串,您已经看过了: <br>
<br>
<br>
lpbData = GetSquare=23&GetSquare=Submit <br>
<br>
<br>
观看这个过程的最好办法试运行下面列出的 ISAPI2 程序。 ISAPI2 和 <br>
ISAPI1 差不多,但他包含了上面显示的新的 HttpExtensionProc 函数,并且它还包含了 <br>
SetUpResString 这个实用函数。 <br>
<br>
library Isapi2; <br>
<br>
uses <br>
Windows, SysUtils, HTTPExt; <br>
<br>
function GetExtensionVersion( var Ver: THSE_VERSION_INFO ): <br>
BOOL; stdcall; <br>
begin <br>
Ver.dwExtensionVersion := $00010000; // 1.0 support <br>
Ver.lpszExtensionDesc := 'DLL written in Delphi 2.0'; <br>
Result := True; <br>
end; <br>
<br>
function SetUpResString: string; <br>
begin <br>
Result := '<HTML>' + <br>
'<TITLE>Test server result</TITLE>' + <br>
'<H1>Test server results</H1>' + <br>
'<BODY>lpbData = %s </BODY>' + <br>
'</HTML>'; <br>
end; <br>
<br>
function HttpExtensionProc( var ECB: TEXTENSION_CONTROL_BLOCK ): <br>
DWORD; stdcall; <br>
var <br>
ResStr: string; <br>
StrLen: Integer; <br>
S, S1: string; <br>
Len: Integer; <br>
begin <br>
ECB.lpszLogData := 'Delphi DLL Log'; <br>
ECB.dwHTTPStatusCode := 200; <br>
ResStr := SetUpResString; <br>
S := PChar(ECB.lpbData); <br>
<br>
<br>
<br>
<br>
<br>
<br>
>
ResStr := Format(ResStr, [S]); <br>
StrLen := Length(ResStr); <br>
ECB.WriteClient(ECB.ConnID, Pointer(ResStr), StrLen, 0); <br>
Result := HSE_STATUS_SUCCESS; <br>
end; <br>
<br>
<br>
<br>
exports <br>
GetExtensionVersion, <br>
HttpExtensionProc; <br>
<br>
begin <br>
end. <br>
<br>
一旦您从窗体中获得了由 lpbData <br>
变量传来的信息,您就能分析这些信息或者把它们返回给用户。比如说,您可以从上面例 <br>
子中把数字23抽出来,做平方后返回用户。通过这样做可以使您从用户中获得信息,在这 <br>
里是数字,对数字进行一些数学运算,最后把结果返回给用户。这意味着您可以在电波中 <br>
创建互动的网页,这可 <br>
是现在因特网编程中最流行的哦! <br>
<br>
<br>
以下是一个通过网络提交数字平方给浏览器的完整的程序代码: <br>
<br>
<br>
library Isapi3; <br>
<br>
{ This code shows how to take input from the user via a browser, <br>
parse that information, and then return an answer to the user. <br>
In particular, the user submits a number, this code squares it, <br>
and then sends the result back to user. <br>
<br>
Here is the form from the browser that submits the information <br>
for parsing: <br>
<br>
<FORM ACTION="/scripts/mystuff/isapi2.dll" METHOD="POST" <br>
ENCTYPE="application/x-www-form-urlencoded"> <br>
<br>
<P> <br>
Enter Number to Square: <INPUT NAME="GetSquare" VALUE="" <br>
MAXLENGTH="25" SIZE=25> <br>
<P> <br>
<INPUT TYPE=SUBMIT VALUE="Submit" NAME="GetSquare"> <br>
</FORM> <br>
<br>
} <br>
<br>
uses <br>
Windows, SysUtils, HTTPExt, <br>
StrBox; <br>
StrBox; <br>
<br>
function GetExtensionVersion( var Ver: THSE_VERSION_INFO ): <br>
BOOL; stdcall; <br>
begin <br>
Ver.dwExtensionVersion := $00010000; // version 1.0 support <br>
Ver.lpszExtensionDesc := 'ISAPI3.DLL'; <br>
Result := True; <br>
end; <br>
<br>
// Parse lpbData and retrieve the number the user passed to us. <br>
function ParseData(S: string): Integer; <br>
begin <br>
S := StripLastToken(S, '&'); <br>
S := StripFirstToken(S, '='); <br>
Result := StrToInt(S); <br>
end; <br>
<br>
function SetUpResString: string; <br>
begin <br>
Result := '<HTML>' + <br>
'<TITLE>Test server result</TITLE>' + <br>
'<H1>Test server results</H1>' + <br>
'<BODY>Answer = %d </BODY>' + <br>
'</HTML>'; <br>
end; <br>
<br>
function HttpExtensionProc( var ECB: TEXTENSION_CONTROL_BLOCK ): <br>
DWORD; stdcall; <br>
var <br>
ResStr: string; <br>
StrLen: Integer; <br>
S, S1: string; <br>
Num: Integer; <br>
begin <br>
ECB.lpszLogData := 'Delphi DLL Log'; <br>
ECB.dwHTTPStatusCode := 200; <br>
ResStr := SetUpResString; <br>
S := PChar(ECB.lpbData); <br>
Num := ParseData(S); <br>
Num := Sqr(Num); <br>
ResStr := Format(ResStr, [Num]); <br>
StrLen := Length(ResStr); <br>
ECB.WriteClient(ECB.ConnID, Pointer(ResStr), StrLen, 0); <br>
Result := HSE_STATUS_SUCCESS; <br>
Result := HSE_STATUS_SUCCESS; <br>
end; <br>
<br>
<br>
exports <br>
GetExtensionVersion, <br>
HttpExtensionProc; <br>
<br>
begin <br>
end. <br>
<br>
<br>
这段代码从按下确认按钮的用户那里接受下面的字符串,用户要求平方后的数字: <br>
<br>
<br>
<br>
GetSquare=5&GetSquare=Submit <br>
<br>
假设这样输入,这段代码会通过因特网返回用户下面的字符串: <br>
<br>
Answer = 25 <br>
<br>
一句话,用户输入数字5,你返回用户数字25。如果用户提交数字10,那么您返回数 <br>
字100。这看起来微不足道,但在这里重要的是因特网上发生的行为[注:指互动网页(译 <br>
者)] <br>
<br>
分析用户传来的函数像这样: <br>
<br>
<br>
// Parse lpbData and retrieve the number the user passed to us. <br>
function ParseData(S: string): Integer; <br>
begin <br>
S := StripLastToken(S, '&'); <br>
S := StripFirstToken(S, '='); <br>
Result := StrToInt(S); <br>
end; <br>
<br>
<br>
这两个语句在单元中,在本文开头提到过,也包含在我的站点上。[注:这个文件在 <br>
网络上几乎到处可见,您也可以向译者索取(译者)][ <br>
<br>
<br>
在本篇文章中,关于ISAPI我只想谈这么多了。这些内容对于启发您利用这项优越的技 <br>
术并获得乐趣来说应该是够用的了。接下来我要谈一下 GetServerVariable 、 <br>
ReadClient 这两个语句,在这方面我只进行了极其有限的试验。在本文中,我附加了 <br>
ReadClient 这两个语句,在这方面我只进行了极其有限的试验。在本文中,我附加了 <br>
HTTPEXT.PAS <br>
文件,因为除了这分关键文档,在其他地方您不会找到它。 <br>
<br>
<br>
GetServerVariable 和 ReadClient 语句 <br>
<br>
正如您的CGI应用程序中的请求信息一样,您可以使用语句来从服务器上获得信息。 <br>
下面是呼叫这个语句的例子: <br>
<br>
<br>
Len := HseMaxExtDllNameLen; <br>
SetLength(S1, Len); <br>
Dec(Len); <br>
ECB.GetServerVariable(ECB.ConnID, <br>
'CONTENT_LENGTH', <br>
PChar(S1), <br>
Len); <br>
<br>
首先,这段代码设定了保留从服务器上取得的信息的缓冲区的长度。接着它呼叫服务 <br>
器并发出请求,在本例中,它要求获得服务器传来的信息的"CONTENT_LENGTH"。 <br>
<br>
<br>
<br>
微软公司的文献告诉我们,您可以通过 GetServerVariable 的第二个参数来传递跟 <br>
着的字符串: <br>
<br>
<br>
AUTH_TYPE 它包含了使用授权的类型。比如,如果使用的是基本(basic)授权,那么 <br>
字符串就是"basic";如果是 NT challenge <br>
回应,字符串就是"NTLM"。其他的授权属尤其对应的字符串。因为不断有新的授权类型被 <br>
增添到服务器上,列出所有可能的字符串是不可行的。如果字符串为空,那么并没有使用 <br>
任何授权。 <br>
<br>
CONTENT_LENGTH 脚本预计从客户端回收到的字节数。 <br>
<br>
CONTENT_TYPE 由请求布告的主体部分提供的信息的内容类型。[注:小弟才疏学浅,a <br>
POST request 暂译作"请求布告",望方家指正(译者)] <br>
<br>
PATH_INFO 附加的路由信息,由客户机提供。它包含了跟在脚本名字之后的URL的漫游路 <br>
由。如果有的话,它在请求字符串的前面。 <br>
<br>
PATH_TRANSLATED 它是 PATH_INFO 的值,但包含了扩充到一个路径标志的所有虚拟路由 <br>
的名字。 <br>
<br>
QUERY_STRING 跟在参考这个脚本的URL中的"?"后面的信息。 <br>
<br>
REMOTE_ADDR 发出请求的客户机或其代理商(例如,网关或防火墙)的IP地址。 <br>
<br>
REMOTE_HOST 发出请求的客户机或其代理商(例如,网关或防火墙)的主机名。 <br>
<br>
REMOTE_USER 它包含了由客户机提供并且由服务器授权的用户名。如果返回空串那么用户 <br>
使你名的(但是经过授权)。 <br>
<br>
UNMAPPED_REMOTE_USER 它是有如下特征的用户的名称:该用户向NT用户帐目发出请求( <br>
这是他以身份出现),在此之前ISAPI应用程序过滤起映射了该用户。 <br>
<br>
REQUEST_METHOD 是 HTTP 请求方法。 <br>
<br>
SCRIPT_NAME 执行的脚本程序名称。 <br>
<br>
SERVER_NAME 当它以自参考URLs形式出现时的主机名或IP地址。 <br>
<br>
SERVER_PORT 接受请求的TCP/IP的端口。 <br>
<br>
SERVER_PORT_SECURE 一个非0即1的字符串。当请求由安全端口处理时,它是1;否则是0 <br>
。 <br>
<br>
鼻肭笥砂踩
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -