前后端参数的传递

在前一讲中,我们使用一个网页表单实现了前后端参数的传递,在这一讲中,我们将使用另外的方式来进行参数的传递。

第一种方式:Get方式

这种方式大家在上网时经常可以看到,在浏览器地址栏中,除去域名外,还有很多的数字、英文等字符,在这些字符中,有一些就是我们今天要讲的参数。
下面我们来进行后端代码的编写:

DEFINE CLASS ctl_get as Session
    PROCEDURE get
        cParam1=HttpQueryParams("key1")
        RETURN "当前传递的参数为:"+cParam1
    ENDPROC 
ENDDEFINE 

接下来我们通过浏览器进行访问

http://192.168.3.159:801/ctl_get.fsp?proc=get
此时我们会在浏览器页面上看到如下图信息
不带参数的运行效果

因为我们并没有发送参数,所以参数为空,浏览器当然也就不显示,那么如何传递参数呢?我们只需要对访问地址进行一下加工,即通过使用“&”(and)进行拼接,我们再尝试一下

http://192.168.3.159:801/ctl_get.fsp?proc=get&key1=测试参数传递

再看一下效果
传递参数后的效果
在这里需要注意的是,因为我们后端使用的获取参数的关键字为“key1”,因此,在浏览器地址栏中,我们也只能使用“&key1=参数内容”,否则将无法正常传递参数。这里我们只是传递了一个参数,如果要传递多个参数,我们可以参照参数一的方式进行添加。如

DEFINE CLASS ctl_get as Session
    PROCEDURE get
        cParam1=HttpQueryParams("key1")
        cParam2=HttpQueryParams("key2")
        cParam3=HttpQueryParams("key3")
        RETURN "当前传递的参数一为:"+cParam1+"||当前传递的参数二为:"+cParam2+"||当前传递的参数三为:"+cParam3
    ENDPROC 
ENDDEFINE 
http://192.168.3.159:801/ctl_get.fsp?proc=get&key1=参数1&key2=参数2&key3=参数3

运行的效果如下
多参数传递效果
我们可以发现,所有信息都是以明文的方式进行传递的,这样信息就毫无保密性可言,下面我们介绍另一种传递方式。


第二种方式:Post方式

使用Post方式进行信息传递,我们必须借助于外部工具,这里我们引入POSTMAN工具(该工具可以通过百度进行搜索下载或者使用下面的地址下载中文版。当然大家也可以使用国产软件ApiPost)。

https://github.com/hlmd/Postman-cn
https://www.apipost.cn/download.html

下图是设置后的便笺模式中的极简界面,具体的使用方法自行百度或在本站进行查找。
POSTMAN极简界面
今天我们尝试使用body参数
Body 提供六种类型,今天我们主要使用 x-www-form-urlencoded / raw 两种,每种类型提供不同的UI界面。
我们下面模拟提交表单,后端内容不变,在POST中选择Body,然后选中 x-www-form-urlencoded
x-www-form-urlencoded方式提交

下面我们试试raw类型。raw类型主要用于发送JSON对象或者其他对象,以原文形式提交数据。
后端代码依然不变
raw类型提交数据

raw类型主要是用于原样提交数据的,因此在这里我们把后端代码也改一下

DEFINE CLASS ctl_post as Session
    PROCEDURE post
        cPostData=HttpGetPostData()
        RETURN cPostData
    ENDPROC 
ENDDEFINE

然后我们再在POSTMAN中提交数据

192.168.3.159:801/ctl_post.fsp?proc=post
raw类型中发送json数据

尝试后端传送图片信息

首先我们需要将图片转码成BASE64编码,然后把该编码内容通过POST方式传给后端,然后我们再把它存为图片。
我们在VFP命令窗口中完成相关操作

PicPath=Getfile()
PicStr=FileToStr(PicPath)
PicBase64=StrConv(PicStr,13)
_ClipText=PicBase64

然后把信息粘贴到POSTMAN中进行提交
传递BASE64编码图片信息
我们可以看到返回信息为“File save success!”,这与后端是一致的,我们看一下后端代码

DEFINE CLASS ctl_post as Session
    PROCEDURE post
        cPostData=HttpGetPostData()
        &&取得前端传送的数据
        cPicStr=STRCONV(cPostData,14)
        &&因为我们已明确知道传递过来的是BASE64编码信息,所以在这里我们再进行解码
        STRTOFILE(cPicStr,"wwwroot/test.png")
        &&进行编码的图片格式为PNG,在这里我们也以PNG格式存下来
        &&RETURN cPostData
        RETURN "File save success!"
        &&这里我们就不返回图片编码信息了,直接给一个成功的提示
    ENDPROC 
ENDDEFINE

那么图片是否真的保存下来了呢?我们到框架下的wwwroot目录检查一下。
保存图片结果
如上图所示,传递过来的信息已成功保存至指定目录下了。
刚才我们通过后端传递了图片信息并成功保存为文件了,我们不可能对每一张图片都先进行编码,再通过POSTMAN来传递,我们最终要实现的就是通过前端选择需要上传的图片,直接发送给后端进行处理。下面我们尝试一下。

尝试前端传送图片信息

前端代码如下

<!DOCTYPE html>
<html>
<head>
    <title>传送图片</title>
    
</head>
<body>
    <!--这里我们直接把图片的base64编码信息以文本形式发送过去-->
    <form action="ctl_sendpic.fsp" method="post" enctype="text/plain">
    <input type="file" id="selectFiles" onchange="dealSelectFiles()">
    <input type="submit" value="发送">
    <input type="text" id="picdata" name="picdata" value="" hidden>
    
    </form>
    <canvas id="myCanvas"></canvas>
    <!--<canvas id="myCanvas" width=1440 height=900></canvas>-->
    <script type="text/javascript">
        var imgPosX = 0;
        var imgWidth = 256;
        function dealSelectFiles(){
            /// get select files.
            var selectFiles = document.getElementById("selectFiles").files;
            for(var file of selectFiles){
                //console.log(file.webkitRelativePath);
                console.log(file.name)
                /// read file content.
                var reader = new FileReader();
                reader.readAsDataURL(file);
                
                reader.onloadend = function(){
                    /// deal data.
                    var img = new Image();
                    /// after loader, result storage the file content result.
                    img.src = this.result;
                    //预览图片的内容
                    var obj = document.getElementById("picdata"); 
                    obj.value=img.src;
                    //在图片数据框中置入base64编码的图片内容
                    console.log(img.src);
                    img.onload = function(){
                        var myCanvas = document.getElementById("myCanvas");
                        var cxt = myCanvas.getContext('2d');
                         cxt.drawImage(img, imgPosX, 0);
                        imgPosX += imgWidth;
                    }
                }
            }
        }
    </script>
</body>

</html>

前端界面图
发送图片界面图
选择图片后的界面
图片预览界面
发送成功后的页面
发送成功页面
查看网页源码
网页源码图
那么后端是如何处理的呢,直接上代码

DEFINE CLASS ctl_sendpic as Session
    PROCEDURE onDefault
        PRIVATE lcPicName,pic
        lcPicData=HttpGetPostData()
        &&因为前端使用picdata来接收并传递数据,所以要减掉“picdata="共8个字符长度,余下的就是图片的base64编码信息了
        pic=RIGHT(lcPicData,LEN(lcPicData)-8)
        lcHtml=GetWwwRootPath()+"receivepic.html"
        _currentcode="UTF-8"
        RETURN FWS_MergeFile(lcHtml)
        &&RETURN RIGHT(lcPicData,LEN(lcPicData)-8)
    ENDPROC 
ENDDEFINE

第二课视频学习教程

由于服务器原因,在线视频暂时下线了。

发表评论