【ERP】鼎捷T100接口开发操作指南——含接口调用与调试

【ERP】鼎捷T100接口开发操作指南——含接口调用与调试

一、T100作为服务端

T100作为服务端时,提供的接口地址都大致相同,只有主机IP和区域的编码稍有区别,作业都为awsp920,但是为什么都是awsp920就不得而知了。

区域别RESTful 接口
正式区http://T100主机IP/wstopprd/ws/r/awsp920
测试区http://T100主机IP/wtoptst/ws/r/awsp920

1、RESTful API介绍

RESTful API是一种设计风格,这种风格使 API 设计具有整体一致性:

  • 易于维护、扩展,并且充分利用HTTP协议的特点。
  • RESTful 通过HTTP协议进行数据传送。
  • RESTful 交换数据的格式由双方自行定义。
  • RESTful 传送的内容可以是XMLJSON格式。
  • RESTful 可通过 GETPOST 等方式请求不同的服务。

T100 结合RESTfulWeb service的优点:

  • 使用单一的 Restful 整合接口 awsp920client 端无需因为使用不同的服务去变换网址。
  • T100 支持POST请求服务,目的是为了交换 ERP 的数据内容。
  • 使用JSON在数据处理上较为简洁且轻量化。

2、T100 RESTful API开发流程图

azzi700
(定义目前有哪些服务函数)
T100 设计器
下载WS服务程式
wsssp???.4gl
(实际处理服务A的程式段)
cwsssp???.4gl
(实际处理服务B的程式段)
将程式
上传至T100

3、测试T100 RESTful 接口运作是否正常

方法一

通过API请求工具,对某一个服务进行测试请求,查看是否能够执行成功,下面以ApiFox软件为例,也可以使用PostMan等其他接口测试工具进行测试。

在这里插入图片描述

如上图所示,调用方法选择post,接口地址需要换上自己的T100服务器IP,请求体选择json格式进行数据传输。请求内容如下:

{
 "key": "f5458f5c0f9022db743a7c0710145903",//key和type随意
 "type": "sync",
 "host": {
   "prod": "APP",
   "ip": "10.40.71.91",//服务器的ip地址,非必填
   "lang": "zh_TW",//语言别:zh_TW/zh_CN
   "acct": "tiptop",//存在T100的使用者
   "timestamp": "20151211123204361"
 },
 "service": {
   "prod": "T100",
   "name": "employee.name.get",//指定T100的服务名称,即接口名称
   "ip": "10.40.40.18",//服务器的ip地址,非必填
   "id": "topprd"//区域,正式区为topprd,测试区为toptst
 },
 "datakey": {
   "EntId": "99",// T100企业编码 (g_enterprise)
   "CompanyId": "DSCTC"//营运据点(g_site)
 },
 "payload": {
    "std_data": {
       "parameter": {
           "employee_no": "07375" //传输参数                                                      
        }
     }
 }
}

返回结果如下:

{
    "srvver": "1.0",
    "srvcode": "000",
    "datakey": null,
    "payload": {
        "std_data": {
            "execution": {
                "code": "0",//错误码, 0表示成功正常,非 0 则为错误
                "sql_code": "0",
                "description": "執行成功!"
            },
            "parameter": {
                "employee_no": "07375",
                "employee_name": "XXX"
            }
        }
    }
}
方法二

在浏览器中,直接输入接口请求的地址,如果显示Restful service is ok则表示T100RESTful 接口功能正常。

在这里插入图片描述

4、注册接口服务名

首先打开作业azzi700,点击操作栏中的加号按钮,进行新建接口作业,接口需要在这里进行注册创建。

在这里插入图片描述

这里需要注意以下几点:

  1. 在客制模式下,服务规格编号不能重复,并且格式必须为cwssp+三位数字,否则可能会出现如下情况的报错;

    cwss开头的情况:

    在这里插入图片描述

    如果不以cwss开头的情况:

    在这里插入图片描述

  2. WS服务名称即接口请求时的接口名称,不要出现中文;

  3. 服务版本根据实际情况进行选择:

    在这里插入图片描述

  4. 信息内容格式即数据传输的格式,分为jsonxml,现在基本上都是json格式,可以根据实际情况进行选择:

在这里插入图片描述

  1. 产品别根据自己的实际情况进行选择即可:

在这里插入图片描述

数据填写完成后,点击操作栏左上角的图标进行确定。随后会出现API文档语系清单这个菜单栏,这个菜单栏是存放接口文档的地方,可以进行接口文档的上传和下载。

在这里插入图片描述

如果有API文档,那么会出现如下界面:

在这里插入图片描述

5、下载程序

打开T100设计器,点击操作栏中的下载程序,进行接口作业的程序下载。

在这里插入图片描述

随后会打开一个名为adzp050的作业,你也可以在Xshell中打开这个作业进行程序的下载。

在左侧输入框中输入刚刚创建的作业编号,搜索出来后进行选择,然后点击签出,选择后进行下载即可。

在这里插入图片描述

下载进度条到达百分百后,则表示程序下载成功了,这个文件会存放在之前在T100设计器设置的文件夹中。

回到T100设计器,将下载下来的文件进行打开,程序文件的后缀是.tzc

在这里插入图片描述

打开后画面如下:

在这里插入图片描述

如果不执行其他业务逻辑的话,直接点击操作栏中的上传按钮,那么这个接口就算是完成了。

在这里插入图片描述

6、接口调用

接口请求的方式与前文中介绍的大同小异,如果不清楚或者忘记创建时的接口名称了,那么可以打开awsq990这个作业进行查询。在集成服务检测中查看接口方式与集成方式。其中集成方式就是当前环境的接口地址,这个地址可能存在服务器IP错误,还需要根据服务器的IP自行检测纠正。

在这里插入图片描述

在服务信息查询菜单中,你可以根据日期和服务名称等信息进行接口请求的信息查询,接口被调用的时间,哪个接口被调用,是否成功等。

在这里插入图片描述

其中红色的就是接口报错的情况,可以查看接口报错的日志等信息。

在这里插入图片描述

接口调用后,可以看到返回结果是成功的,这就表示接口是通的,可以根据实际需求修改。

在这里插入图片描述

如果使用的是Web service ,即XML格式的数据,那么需要使用T100 Soapui进行接口测试,具体流程参考T100 Soapui的操作手册。

7、代码编写

(1)定义传入参数
#add-point:自定义客户专用模块变量(Module Variable)
PRIVATE TYPE type_detail  RECORD   #传入单身数组
                isagseq          LIKE isag_t.isagseq,  #项次
                isag001          LIKE isag_t.isag001, #来源类型
                isag002          LIKE isag_t.isag002, #来源单号
                isag003          LIKE isag_t.isag003, #来源项次
                isag009          LIKE isag_t.isag009, #料号
                isag004          LIKE isag_t.isag004, #发票数量
                isag005          LIKE isag_t.isag005, #发票单位
                isag101          LIKE isag_t.isag101, #原币单价
                isag105          LIKE isag_t.isag105  #原币税后金额
                END RECORD
PRIVATE TYPE type_master  RECORD   #传入单头数组
                isaf003          LIKE isaf_t.isaf003,  #账款客户
                isafdocdt        LIKE isaf_t.isafdocdt, #单据日期
                isaf018          LIKE isaf_t.isaf018,  #税率
                isafud001        LIKE isaf_t.isafud001, #EDB对账单号
                END RECORD
PRIVATE TYPE type_return  RECORD   #返回数组
                code             LIKE type_t.chr20,
                sqlcode          LIKE type_t.chr20,
                description      LIKE type_t.chr1000,
                orderNo          LIKE type_t.chr50 #EDB销退单单号
                END RECORD
DEFINE l_master       RECORD
                requestData  DYNAMIC ARRAY OF type_master
                END RECORD
DEFINE l_return       RECORD
                reValue      DYNAMIC ARRAY OF type_return
                END RECORD
(2)返回输出参数
#返回值
CALL cl_aws_json_addParam(util.JSONObject.fromFGL(l_return))
(3)从JSON中获取参数
#取回 datakey 资料内容
LET g_ent = cl_aws_json_getValue("datakey","EntId")
LET g_company = cl_aws_json_getValue("datakey","CompanyId")
LET l_json_obj = cl_aws_json_getParam()

#将data 转入l_master record
CALL l_json_obj.toFGL(l_master)

IF l_json_obj IS NULL THEN
    LET g_status.code = "wss-00216"  #读入json 发生问题
    RETURN
END IF

#检查传入datakey是否为空
IF cl_null(g_ent) THEN
    LET g_status.code = "wss-00138"
    LET l_str = cl_replace_err_msg(cl_getmsg('wss-00138',g_dlang),'EntId')
    LET g_status.description = l_str
    RETURN
END IF
IF cl_null(g_company) THEN
    LET g_status.code = "wss-00138"
    LET l_str = cl_replace_err_msg(cl_getmsg('wss-00138',g_dlang),'CompanyId')
    LET g_status.description = l_str
    RETURN
END IF
(4)获取request传入参数内容
#############################################
# 描述……:获取request传入参数内容
# 备注……:
# 输入参数:p_json_obj:要获取的参数record
# 返回代码……:TRUE/FALSE:Boolean,执行是否成功
# :l_json_req_parm:JSONObject,request参数内容
#############################################

PUBLIC FUNCTION cl_ws_api_get_param(p_json_obj)
    DEFINE p_json_obj    util.JSONObject  #要获取的参数record
    DEFINE l_json_req_parm  util.JSONObject  #request参数内容
    DEFINE ls_jsonobj     STRING

    INITIALIZE l_json_req_parm TO NULL

    # 依xml,json格式个别处理,获取参数内容
    CASE g_content_type
        WHEN "1"  #XML格式
            #解析JSONObject,获取XML简单结构parameter参数资料
            LET l_json_req_parm = cl_ws_api_get_xml_param(p_json_obj)
            exit case
        WHEN "2"  #JSON格式
            #延用已有的function获取jsonObject "parameter"参数
            LET l_json_req_parm = cl_aws_json_getParam()
            exit case
        OTHERWISE
            INITIALIZE g_errparam TO NULL
            LET g_errparam.code = "lib-00448" #无法识别内容格式(g_content_type)
            LET g_errparam.popup = FALSE
            DISPLAY "error:无法识别内容格式(g_content_type),请确认传入格式!"
            RETURN FALSE, l_json_req_parm
    END CASE
    
    IF (g_json_datetype.getLength() > 0) AND (l_json_req_parm IS NOT NULL) THEN
    	# 有栏位要转换日期格式
    	LET ls_jsonobj = cl_aws_json_dateformat(l_json_req_parm.toString(),"OBJECT","","parameter")
    	LET l_json_req_parm = util.JSONObject.parse(ls_jsonobj)
	END IF
	#
	RETURN TRUE, l_json_req_parm
END FUNCTION
(5)常用方法举例
  • cl_aws_json_getValue()
    取得字段值
  • cl_aws_json_getParam()
    取得整个param段
  • l_json_obj.toFGL()
    将param段的数据转换读取到预定义变量
  • cl_aws_json_addParam(util.JSONObject.fromFGL(l_return))
    将返回变量自动加入response的json中
(6)业务逻辑

在进行具体的业务逻辑时,可能需要引入工具类等类库,需要在这个部分进行引入

在这里插入图片描述

例如添加一个util工具类

IMPORT os
IMPORT xml
#add-point:增加导入项目  name="global.import"
import util
#end add-point

具体编写业务逻辑的代码,可以放在这个部分中

在这里插入图片描述

例如获取数据,设定报错内容等:

PRIVATE FUNCTION cwssp419_process() RETURNS ()  #200213-00032
    #add-point: 服务逻辑主要处理段的ADP name="cwssp419.process"
    DEFINE l_json_obj          util.JSONObject
    TYPE type_header RECORD
    	imaa001 LIKE imaa_t.imaa001
    END RECORD
    TYPE type_detail RECORD
        imae001 LIKE imae_t.imae001
    END RECORD
    DEFINE param               RECORD
        imaaheader        type_header,
        imaadetail        DYNAMIC ARRAY OF type_detail
    END RECORD
    DEFINE r_return            RECORD
        code1               LIKE type_t.chr10
    END RECORD
    LET l_json_obj = cl_aws_json_getParam()
	# 获取传入的数据到param中
    IF l_json_obj IS NULL THEN
        INITIALIZE g_errparam TO NULL
        LET g_errparam.code = "wss-00216"  #读入json 发生问题
        LET g_errparam.extend = ''
        CALL cl_err()
        RETURN
    END IF

    #由JSONObject 转入Record
    CALL l_json_obj.toFGL(param)
    
    LET g_status.code = "!"
    LET g_status.description = "报错内容!"

    CALL cl_aws_json_addParam(util.JSONObject.fromFGL(r_return))
    #end add-point
END FUNCTION    

上传代码并请求后的结果如下,可以看到输出的提示已经变成了设定好的内容。

在这里插入图片描述

(7)报错编码

报错编码都存放在azzi920这个作业中,如下图所示:

在这里插入图片描述

8、接口调试

方法一

可以直接在awsq990中,针对某一个服务进度debug,也可以在查询对应的接口请求信息后,选中某个记录进行debug

在这里插入图片描述

方法二

每天请求的文件都存放在请求的日志文件中,可以打开日志文件进行查看

首先在Xshell中进入tmp文件夹

cd tmp

然后进入当天的日期文件夹

cd 日期 //如:20250507

然后输入ls,可以查看所有的请求日志

在这里插入图片描述

如果当天的接口请求记录较多,无法直接进行区分的话,进行可以根据接口请求的时间戳,进行查询

grep -n "20151211123204361" ./*

查询结果如下,可以看到文件名称就出来了

在这里插入图片描述

确定好日志文件后,我们进入到log文件夹,将这个文件进行打开

# 进入log文件夹
cd log
# 打开文件
grep -n "http_req_10:48:51.895_F645998B-4568-4206-A674-2C797031314D.xml" ./* 

打开后界面如下,然后复制红色框起来的内容,后续需要执行debug命令

在这里插入图片描述

然后进入到4gl的目录下。这一步需要注意,如果这个接口是客制的,那么是cwss,如果不是客制的,是在wss文件夹下。

cd cwss/4gl

可以在azzi700中进行区分,是否为客制。客制框勾选则为客制接口,否则为非客制接口。

在这里插入图片描述

进入文件夹后,直接输入刚刚复制的命令即可

r.dg cwssp419 '/ut/toptst/tmp/20250507/http_req_10:48:51.895_F645998B-4568-4206-A674-2C797031314D.xml'

随后会弹出Debug的窗口

在这里插入图片描述

唤出debug界面后,可以在需要进行调试的部分打上断点。具体的调试步骤与其他工具调试方法类似。

如果需要监视某个参数的值,可以点击debug页面上方的inspect按钮,在输入框中输入需要监视的参数,然后继续调试即可

在这里插入图片描述

常见的debug操作说明

在这里插入图片描述

在这里插入图片描述

如果需要传输文件的话,需要将文件转换成base64文件流的形式进行传输

二、T100作为客户端

请求外部的接口,需要根据对方的API格式进行请求,下面为请求范例。

PUBLIC FUNCTION cs_erp_http_req(p_req_url,p_pos_param)
    DEFINE req              com.HTTPRequest
    DEFINE resp             com.HTTPResponse
    DEFINE p_req_url        STRING
    DEFINE p_pos_param      STRING
    DEFINE l_str            STRING

    #LET p_req_url = p_req_url,"?id=",p_pos_param
    DISPLAY 'URL:',p_req_url
    LET req = com.HTTPRequest.Create(p_req_url)
	
	#设置请求格式,包括请求头,数据格式,请求方法等
    #CALL req.setHeader("Content-Type","application/json")
    CALL req.setCharset("UTF-8")
    CALL req.setHeader("ContentLength", p_pos_param.getLength())
    #CALL req.setHeader("ContentLength", 20000)
    CALL req.setMethod("POST")
    CALL req.doTextRequest(p_pos_param)
    CALL req.setConnectionTimeOut(120)

    LET resp = req.getResponse()

    #获取发送请求后服务器返回的状态码, 200为正常访问
    IF resp.getStatusCode() != 200 THEN
        DISPLAY "HTTP Error (" || resp.getStatusCode() || ") ", resp.getStatusDescription()
    ELSE
    #获取请求返回的json字符串
        LET l_str = resp.getTextResponse()
    END IF

    RETURN l_str
END FUNCTION
标题SpringBoot基于Web的图书借阅管理信息系统设计实现AI更换标题第1章引言介绍图书借阅管理信息系统的研究背景、意义、现状以及论文的研究方法和创新点。1.1研究背景意义分析当前图书借阅管理的需求和SpringBoot技术的应用背景。1.2国内外研究现状概述国内外在图书借阅管理信息系统方面的研究进展。1.3研究方法创新点介绍本文采用的研究方法和系统设计的创新之处。第2章相关理论技术阐述SpringBoot框架、Web技术和数据库相关理论。2.1SpringBoot框架概述介绍SpringBoot框架的基本概念、特点和核心组件。2.2Web技术基础概述Web技术的发展历程、基本原理和关键技术。2.3数据库技术应用讨论数据库在图书借阅管理信息系统中的作用和选型依据。第3章系统需求分析对图书借阅管理信息系统的功能需求、非功能需求进行详细分析。3.1功能需求分析列举系统应具备的各项功能,如用户登录、图书查询、借阅管理等。3.2非功能需求分析阐述系统应满足的性能、安全性、易用性等方面的要求。第4章系统设计详细介绍图书借阅管理信息系统的设计方案和实现过程。4.1系统架构设计给出系统的整体架构,包括前后端分离、数据库设计等关键部分。4.2功能模块设计具体阐述各个功能模块的设计思路和实现方法,如用户管理模块、图书管理模块等。4.3数据库设计详细介绍数据库的设计过程,包括表结构、字段类型、索引等关键信息。第5章系统实现测试对图书借阅管理信息系统进行编码实现,并进行详细的测试验证。5.1系统实现介绍系统的具体实现过程,包括关键代码片段、技术难点解决方法等。5.2系统测试给出系统的测试方案、测试用例和测试结果,验证系统的正确性和稳定性。第6章结论展望总结本文的研究成果,指出存在的问题和未来的研究方向。6.1研究结论概括性地总结本文的研究内容和取得的成果。6.2展望对图书借阅管理
摘 要 基于SpringBoot的电影院售票系统为用户提供了便捷的在线购票体验,覆盖了从注册登录到观影后的评价反馈等各个环节。用户能够通过系统快速浏览和搜索电影信息,包括正在热映及即将上映的作品,并利用选座功能选择心仪的座位进行预订。系统支持多种支付方式如微信、支付宝以及银行卡支付,同时提供积分兑换和优惠券领取等功能,增强了用户的购票体验。个人中心允许用户管理订单、收藏喜爱的影片以及查看和使用优惠券,极大地提升了使用的便利性和互动性。客服聊天功能则确保用户在遇到问题时可以即时获得帮助。 后台管理人员,系统同样提供了全面而细致的管理工具来维护日常运营。管理员可以通过后台首页直观地查看销售额统计图,了解票房情况并据此调整策略。电影信息管理模块支持新增、删除及修改电影资料,确保信息的准确及时更新。用户管理功能使得管理员可以方便地处理用户账号,包括导入导出数据以供分析。订单管理模块简化了对不同状态订单的处理流程,提高了工作效率。优惠券管理和弹窗提醒管理功能有助于策划促销活动,吸引更多观众。通过这样的集成化平台,SpringBoot的电影院售票系统不仅优化了用户的购票体验,也加强了影院内部的管理能力,促进了业务的发展和服务质量的提升。 关键词:电影院售票系统;SpringBoot框架;Java技术
内容概要:本文介绍了2025年中国网络安全的十大创新方向,涵盖可信数据空间、AI赋能数据安全、ADR(应用检测响应)、供应链安全、深度伪造检测、大模型安全评估、合规管理安全运营深度融合、AI应用防火墙、安全运营智能体、安全威胁检测智能体等。每个创新方向不仅提供了推荐的落地方案和典型厂商,还详细阐述了其核心能力、应用场景、关键挑战及其用户价值。文中特别强调了AI技术在网络安全领域的广泛应用,如AI赋能数据安全、智能体驱动的安全运营等,旨在应对日益复杂的网络威胁,提升企业和政府机构的安全防护能力。 适合人群:从事网络安全、信息技术、数据管理等相关工作的专业人士,尤其是负责企业信息安全、技术架构设计、合规管理的中高层管理人员和技术人员。 使用场景及目标:①帮助企业理解和应对最新的网络安全威胁和技术趋势;②指导企业选择合适的网络安全产品和服务,提升整体安全防护水平;③协助企业构建和完善自身的网络安全管理体系,确保合规运营;④为技术研发人员提供参考,推动技术创新和发展。 其他说明:文章内容详尽,涉及多个技术领域和应用场景,建议读者根据自身需求重点关注相关章节,并结合实际情况进行深入研究和实践。文中提到的多个技术和解决方案已在实际应用中得到了验证,具有较高的参考价值。此外,随着技术的不断发展,文中提及的部分技术和方案可能会有所更新或改进,因此建议读者保持关注最新的行业动态和技术进展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值