公司最近使用tiptop与携客云对接,携客云提供的接口方式是https的,使用4gl里面的接口语言直接调用的话会报错“Configuration needed to perform HTTPS connection”研究了很久,没找到解决方案,无奈曲线救国,直接使用shell脚本POST json数据,发现程序更简洁,运行效率更快,下面对这种调用方式做一个详细说明:
1:gp默认是不支持json解析的,因为util.so版本的问题,,刚好看到鹏哥论坛的文章,更新util.so到新版本,解析问题解决!
2:写shell脚本,这里我写了一个公用脚本,gp使用的时候调用脚本并传入json,地址参数,就可以组成需要执行的脚本文件,最后执行脚本文件,请求连接并获取response数据
脚本getxky.sh内容 echo “curl -i -X POST -H ‘Content-type’:’application/json’ -d ‘$1’ $2”
3:编写4gl程序程序主要的内容就是(1):组成request的json文件;(2):调用脚本生成执行POST的脚本;(3):执行脚本,并将结果放在一个临时文本中,通过规则过滤掉无效输出,只保留有效json数据;(4):解析文本中的json数据,得到数据后做逻辑处理
util.so 下载 util.rar
以下是实现代码(代码来自网络。未经测试)
FUNCTION cws_xky_receiveTypes(erpCode,innerVendorCode,prodCodes) #获取供应商交货方式
DEFINE erpCode LIKE zx_file.zx01,
innerVendorCode LIKE type_file.chr100,
prodCodes DYNAMIC ARRAY OF VARCHAR(40)
#-------------------------------------必要变量
DEFINE l_json_file STRING,
l_json_sh STRING,
l_json STRING
DEFINE jsonObj util.JSONObject
DEFINE jsondata TEXT
DEFINE l_jsonString STRING
DEFINE l_cmd STRING
#-------------------------------------必要变量
#----------------request数据
DEFINE i INTEGER
DEFINE l_json_rec RECORD
commonParam RECORD
appKey VARCHAR(40),
version VARCHAR(10),
ownerCompanyCode VARCHAR(40),
operateCompanyCode VARCHAR(40),
sign VARCHAR(40),
timestamps INTEGER
END RECORD,
body RECORD
erpCode VARCHAR(40),
innerVendorCode VARCHAR(40),
prodCodes DYNAMIC ARRAY OF VARCHAR(40)
END RECORD
END RECORD
#----------------request数据
#---------------response数据
DEFINE receiveTypes RECORD
result INTEGER, #成功=1,失败=9
dataList DYNAMIC ARRAY of RECORD
productCode VARCHAR(40), #料号
innerVendorCode VARCHAR(40), #供应商
receiveType INTEGER #交货方式 1:按订单,2:按排期
END RECORD
END RECORD
#---------------response数据
LET l_json_sh = "/u1/tmp_dir/json/",innerVendorCode CLIPPED,".sh" #-----执行发送的脚本
LET l_json_file = "/u1/tmp_dir/json/",innerVendorCode CLIPPED,".txt" #-----获取到的数据
LET l_json = "/u1/tmp_dir/json/",innerVendorCode CLIPPED,".json" #获取到的json格式数据
CALL cws_xky_get_defluat("receiveTypes") RETURNING g_common.*,g_address #获取协客云参数信息
#-------------------赋值 begin
LET l_json_rec.commonParam.appKey = g_common.appKey
LET l_json_rec.commonParam.version = g_common.version
LET l_json_rec.commonParam.ownerCompanyCode = g_common.ownerCompanyCode
LET l_json_rec.commonParam.operateCompanyCode = g_common.operateCompanyCode
LET l_json_rec.commonParam.sign = g_common.sign
LET l_json_rec.commonParam.timestamps = g_common.timestamps
LET l_json_rec.body.erpCode = erpCode
LET l_json_rec.body.innerVendorCode = innerVendorCode
FOR i =1 to prodCodes.getlength()
LET l_json_rec.body.prodCodes[i] = prodCodes[i]
END FOR
#------------------赋值 END
LET jsonObj = util.JSONObject.fromFGL(l_json_rec) #将FGL数据转换成json
LET l_jsonString = jsonObj.toString() #获取json串
LET l_cmd = "sh /u1/tmp_dir/json/getxky.sh '",l_jsonString,"' '",g_address,"' >",l_json_sh #调用脚本生成执行脚本(其实直接在程序组成也可以)
RUN l_cmd
LET l_cmd = "chmod 777 ",l_json_sh #更新权限
RUN l_cmd
LET l_cmd ="sh ",l_json_sh," > ",l_json_file #执行脚本,并将结果写入文件
RUN l_cmd
LET l_cmd = "sed -n '$p' ",l_json_file," > ",l_json #获取纯正json文件(根据实际数据处理,我这里json数据在最后一行)
RUN l_cmd
#2:解析数据
#--------------json解析 begin
LOCATE jsondata IN FILE l_json #直接抓取文件
TRY
LET jsonObj = util.JSONObject.parse(jsondata)
CALL jsonObj.toFGL(receiveTypes) #转化成数据
CATCH
DISPLAY "ERROR:", STATUS
END TRY
#---------------json解析 END
#--------------做数据处理
#--------------做数据处理
END FUNCTION
转载请注明:赫非域 » tiptop调用webservice接口需要https解决方案