测试环境: 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

4gl调用WEB API,实现JSON传递(Demo)相关推荐

  1. java 调用webapi json_java通过url调用web api并接收其返回的json

    java通过url调用webapi并接收其返回的json数据,但现在结果总是:{"result":4,"data":{}}(未认证:),帮助文档如下:API使用 ...

  2. python 图表_Python入门学习系列——使用Python调用Web API实现图表统计

    使用Python调用Web API实现图表统计 Web API:Web应用编程接口,用于URL请求特定信息的程序交互,请求的数据大多以非常易于处理的格式返回,比如JSON或CSV等. 本文将使用Pyt ...

  3. android 调用 asp.net web api,从 .NET 客户端调用 Web API (C#)

    从 .NET 客户端调用 Web API (C#) 11/24/2017 本文内容 此内容适用于以前版本的 .NET. 新开发应该使用 ASP.NET Core. 有关使用 Core Web API ...

  4. WebApi系列~通过HttpClient来调用Web Api接口

    HttpClient是一个被封装好的类,主要用于Http的通讯,它在.net,java,oc中都有被实现,当然,我只会.net,所以,只讲.net中的HttpClient去调用Web Api的方法,基 ...

  5. ASP.NET MVC4中调用WEB API的四个方法

    当今的软件开发中,设计软件的服务并将其通过网络对外发布,让各种客户端去使用服务已经是十分普遍的做法.就.NET而言,目前提供了Remoting,WebService和WCF服务,这都能开发出功能十分强 ...

  6. 利用Fiddler模拟通过Dynamics 365的OAuth 2 Client Credentials认证后调用Web API

    微软动态CRM专家罗勇 ,回复337或者20190521可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me. 配置Dynamics 365 & PowerApps 支 ...

  7. 【ASP.NET Web API教程】3.3 通过WPF应用程序调用Web API(C#)

    注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本博客文章,请先看前面的内容. 3.3 Calling a Web API From a WPF Application ...

  8. jQuery跨域调用Web API

    我曾经发表了一篇关于如何开发Web API的博客,链接地址:http://www.cnblogs.com/guwei4037/p/3603818.html.有朋友说开发是会开发了,但不知道怎么调用啊? ...

  9. webapi输出炜json_.Net基于MVC4 Web Api输出Json格式实例

    本文实例讲述了.Net基于MVC4 Web Api输出Json格式的方法,分享给大家供大家参考.具体实现方法如下: 1.Global 中增加json输出 GlobalConfiguration.Con ...

最新文章

  1. 年后跳槽BAT必看:10种数据结构、算法和编程课助你面试通关
  2. 2021年春季学期-信号与系统-第十二次作业参考答案-第五小题
  3. android fastjson漏洞_【漏洞预警】Fastjson 远程代码执行漏洞(暂无PoC)
  4. Flex State
  5. 【Transformer】TransGAN的鉴别器的理解
  6. 淘宝发布年度十大同款:钟南山哑铃、奥特曼变身器、嫦娥五号暖宝宝入选
  7. python字符串的删除操作_Python 字符串操作(string替换、删除、截取、复制、连接、比较、...
  8. 使用 Zabbix 监控 Jenkins
  9. 吸烟增加后代患哮喘的风险
  10. Vue开发实例(04)之更换项目入口
  11. 短视频源码应该实现哪些功能;
  12. 项目需求分析与建议 NABCD模型
  13. 网络正常连接,浏览器无法打开网页的解决方法
  14. 模具设计分型面创建的10大原则
  15. 提取 Office 2016 工具栏图标
  16. 智慧教室解决方案-最新全套文件
  17. qq音乐sign算法还原源码放送及jsvmp全流程分析
  18. 修身修心的1000+篇文章总结
  19. 阿木动态 | 助力机器人教育!一站式智能无人机专业课程建设方案!
  20. new ActionListener(){}

热门文章

  1. 利用powerful number求积性函数前缀和
  2. C语言主函数返回值含义
  3. 0xC000005:Access Violation和指针强制转换问题
  4. PHP网页简单的计算机源代码
  5. Android 验证码输入框的实现
  6. 【数据库系统概念第七版(Database System Concepts 7th)配套SQL文件如何获取】
  7. 漏洞挖掘时SQL注入漏洞和XSS漏洞需注意的关键字
  8. Jsbeautifier JS代码美化库
  9. Ristretto 简介:一个高性能 GO 缓存
  10. Java8之新日期时间篇