⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 55.htm

📁 水木清华的BBS文章
💻 HTM
📖 第 1 页 / 共 3 页
字号:
    如果您想要确切地知道在 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 + -