注册 登录
编程论坛 VFP论坛

foxpro web 开发原理

sam_jiang 发布于 昨晚 22:15, 45 次点击
有没有人跟我一样好奇,foxweb,foxpage,vfpweb,php,asp 是如何工作的?可以把我们编写的脚本,转化成html发送给客户的?

搜遍了网络,楞是没有找到一篇教我们如何用vfp编写的web应用的文章,有的都是让我们如何应用,如foxweb,foxpage等,人家已经写好了的。为此也搜索了很多其他语言的cgi编程的文章,期望能有所启发。。。为此,我还特地反编译了上面那三个foxpro编写的web程序,尝试去读懂它的源代码,以便理解它的深层逻辑。

好在,有了deepseek,网上搜不到的资料,可以问它,渐渐地我大概地了解了Web开发的原理,好像我觉得我又行了

下面,我就讲讲我的理解:

foxweb的脚本后缀是.fwx;foxpage的脚本后缀是.fps;vfpweb的脚本后缀也是.fwx;php的脚本后缀是.php;asp的脚本后缀是.asp。
我们以foxweb为例,来掰扯掰扯它的工作原理,这个我比较熟悉,其他几种原理都一样。
当我们在浏览器中输入:http://localhost/,IIS服务器会搜索index.fwx,index.php,index.asp,或index.html 我的服务器支持这三种脚本,IIS会按顺序搜索,正常是默认的是html,当然这个顺序是可以改变的。
当然直接输入http://localhost/index.fwx更好,直接。
服务器会把index.fwx发送给foxweb处理,这个就叫脚本映射,就是所有后缀名是.fwx的文件,IIS都会发给foxweb,此时的foxweb.exe就是我们常说的模块映射,就是CGI程序。foxweb把服务器发过来的fwx脚本翻译成html文件再返回给服务器,这样就在浏览器中可以查看了。

光这样说可能不太好理解,要是能举个例子就好了,能加深我们的理解,这时就可以求助deepseek了,让它给我生成一段示例代码。
假设我用foxpro编写了一个cgi程序control.exe,作为 IIS 模块映射处理 FPX 脚本;我们的自定义脚本的后缀名是fpx,那么请求处理流程如下:
1,用户请求 example.fpx
2,IIS 识别 .fpx 扩展名并调用 control.exe
3,control.exe 接收请求参数和脚本路径
4,control.exe 执行 FoxPro 脚本
5,FoxPro 脚本生成 HTML 输出
6,control.exe 将 HTML 返回给 IIS
7,IIS 将 HTML 发送给客户端浏览器

编写example.fpx内容:
程序代码:

* example.fpx [color=#808080]- FoxPro 脚本生成 HTML[/color]

* 设置响应头
Response = [HTTP/1.1 200 OK] + chr(13) + chr(10) + ;
           [Content-Type: text/html] + chr(13) + chr(10) + chr(13) + chr(10)

* HTML 内容
html = [<html>]
html = html + [<head><title>FoxPro FPX 示例</title></head>]
html = html + [<body>]
html = html + [<h1>欢迎来到 FoxPro Web 脚本</h1>]

* 动态内容 [color=#808080]- 当前日期时间[/color]
html = html + [<p>当前服务器时间: ] + dtoc(date()) + [ ] + time() + [</p>]

* 从查询字符串获取参数
cName = GetEnv("QUERY_STRING")  * 获取查询字符串
IF !EMPTY(cName)
    * 简单解析查询字符串 (例如: ?name=John)
    nPos = AT("=", cName)
    IF nPos > 0
        cValue = SUBSTR(cName, nPos+1)
        html = html + [<p>你好, ] + cValue + [!</p>] &&有参数显示“你好,John!”
    ENDIF
else
    html = html + [<p>Hello World!</p>] &&如果没有提供参数显示“Hello World!”
ENDIF

html = html + [</body></html>]

* 输出结果
? Response + html
RETURN

假设我们已经完成IIS 配置‌:
添加 .fpx 扩展名映射到 control.exe
设置可执行路径为 control.exe 的完整路径
取消选中"验证文件存在"选项(因为 control.exe 会处理文件存在性)

浏览器中这样访问这个脚本:http://localhost/example.fpx?name=John 或http://yourserver/example.fpx
点击浏览器的查看源代码应该是如下所示:
程序代码:

HTTP/1.1 200 OK
Content-Type: text/html

<html>
<head><title>FoxPro FPX 示例</title></head>
<body>
<h1>欢迎来到 FoxPro Web 脚本</h1>
<p>当前服务器时间: 04/25/2025 14:30:45</p>
<p>你好, John!</p>
</body>
</html>


然后最重要的就是,如何编写我们的control.exe了。
把下面这段代码编译为control.exe(代码deepseek生成的,没有验证,我只是举例让大家了解原理)
程序代码:

* control.exe 的主程序
LPARAMETERS tcScriptPath, tcQueryString

* 设置错误处理
ON ERROR DO ErrorHandler WITH ERROR(), MESSAGE(), LINENO()

* 获取环境变量(IIS传递的信息)
IF EMPTY(tcScriptPath)
    tcScriptPath = GETENV("PATH_TRANSLATED")
ENDIF

IF EMPTY(tcQueryString)
    tcQueryString = GETENV("QUERY_STRING")
ENDIF

* 验证脚本文件是否存在
IF !FILE(tcScriptPath)
    ? "HTTP/1.1 404 Not Found"
    ? "Content-Type: text/html"
    ?
    ? "<html><body><h1>404 Not Found</h1>"
    ? "<p>Requested script file not found: " + tcScriptPath + "</p>"
    ? "</body></html>"
    RETURN
ENDIF

* 设置FoxPro环境
SET PROCEDURE TO
SET CLASSLIB TO
SET TALK OFF
SET SAFETY OFF
SET ESCAPE OFF
SET EXCLUSIVE OFF
SET STATUS BAR OFF

* 将查询字符串保存到内存变量
PUBLIC gcQueryString
gcQueryString = tcQueryString

* 执行脚本文件
DO (tcScriptPath)

RETURN

* 错误处理程序
PROCEDURE ErrorHandler(tnError, tcMessage, tnLineNo)
    ? "HTTP/1.1 500 Internal Server Error"
    ? "Content-Type: text/html"
    ?
    ? "<html><body><h1>500 Server Error</h1>"
    ? "<p>Error executing script: " + tcMessage + "</p>"
    ? "<p>Error #: " + TRANSFORM(tnError) + "</p>"
    ? "<p>Line: " + TRANSFORM(tnLineNo) + "</p>"
    ? "</body></html>"
   
    * 记录错误到日志文件
    STRTOFILE(DTOC(DATE()) + " " + TIME() + " - Error " + ;
             TRANSFORM(tnError) + ": " + tcMessage + " (Line " + ;
             TRANSFORM(tnLineNo) + ")" + CHR(13) + CHR(10), ;
             "fpx_errors.log", .T.)
ENDPROC

通过我的分享,我想大家一定会有跃跃欲试的感觉的,赶快试试看吧。
后续我再根据反响,优化一下这个程序,给我顶上去,就继续。。。

3 回复
#2
easyppt昨晚 22:19
好文,谢谢分享,期待更新!
#3
schtg9 小时前
支持,继续哈
#4
kosung13 分钟前
好文,期待更新
1