| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 384 人关注过本帖
标题:foxpro web 开发原理(三)
只看楼主 加入收藏
sam_jiang
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:903
专家分:1386
注 册:2021-10-13
结帖率:97.37%
收藏
 问题点数:20 回复次数:8 
foxpro web 开发原理(三)
上次我们实现了cgi转发功能,不论我们请求哪个fpx文件,cgi程序都会向iis发送一个问候:“hello”

今天我们来探索IIS服务器是如何把请求的路径和参数发给我们cgi程序的。

当我们向浏览器发送请求:http://localhost/sample.fpx?name=samjiang时,我设想此时IIS收到请求,会把网址以参数的形式发回给我们的cgi程序,于是我为control.prg设置了2个参数,lcpath 和lcqureystring,编译试试~
程序代码:
parameters lcpath,lcqureystring
if parameters()=0
    lcoutput="没有参数被传递!"
else
    。。。
endif


很显然,这条路行不通,IIS并没有向我们的CGI程序control传递任何参数

那就说明IIS把我们的请求以环境变量的形式保存在服务器上了。

我虽不知道保存的环境变量名是什么,但这难不倒我,嘿嘿,写个foxweb脚本,看看当我们发出一个请求时,服务器会自动生成哪些环境变量。

foxweb代码:
程序代码:
<%
*本脚本showvars.fwx用来显示所有环境变量
dime aServerVars[1] &&定义一个服务器变量数组
nTotVars = Request.ServerVariablesArray(@aServerVars)
for i=1 to ntotvars
    response.write(aServerVars[i]) &&在浏览器中显示所有环境变量
    response.write("<br>")
endfor     
%>

浏览器显示如下:
图片附件: 游客没有浏览图片的权限,请 登录注册


发现2个有用的环境变量PATH_TRANSLATED和QUERY_STRING,我们的CGI程序要执行自定义脚本sample.fpx时,必须知道我们的脚本保存的物理路径,以及它的请求参数(当然可以没有参数)
在这篇文章里,我们依然没有对sample.fpx脚本进行解释执行,只是为了了解IIS如何将请求传递给我们的CGI程序control。

现在我们可以对control做出更改,编译后执行试试看~~~
control.prg代码如下:
程序代码:
* CGI处理示例
* 定义 Windows API 常量
#DEFINE STD_INPUT_HANDLE   -10
#DEFINE STD_OUTPUT_HANDLE  -11

* 声明 Windows API
DECLARE Sleep IN kernel32 INTEGER dwMilliseconds
DECLARE INTEGER GetStdHandle IN kernel32 INTEGER nStdHandle
DECLARE INTEGER ReadFile IN kernel32 ;
    INTEGER hFile, ;
    STRING @lpBuffer, ;
    INTEGER nNumberOfBytesToRead, ;
    INTEGER @lpNumberOfBytesRead, ;
    INTEGER lpOverlapped

DECLARE INTEGER WriteFile IN kernel32 ;
    INTEGER hFile, ;
    STRING lpBuffer, ;
    INTEGER nNumberOfBytesToWrite, ;
    INTEGER @lpNumberOfBytesWritten, ;
    INTEGER lpOverlapped

* CGI 环境变量常量
CGI_CONTENT_LENGTH = "CONTENT_LENGTH"

* 主程序
CLEAR
SET TALK OFF
SET CONSOLE OFF

* 获取标准输入输出句柄
hStdIn = GetStdHandle(STD_INPUT_HANDLE)
hStdOut = GetStdHandle(STD_OUTPUT_HANDLE)

* 调试用暂停(如果需要)

 =Sleep(6000)  && 暂停60秒等待调试器附加

* 读取POST内容
lcContentLength = GETENV(CGI_CONTENT_LENGTH)
lnContentLength = VAL(lcContentLength)

IF lnContentLength > 0
    * 准备缓冲区
    lcReadBuffer = REPLICATE(CHR(0), lnContentLength)
    lnBytesRead = 0
    
    * 读取输入
    =ReadFile(hStdIn, @lcReadBuffer, lnContentLength, @lnBytesRead, 0)
    lcReadBuffer = LEFT(lcReadBuffer, lnBytesRead)
    
    * 解析参数
    lnPos = AT("=", lcReadBuffer)
    IF lnPos > 0
        lcValue = SUBSTR(lcReadBuffer, lnPos + 1)
    ELSE
        lcValue = lcReadBuffer
    ENDIF
ELSE
    lcValue = ""
ENDIF

cpath=GETENV("PATH_TRANSLATED")
cqureystr=GETENV("QUERY_STRING")
* 构建响应
    lcResponse = "HTTP/1.0 200 OK" + CHR(13) + CHR(10) + ;
                "Content-Type: text/html" + CHR(13) + CHR(10) + ;
                CHR(13) + CHR(10) + ;
                "请求路径为: " + cpath+"<br>"+;
                "请求参数为:" +IIF(EMPTY(cqureystr),"没有参数!",cqureystr)
*    lcResponse [color=#808080]= "HTTP/1.0 200 OK" + CHR(13) + CHR(10) + ;[/color]
                "Content-Type: text/html" + CHR(13) + CHR(10) + ;
                CHR(13) + CHR(10) + ;
                "Hello " + lcValue        
* 发送响应
lnBytesWritten = 0
=WriteFile(hStdOut, lcResponse, LEN(lcResponse), @lnBytesWritten, 0)

* 清理
CLEAR DLLS
QUIT 


在浏览器中运行效果如下:
1,没有参数的情况:
图片附件: 游客没有浏览图片的权限,请 登录注册

2,有参数的情况:
图片附件: 游客没有浏览图片的权限,请 登录注册


完美。。。

预告一下~~~ 下一篇,我们就可以执行我们自己的脚本了

搜索更多相关主题的帖子: 环境变量 脚本 请求 INTEGER 参数 
3 天前 23:45
sam_jiang
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:903
专家分:1386
注 册:2021-10-13
收藏
得分:0 
浏览器输出的环境变量有问题,生成的数组是二维数组, 我当成普通数组了,不过,不影响CGI功能的实现。

修改后的showvars.fwx代码如下:
程序代码:
<%
dime aServerVars[1,2]
nTotVars = Request.ServerVariablesArray(@aServerVars)
for i=1 to ntotvars
    response.write(padr(aServerVars[i,1],50,"_") + aServerVars[i,2])
    response.write("<br>")
endfor     
%>


效果如下:
图片附件: 游客没有浏览图片的权限,请 登录注册
前天 09:16
iswith
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:579
专家分:703
注 册:2013-5-14
收藏
得分:0 
现在还有多少Web应用是在IIS上的!算了吧!PC 就用C# + VFP  移动端就用JAVA/PHP要从源头放弃系统转向其它!代价比较大就算了吧!
在VFP“开箱即用”逻辑思维下这一切太过于繁琐,玩Web就放弃VFP,转PHPJAVA成本都要低很多。
前天 11:55
sam_jiang
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:903
专家分:1386
注 册:2021-10-13
收藏
得分:0 
回复 3楼 iswith
这大概就是我们老一辈foxer的坚持吧?能用vfp搞定的,就坚决不用其他语言。。。

我希望我的文章能给其他foxer一些启发,当然在诸位大神面前这是班门弄斧了。。。

本编程版块也就我们vfp论坛还保存这一丝热闹了。

加油,foxer们!
收到的鲜花
  • kangss前天 12:49 送鲜花  1朵  
  • wcx_cc昨晚 23:52 送鲜花  1朵  
前天 12:45
iswith
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:579
专家分:703
注 册:2013-5-14
收藏
得分:0 
用web调用VFP处理数据确实是一个正二八经的路,关键不是VFP,而是调用者的封装,一般来说用C或go最好~,当然你自己封装就等于干了MS或其它大厂的工作!其实底层逻辑真是一模一样的。

收到的鲜花
  • sam_jiang前天 13:55 送鲜花  1朵  
  • wcx_cc昨晚 23:53 送鲜花  1朵  
前天 13:29
schtg
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:Usa
等 级:贵宾
威 望:67
帖 子:2031
专家分:4140
注 册:2012-2-29
收藏
得分:0 
前天 14:41
sam_jiang
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:903
专家分:1386
注 册:2021-10-13
收藏
得分:0 
回复 5楼 iswith
现在的网站绝大多数都是数据驱动的网站,vfp在处理数据方面有得天独厚的优势,这大概就是vfp经久不衰的原因吧?

别人我不知道,反正我对vfp情有独钟
前天 16:25
jmkwok
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2011-9-24
收藏
得分:0 
其實學一下web也用不了多少時間, 我現在是桌面仍然vfp+mysql, Web就是javascript+php+mysql, 非常方便!
收到的鲜花
  • sam_jiang前天 19:55 送鲜花  1朵  
前天 18:02
hsfisher
Rank: 1
等 级:新手上路
帖 子:15
专家分:4
注 册:2009-4-26
收藏
得分:0 
前天 19:59
快速回复:foxpro web 开发原理(三)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.050020 second(s), 11 queries.
Copyright©2004-2025, BC-CN.NET, All Rights Reserved