4gl调用WEB API,实现JSON传递(Demo)

article/2025/9/15 15:03:40

测试环境: GP5.25 , fjs版本2.32,解析json所需要的jar依赖包 (PS: 如果没有记错是fjs2.32版本及以上才支持java bridge,所以GP 5.25以下的同学就不要用这种方式去测试)

测试内容: 利用此fjs版本对java bridge的支持,实现4gl调用WEB API,实现json传递 

测试步骤如下:

1.下载本次测试需要的jar依赖包,百度搜索就有 “Java 解析JSON,JSON-LIBjar包下载”。只是if-common.jar文件要稍微注意,这是别人写好的包,下载下来是没有的。(如果有java经的童鞋,想一下就知道这里面会写什么)


2.将下载的jar文件传到ERP服务器对应的目录:/u1/topprod/tiptop/ds4gl2/bin/javaad/jar。

3.修改环境变量 tiptop_env文件中的jar包引用路径。

tiptop_env位置:/u1/topprod/tiptop/bin/tiptop_env,

可使用VI直接进行编辑,然后保存。(注意:多个环境变量以 冒号 隔开,最后一个环境变量时用 分号 结束)

4.编写4gl代码,重点将上传到服务器中的jar包,通过import方式导入到4gl代码中,以便调用。(目前已写成公共函数放lib/cl_web_api.4gl)

基本思路:将URL及要传递的JSON格式数据作为参数传入接口,将接口返回的数据/对象进行解析,存入一个随机创建的临时表(随机:表名不会重复,临时表为会话类型),回传给4gl临时表,供4gl再次处理。

4gl调用此lib,参数3传入不同的值,会有两种回传结果: 1.返回临时表名2.返回对象。

 

5.<第一种:返回临时表名>

调用lib下的方法CALLcl_web_api(p_Url,p_Post_Json,p_Type,p_Nouse2),

设置第三个参数p_Type = 1, 返回临时表名,临时表内容为API接口返回的JSON数据,程序调用示例:

 

 根据回传的表名做一个简单的FOREACH测试:

 

6.<第二种:返回对象>

调用lib下的方法CALLcl_web_api(p_Url,p_Post_Json,p_Type,p_Nouse2),

设置第三个参数p_Type = 2, 返回临对象,程序调用示例:

  

7.有个前提很重要,如果是要访问外部的WEB API接口,ERP服务器要一定可以访问外网;当然如果不方便让ERP服务器访问外网,就调用局域网下发布WEB API接口也是可以的。

                                              Author : Kellan

                                                Q Q :   309200966

                                                          Date:  2018年3月26日11:32:49

干货奉送!!!  cl_web_api.4gl源码如下:

`
# Prog. Version..: '5.25.11-12.12.11(00010)'     #
#<-------------------------------------------------------------------------------------------------------------->
# Library name.....: cl_web_api.4gl
# Descriptions.....: 4GL提交Json到Web,获取Web返回的对象,并进行解析.(4GL调用外部Web API)
# Memo.............: Two days,so funny. Where there is a will,there is a way..Ha-Ha-Ha..
# Usage............: CALL cl_web_api(p_Url,p_Post_Json,p_Type,p_Nouse2) RETURNING p_Temp_Tab/object
# param_In_1.......: p_Url , type=String 
#     <--Example-->:   p_Url = "http://xxx.xxx.x.xx/2wm/public/index.php/api/Index/uploadTest?a=test"  
# param_In_2.......: p_Post_Json , type=String 
#     <--Example-->:   p_Post_Json = 'postData=[{"rec_id": "1","name": "匡奎"},{"rec_id": "2","name": "李聚"}]'
# param_In_3.......: p_Type , type= Integer (type = 1 返回表名  type = 2 返回对象 )  
# param_In_4.......: p_Nouse2 , type=String
# 
# param_Out_1......: p_Temp_Tab, type = String, Create temp table with random.
# 
# Date & Authors...: 2018-03-23/24  By Kellan & Andrew
#<-------------------------------------------------------------------------------------------------------------->IMPORT os                                               
IMPORT com
IMPORT JAVA net.sf.json.JSON                            
IMPORT JAVA net.sf.json.JSONArray
IMPORT JAVA net.sf.json.JSONObject
IMPORT JAVA com.lifesense.common.HttpUtils  
IMPORT util DATABASE ds        
GLOBALS "../../config/top.global"    FUNCTION cl_web_api(p_Url,p_Post_Json,p_Type,p_Nouse2)DEFINE p_Url                       STRING,p_Post_Json                 STRING,p_Type                      INTEGER ,p_Nouse2                    STRING                 DEFINE l_rData                     STRING,l_i                         INTEGER,l_i_i                       INTEGER         DEFINE w                           net.sf.json.JSONObject  #获取接口回传的对象     DEFINE jsony,jsonykey              net.sf.json.JSONArray   DEFINE jsonwx                      net.sf.json.JSONObjectDEFINE l_str                       STRING    DEFINE l_tab_colum                 STRING,l_tem_tab_name              STRING,l_json_values               STRING, l_ins_values                STRING  DEFINE l_ins_sql                   STRING,l_msg                       STRING #组合URL,提交参数的JSON格式,返回对象 wLET l_tab_colum = " "   LET g_success = 'Y'          TRYCALL HttpUtils.getJSONObject(p_Url,p_Post_Json) RETURNING w  CATCH  LET l_msg = "ERROR :",STATUS,"==>API接口通讯失败!"CALL cl_err(l_msg,"!",1)       IF p_Type = 1 THEN RETURN " "ELSE RETURN w END IF          END TRYIF p_Type = 2 THEN RETURN w END IF #web端固定回传对象为rData  LET l_rData = w.getString("rData")    CALL cl_err(l_rData,'!',1)#根据回传对象rData解析为数组LET jsony = w.getJSONArray("rData")  IF jsony.size()=0 THENCALL cl_err("获取回传值失败!",'!',1)RETURN " "END IF  
#begin----------------------------------create temp table------------------------------------------       
#循环json的key值作为字段创建一个临时表:l_tem_tab_name.临时表字段统一用varhcar(4000)顶额 LET jsonwx = JSONObject.fromObject(jsony.getString(0)) LET jsonykey = jsonwx.names()                            #json key获取 arrayFOR l_i_i = 0 TO jsonykey.size()-1    IF cl_nvl(jsonykey.getString(l_i_i)," ") = " " THEN CALL cl_err("服务器回传的JSON格式key值为空,这是不允许的!","!",1)LET g_success = 'N'EXIT FOR END IF  LET l_tab_colum = l_tab_colum,' ',jsonykey.getString(l_i_i),'  VARCHAR(4000)',','              END FOR                 IF g_success = 'N' THEN RETURN " "END IF    CALL cl_operation_str(l_tab_colum) RETURNING l_tab_columCALL cl_create_temp_table(l_tab_colum) RETURNING l_tem_tab_nameIF cl_nvl(l_tem_tab_name," ") = " " THEN         RETURN " "END IF 
#end----------------------------------create temp table------------------------------------------ #begin----------------------------------insert data into temp table------------------------------  
#两层循环,获取key对应的value值:l_values,组合出插入临时表的value值('column1','column2'.......),并写入临时表 FOR l_i = 0 TO jsony.size()-1LET jsonwx = JSONObject.fromObject(jsony.getString(l_i)) LET jsonykey = jsonwx.names()                            #json key获取 arrayLET l_ins_values = " "LET l_json_values = " "FOR l_i_i = 0 TO jsonykey.size()-1  LET l_json_values = jsonwx.getString(jsonykey.getString(l_i_i)) #根据json key 获取对应的value值IF cl_nvl(l_json_values," ") = " " THEN LET l_json_values = " "END IF LET l_ins_values = l_ins_values," ","'",l_json_values,"'",","   #json key对应的values可能有特殊符号待处理?           END FOR         CALL cl_operation_str(l_ins_values) RETURNING l_ins_valuesLET l_ins_sql = " INSERT INTO ",l_tem_tab_name," ","      VALUES ",l_ins_valuesPREPARE l_ins_sql_pb FROM l_ins_sqlEXECUTE l_ins_sql_pb  IF STATUS THEN CALL cl_err("写入临时表失败!","1",1)RETURN " "END IF                                                END FOR  
#end----------------------------------insert data into temp table------------------------------     RETURN l_tem_tab_name
END FUNCTION FUNCTION cl_create_temp_table(p_tab_colum)DEFINE p_tab_colum               STRING DEFINE l_cre_temp_tab_sql        STRING,l_tab_name                STRING, l_random                  INTEGER, l_ymd                     VARCHAR(20),ls_time                   STRING CALL util.Math.rand(10000) RETURNING l_randomLET ls_time = TIMELET l_tab_name = g_prog CLIPPED, "_",TODAY USING "YYMMDD", "_",ls_time.subString(1,2), ls_time.subString(4,5), ls_time.subString(7,8),'_',l_randomCALL cl_replace_str(l_tab_name,' ','') RETURNING l_tab_nameLET l_cre_temp_tab_sql = " Create Global Temporary Table ",          #两种方式创建临时表1,会话类型;2,事务类型" ",l_tab_name," "," ",p_tab_colum," On Commit Preserve Rows " #本次选择会话类型创建PREPARE l_cre_temp_tab_pb FROM l_cre_temp_tab_sqlEXECUTE l_cre_temp_tab_pbIF STATUS THEN CALL cl_err("创建临时表出错"||l_tab_name,'!',1)RETURN " "END IF          RETURN l_tab_name         
END FUNCTION FUNCTION cl_operation_str(p_str)DEFINE p_str           STRING        LET p_str = p_str.substring(3,length(p_str))      #去掉开头的空格LET p_str = p_str.substring(1,length(p_str)-1)    #去掉最后一个逗号LET p_str = '(',p_str,')'                         #外层加上括号RETURN p_str 
END FUNCTION 


http://chatgpt.dhexx.cn/article/YIRBYXQc.shtml

相关文章

给大家展示一下4gl编辑器

&#xff08;正式版已发布点击下载&#xff09;特地为编辑器开发内置语法解析器&#xff0c;将在代码编辑过程中实时提示代码错误&#xff0c;并且错误提示都是中文显示(楼主英文太垃圾只有做中文了),不再需要频繁上传服务器了哦&#xff0c; 经过楼主努力已经把所有的内置函数…

【实习之T100开发】Genero FGL (TIPTOP4GL) 学习笔记(1)

Genero FGL 学习 Genero FGL 简介Genero FGL 开发&#xff08;编译、连接、执行&#xff09;第一个程序 Hello World变量与运算符变量定义&#xff08;DEFINE&#xff09;预定义变量变量集合&#xff08;RECORD &#xff09;数据结构&#xff08;TYPE&#xff09;变量赋值&…

win10忘记密码重置密码,一行代码帮你解决

步骤如下&#xff1a; 1.右击windows图标&#xff0c;选择进入Windows PowerShell(管理员&#xff09; 2.敲入代码net user 加上你的用户名和新密码&#xff0c;Ok&#xff0c;问题解决&#xff0c;你就可以用你的新密码登陆了

win10 重置登录账户密码

在登陆界面按下强制关机&#xff08;重复3次&#xff09;。注意&#xff1a;不能进到登陆界面 出现下图时&#xff0c;选择“高级选项”&#xff1a; 选择“疑难解答”&#xff1a; 选择“高级选项”&#xff1a; 选择“命令提示符”&#xff1a; 在管理员窗口输入diskpart 回车…

服务器2008系统设置密码,win2008服务器设置密码

win2008服务器设置密码 内容精选 换一换 修改服务IP地址&#xff0c;并且将DNS地址指向本机&#xff0c;然后修改计算机名为server。安装AD域服务之后&#xff0c;机器名称会自动变成“主机名域名”的形式&#xff0c;例如server.huawei.com。在命令行下输入dcpromo.exe &#…

Win10系统修改开机密码

愚蠢的人才能进步&#xff0c;对于我这种记忆力差的人&#xff0c;密码这个东东随时忘&#xff0c;今天早上大无语事件&#xff0c;我自己都惊呆了&#xff0c;每天都用的办公电脑&#xff0c;今天死活想不起密码&#xff0c;死活打不开电脑&#xff0c;明明就是那些组合&#…

win10忘记密码_电脑忘记密码没关系,这招教你简单轻松改密码

相信"忘记电脑开机密码"这件事经常发生,忘记密码该怎么办呢?这个问题困扰了许多小伙伴,今天就教大家一种最简单的方法轻松重置电脑开机密码(本方法适用win10、win8、win7系统)。 划重点: 重置电脑开机密码一共分为三个步骤「 制作PE系统」「进入PE系统 」「重置密…

win10计算机默认用户名和密码是什么,win10共享的文件夹需要密码和用户名登陆...

一、共享文件夹所在电脑设置 1、右键我的电脑→管理→系统工具→本地用户和组→用户→中间空白区域右键→新用户&#xff1b; 2、输入自设的用户名和密码&#xff0c;如图勾选→创建&#xff1b; 3、右键需要共享的文件见→安全→编辑&#xff1b; 4、点击添加&#xff1b; 5、…

WIN10取消密码和休眠密码

安装Win10系统之后&#xff0c;发现每次开机都会出现登录密码&#xff1f;有些用户觉得很麻烦&#xff0c;所以想要取消Win10开机密码。那么&#xff0c;该如何操作呢&#xff1f; 按下winx组合键&#xff0c;启动快捷菜单 在弹出菜单选择运行&#xff0c;如下图所示 在运行框…

计算机共享网络的账号密码怎么设置密码,怎样才能给win10共享设置密码的操作方法...

怎样才能给win10共享设置密码呢&#xff1f;一些善于使用win10共享设置的小伙伴们&#xff0c;一定会为了隐私而设置win10的共享设置密码&#xff0c;为了可以完美的设置共享密码&#xff0c;小伙伴们找了好多方法&#xff0c;都没有解决&#xff0c;针对这一问题&#xff0c;小…

win10系统mysql重新配置密码

前言 最近捣鼓自己的破烂笔记本&#xff0c;想着写点玩具项目&#xff0c;想着&#xff1a;写项目不能没有mysql吧&#xff0c;点击mysqlbench开始上号。这个时候发现坏了&#xff0c;登录不上&#xff0c;想着估计mysql没装好呗&#xff0c;于是重装了mysql和mysqlbench&…

win10重置网络命令_Win10怎么重置网络 Win10重置网络命令使用方法

有时候Windows系统出问题的时候&#xff0c;会导致网络异常&#xff0c;无法正常上网&#xff0c;甚至是重新连接网络&#xff0c;依然会出现无法连接的现象。下面就来为大家分享2种重置网络的方法&#xff0c;有需要了解的小伙伴&#xff0c;快来涨知识吧 方法一&#xff1a;使…

win10 linux重置密码忘记了,忘记密码时如何重新设置Windows10密码

忘记了Windows10计算机的本地管理员密码&#xff0c;如果忘记密码&#xff0c;您将无法访问PC上的任何数据。为什么会这样呢&#xff1f;可能您的Microsoft帐户密码可能已被盗用&#xff0c;针对此疑问&#xff0c;接下去和大家分享忘记密码时重新设置Windows10密码的方法。 但…

win10上Redis设置密码

首先我的电脑是win10家庭版 安装redis后打开这个安装目录出现这个图上的内容就是找对地方了。先说下几个数字是什么&#xff1a;1.者是redis服务&#xff0c;如果项目用到redis要先打开这个&#xff0c;比如若依启动之前要先打开这个。2.cli是客户端。打开1之后 再打开2可以连接…

云服务器win10系统初始密码,win10忘记系统密码?教你重置-

忘记密码怎么办&#xff1f; 如果你用的是windows 10系统&#xff0c;一不小心忘记了系统密码&#xff0c;那应该怎么办呢&#xff1f; 这要分2种情况 Windows 10系统有两种账户&#xff0c; 第一种是微软账户&#xff0c;如果是忘记了微软账户的密码&#xff0c;那很简单&…

Win10强制更改/重置开机密码

PS&#xff1a;适用情况↓ 我想shift进入疑难设置重置电脑并保留文件和应用&#xff0c;但这样必须输入现在本地账户的密码&#xff0c;我忘了密码是啥&#xff0c;因为每次登陆要么指纹要么PIN就进入了。如果有小伙伴情况和我类似可以尝试一下这个方法。 1.按下组合键win加x&a…

win10pe系统计算机名修改,pe 重置win10登陆密码怎么操作_如何用pe系统重置win10电脑密码-win7之家...

对于一些私人的win10电脑&#xff0c;有些用户为了保证系统中文件的安全&#xff0c;同时电脑不被他人使用&#xff0c;就会给win10系统设置一个登陆密码&#xff0c;同时为了提高安全性&#xff0c;也会每隔一段时间通过pe 重置登陆密码&#xff0c;那么如何用pe系统重置win10…

计算机忘记密码WIN7,win7忘记密码强制重置方法

win7忘记密码强制重置方法怎么样的&#xff0c;电脑应用是非常广泛了&#xff0c;无论是工作还是生活&#xff0c;好像没有一台电脑就办不了事&#xff0c;但是问题也有不少。就比如有人忘记开机登陆密码&#xff0c;针对这个问题&#xff0c;小编为大家介绍win7强制重置密码的…

win10系统登录服务器密码存储位置,win10远程服务器登录密码

win10远程服务器登录密码 内容精选 换一换 分析辅助软件是一款支持部署到多台服务器目标环境上,实现对整个业务集群的数据采集和优化的组件。已成功登录Java性能分析。待安装分析辅助软件的服务器已开启sshd。已安装JDK并配置环境变量。打开“添加目标环境”界面,如图1所示,…

win10计算机睡眠怎么设置密码,怎么取消win10睡眠模式唤醒密码 Win10睡眠模式怎么设置取消唤醒密码...

类型&#xff1a;系统其它大小&#xff1a;2.0M语言&#xff1a;中文 评分&#xff1a;1.7 标签&#xff1a; 立即下载 win10进入睡眠模式后重新唤醒是需要唤醒密码的&#xff0c;不过有时候win10睡眠模式的唤醒密码感觉很多余&#xff0c;那么我们可以取消这个密码&#xff0c…