kuangkuang
论坛版主
论坛版主
  • 发帖数52
  • QQ309200966
  • 金币686两
  • 威望132点
  • 钻石0枚
  • 注册日期2016-11-11
  • 最后登录2023-05-19
阅读:17601回复:8

[资源分享]4gl调用WEB API,实现JSON传递(Demo)

楼主#
更多 发布于:2018-05-01 20:56
测试环境: 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)'     #
#&lt;--------------------------------------------------------------------------------------------------------------&gt;
# 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 
#     &lt;--Example--&gt;:   p_Url = "http://xxx.xxx.x.xx/2wm/public/index.php/api/Index/uploadTest?a=test"  
# param_In_2.......: p_Post_Json , type=String 
#     &lt;--Example--&gt;:   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
#&lt;--------------------------------------------------------------------------------------------------------------&gt;
   
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.JSONObject
  DEFINE 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格式,返回对象 w
  LET l_tab_colum = " "
  LET g_success = 'Y'       
  TRY
      CALL HttpUtils.getJSONObject(p_Url,p_Post_Json) RETURNING w  
  CATCH  
     LET l_msg = "ERROR :",STATUS,"==&gt;API接口通讯失败!"
     CALL cl_err(l_msg,"!",1)      
     IF p_Type = 1 THEN
        RETURN " "
     ELSE
        RETURN w 
     END IF         
  END TRY
        
  IF 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 THEN
     CALL 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获取 array
         FOR 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_colum
     CALL cl_create_temp_table(l_tab_colum) RETURNING l_tem_tab_name
     IF 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()-1
         LET jsonwx = JSONObject.fromObject(jsony.getString(l_i))
         LET jsonykey = jsonwx.names()                            #json key获取 array
         LET 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_values
        LET l_ins_sql = " INSERT INTO ",l_tem_tab_name," ",
                        "      VALUES ",l_ins_values
        PREPARE l_ins_sql_pb FROM l_ins_sql
        EXECUTE 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_random
            LET ls_time = TIME
            LET 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_random
        CALL cl_replace_str(l_tab_name,' ','') RETURNING l_tab_name
        LET 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_sql
        EXECUTE l_cre_temp_tab_pb
        IF 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
喜欢3 评分0

最新喜欢:

QiuShuLiQiuShu... rich5168rich51... tomatotomato
kuangkuang
论坛版主
论坛版主
  • 发帖数52
  • QQ309200966
  • 金币686两
  • 威望132点
  • 钻石0枚
  • 注册日期2016-11-11
  • 最后登录2023-05-19
沙发#
发布于:2018-05-03 08:04
@Perry  鹏鹏, 你这个代码的编辑器不行啊, 是我用的不对还是说呈现的问题, 我明明选择了sql的代码格式, 帖子发出来变这样了???
回复(0) 喜欢(0)     评分
Perry
管理员
管理员
  • 发帖数213
  • QQ396572376
  • 金币43188两
  • 威望11394点
  • 钻石8888枚
  • 注册日期2016-11-09
  • 最后登录2024-11-03
  • VIP会员
  • 荣誉会员
  • 优秀斑竹
  • 最爱沙发
  • 原创写手
  • 社区居民
板凳#
发布于:2018-05-03 11:10
浏览器的问题,兼容性。
官方QQ群:556775727  
回复(0) 喜欢(0)     评分
syoom.song
中级会员
中级会员
  • 发帖数88
  • QQsyoom.song@q
  • 金币0两
  • 威望100点
  • 钻石0枚
  • 注册日期2018-05-06
  • 最后登录2018-05-06
地板#
发布于:2018-05-06 20:12
好好学习,好好学习,好好学习,好好学习,好好学习,
回复(0) 喜欢(0)     评分
Perry
管理员
管理员
  • 发帖数213
  • QQ396572376
  • 金币43188两
  • 威望11394点
  • 钻石8888枚
  • 注册日期2016-11-09
  • 最后登录2024-11-03
  • VIP会员
  • 荣誉会员
  • 优秀斑竹
  • 最爱沙发
  • 原创写手
  • 社区居民
4楼#
发布于:2018-05-14 17:07
代码兼容已修复,另增加4gl代码高亮
IMPORT com
IMPORT util
IMPORT JAVA java.net.URLEncoder
IMPORT JAVA java.lang.String
           
DATABASE ds
GLOBALS "../../../tiptop/config/top.global"
   
                         
MAIN
 
END MAIN
官方QQ群:556775727  
回复(0) 喜欢(0)     评分
lyl_dg
初级会员
初级会员
  • 发帖数21
  • QQ826716311
  • 金币25两
  • 威望36点
  • 钻石0枚
  • 注册日期2019-03-28
  • 最后登录2020-06-11
  • 社区居民
5楼#
发布于:2019-03-28 15:14
学习了
回复(0) 喜欢(0)     评分
mythls
中级会员
中级会员
  • 发帖数60
  • QQ258169897
  • 金币76两
  • 威望84点
  • 钻石0枚
  • 注册日期2019-09-06
  • 最后登录2020-04-18
6楼#
发布于:2019-09-09 18:46
感谢楼主分享!感谢管理员修复!
回复(0) 喜欢(0)     评分
xiaolong
中级会员
中级会员
  • 发帖数82
  • QQ2398668225
  • 金币12两
  • 威望101点
  • 钻石0枚
  • 注册日期2017-07-27
  • 最后登录2022-08-29
7楼#
发布于:2020-08-19 18:42
楼主可以分享一下if_common.jar的包吗
回复(0) 喜欢(0)     评分
yunten
初级会员
初级会员
  • 发帖数7
  • QQ313739314
  • 金币30两
  • 威望28点
  • 钻石0枚
  • 注册日期2022-10-20
  • 最后登录2022-10-25
  • 社区居民
8楼#
发布于:2022-10-20 14:27
请问出现「The symbol 'com.lifesense.common.HttpUtils' does not represent a valid variable type.」是缺了什么 jar 檔?

已经放了下面这些 jar 檔
commons-beanutils-1.8.0.jar
commons-codec-1.15.jar
commons-collections-3.2.2.jar
commons-httpclient.jar
commons-lang-2.6.jar
commons-logging-1.1.1.jar
ezmorph-1.0.6.jar
httputils-2.2.jar
json-lib-2.4-jdk15.jar
xom-1.2.5.jar
回复(0) 喜欢(0)     评分
游客

返回顶部