# VFP也可以做前端,BS开发入门必须的掌握GET,POST
# 调试服务器使用
打开框架项目文件
运行 环境设置.prg
运行调试服务器即可启动。
默认端口为801,IP为开发机器所在的IP
# 测试调试服务器
打开好调试服务器,就可以打开浏览器(推荐 使用360极速,谷歌浏览器)
输入http://192.168.0.99:801/1.fsp 根据开发机器修改IP
同台机器也可用127.0.0.1
出现如上的字样表示调试服务器工作良好。
# 网址URL和开发框架的一些约定
http://192.168.0.99:801/a1send.fsp?proc=Send 192.168.0.99为IP地址,如果有域名可以换成域名 801为HTTP服务端口 1.Fsp 使用FSP做为调用文件名,调用a1send.prg中的 a1send类 proc=Send参数调用a1send类的方法
# 编写一个控制器类
控制器类是与BS前端交互的接口类
A1send类的定义
*-- WebApi 控制器类
*-- 规范:文件名跟类名是一样的.如类名:a1Send,文件名a1Send.prg
*-- 存放于control文件夹中
Define Class a1send As Session
Procedure Send
Return "Hello world"
Endproc
Enddefine
2
3
4
5
6
7
8
9
将上面的类保存为prg文件。
# 调试服务器输出JSON
在a1send类中添加
Procedure SendJson
oJson=Createobject("foxjson")
oJson.Append("name",“张三")
oJson.Append("age",21)
oJson.Append("sex",.T.)
Return oJson.tostring()
Endproc
2
3
4
5
6
7
调用时浏览器输入 http://127.0.0.1:801/a1send.fsp?proc=sendJson
就可以看到输出JSON了。
也可以使用POSTMAN来测试。
# 服务器接收GET传参
*-- WebApi 控制器类 *-- 规范:文件名跟类名是一样的.如类名:1Send,文件名1Send.prg *-- 调用格式 http://ip:端口号/类名.fsp?proc=类过程名 *-- http传参 get方式传参 在url中进行拼接 *-- 用&键=值对来传值,可多个拼接 http://ip:端口号/类名.fsp?proc=类过程名&参数1=参数值
Define Class a2get As Session
*--传参 key1=test
Procedure get
cResult=httpqueryparams("key1",this.iconnid)
cResult1=httpqueryparams("key2",this.iconnid)
RETURN "您传的参数是:"+cResult+cResult1
ENDPROC
Enddefine
2
3
4
5
6
7
8
9
调用时浏览器输入 http://127.0.0.1:801/a2get.fsp?proc=get&key1=test&key2=123
第一个键值对参数用?连接,第二个以后用&连接。
也可以使用POSTMAN来测试。
# POST 传参的说明
BS参数的传递有传键值对,有传JSON和其它格式。 放在URL(GET方式)中只能用键值对传参。 POST方式放在Body中可以发送JSON,键值对和其它格式。
# 键值对格式的接收
VFP后端统一用HttpQueryParams接收
# JSON或其他格式
用HttpGetPostData原样接收,自行解析。
# 服务器接收Post传参
以下代码放在a3post的控制器类中,接受发过来的POST所有数据 并返回去
Procedure Post
LOCAL cPostData
cPostData=HttpGetPostData(this.iconnid)
RETURN cPostData
Endproc
*--解析键值对格式 name=张三&age=21
Procedure PostParams
LOCAL cname,cage
cname=httpqueryparams("name")
cage=httpqueryparams("age")
RETURN "姓名:"+cname+"年龄:"+cage
Endproc
2
3
4
5
6
7
8
9
10
11
12
13
因为浏览器地址栏里面是没有办法进行POST测试的,所以我们使用POSTMAN工具来辅助测试。
如上图所示,输入URL和参数之后,按Send按键就可以测试了。
# VFP作为前端调用后端的控制器类
准备工作 1 客户端项目与服务端项目要分开不同的文件夹 2 用两个VFP分别打开相应的项目 3 客户端首先运行环境设置,再运行调试服务器后关掉调试服务器 4 服务 端首先运行环境设置,再运行调试服务器 不关
# VFP客户端用Get方式传参
cUrl="http://127.0.0.1:801/a2get.fsp?proc=get"+"&key1="+"12345"
WebClient=Newobject("Qiyu_HttpClient","Qiyu_HttpClient.prg")
cData=WebClient.send(cUrl)
If !Isnull(cData)
Messagebox(cData,11)
Else
Messagebox(WebClient.msg)
Endif
2
3
4
5
6
7
8
# VFP客户端用Post方式传参
Post传参可以直接加上URL中传,也可以放在Post(URL,键值对)
cUrl="http://127.0.0.1:801/a3post.fsp?proc=PostParams"
WebClient=Newobject("Qiyu_HttpClient","Qiyu_HttpClient.prg")
WebClient.method="post"
WebClient.setHeader("content-type","application/x-www-form-urlencoded") &&键值对形式提交
cData=WebClient.send(cUrl,"name=张三&age=21")
If !Isnull(cData)
Messagebox(cData)
Else
Messagebox(WebClient.msg)
Endif
2
3
4
5
6
7
8
9
10
###祺佑框架JSON格式约定 成功 (串内也可以放其它信息) {" errno " :0, " errmsg " : " ok "} 失败 { “errno”: 1, “errmsg”:”错误信息”}
举例 { "errno": 1, "errmsg": "文件 '1.prg' 不存在。", "success": "false", "errorMsg": "文件 '1.prg' 不存在。,过程:socketweb1._onread,行号:171", "total ": 0, "rows": ""192.168.0.99:801 "" }