跳到主要内容

ERP 接口和测试工具介绍

一、ERP 接口概述​

ERP 接口用于 T 系列 ERP 与外围系统的集成,将 ERP、T-Code、T-BOSS 协调为一个整体。接口以 HTTP API 形式提供,第三方系统通过标准协议调用即可与 ERP 进行数据交互。

什么是 API 接口​

API(Application Programming Interface,应用程序接口)是一组预先定义的函数,允许应用程序与开发人员基于某软件或硬件进行交互,无需访问源码或理解内部工作机制。

知乎上关于 API 的解释

实际应用场景​

场景一:T-Code 与 ERP 对接​

T-Code 是手机端仓库管理系统。仓库人员在 T-Code 上操作出入库,数据通过 ERP 接口与 ERP 实时同步。

以采购入库单为例:ERP 提供「登录接口」和「单据保存接口」,T-Code 完成登录后录入采购入库单,保存时直接调用 ERP 的单据保存接口,生成一张 ERP 中的采购入库单——无需 T-Code 重写存盘逻辑。

场景二:第三方系统集成​

客户自定义程序(如 WMS、PLM)通过调用 ERP 接口,将自有系统的数据同步到 ERP。例如客户开发的小程序需要生成采购入库单,只需按接口规范传参调用即可。

二、接口调用流程​

2.1 获取登录凭证​

调用接口前需通过「登录接口」获取 LoginId。LoginId 是此次登录的身份标识,后续所有接口调用都必须在 Headers 中传入。

2.2 调用业务接口​

以「单据保存接口」为例,在 Headers 中传入 LoginId,Body 中按规范传入 HeadData(表头)和 BodyData(表身)即可完成单据新增或修改。

2.3 接口基本信息​

登录接口​

信息值备注
接口名称用户登录根据语言别、授权凭证等实现用户登录
请求状态POSTRESTful 方式
接口路径http://localhost:23798/api/User/login向服务器地址发送 POST 请求

请求参数(登录接口)​

Headers​
参数名称参数值是否必须示例备注
Languageid0是客户端语言别,0:简体 1:繁体 2:英文
Authorization是Basic REVNT19BRE1JTjoxMjM=授权凭证,由 登录代号_操作员代号:密码 组成字符串的 Base64 加密值
ClientType否TestMgr用户自定义的客户端识别号
Content-Type否application/json用于指定数据的传输类型
Key否ccd105791a7447e58638b43XXXXXXX46验证注册网上的授权码
返回数据(登录接口)​
名称类型是否必须备注其他信息
LoginIdstring否返回的 LoginId
CompNostring否帐套代号
UserNostring否操作员代号
LoginIdExpirynumber否登录超时时间(秒)
ClientTypestring否客户端自定义识别号
LanguageIdnumber否客户端语言别
调用范例(登录接口)​

返回的 JSON:

{
"LoginId": "e835943e-55c2-4bf0-832d-6f4166592941",
"CompNo": "DEMO",
"UserNo": "ADMIN",
"LoginIdExpiry": 604800,
"ClientType": "WMS",
"LanguageId": 0
}
备注​
  • 向服务器发送 POST 请求,请求参数按实际录入,返回 LoginId 等字段。
  • 先判断返回的 HttpStatusCode 是否为 200,是则表示调用成功,否则返回错误信息。
  • 登录接口不需要频繁调用,只有当没有获得 LoginId 或登录已超时后才需要再次调用。LoginIdExpiry 以秒为单位,调用前记录本地时间,接口返回后加上 LoginIdExpiry 值即为下次需要重新登录的时机。
  • 除登录接口外,其他接口调用必须在 Headers 中传入 LoginId。
备注

所有接口都以 JSON 格式返回。

单据保存接口​

信息值备注
接口名称单据保存、修改根据单据 ID 新增或修改单据
请求状态POSTRESTful 方式
接口路径http://localhost:23798/api/Bill/SaveBill向服务器地址发送 POST 请求
Headers(单据保存)​
参数名称参数值是否必须示例备注
Content-Typeapplication/json是用于指定数据的传输类型
LoginId是e835943e-55c2-4bf0-832d-6f4166592941用户登录的 LoginId
Body(单据保存)​
数据名称字段名称类型是否必须默认值示例备注其他信息
HeadDataobject必须表头数据
EntryOrderIdstring非必须WMS调用方业务编码调用方唯一编码,关联 ERP 单据,避免重复提交。重复时返回提示
CallIdstring必须PC调用的单据识别号"SA":销售出库单,"PC":采购入库单
CusNostring非必须CS001厂商代号
DepNostring非必须CGB部门代号
SalNostring非必须CG001业务员代号
Remstring非必须这是表头备注备注
UsrNostring非必须ADMIN制单人账套验证的 LoginId 需添加 UsrNo,用户登录则无需
ExtendPropsobject非必须"CUS_OS_NO":"OS0C220001","ZDY":"自定义"扩展功能字段名需与数据库表名一致
BodyDataobject []必须表身数据item 类型: object
BilIdstring非必须PO转入来源单识别号"PO":表示采购订单
BilNostring非必须PO0C220001转入来源单单号
BilItmnumber非必须1转入来源单项次
PrdNostring非必须YL1货品代号
WhNostring非必须003仓库代号
BatNostring非必须PH01批号
PrdMarkstring非必须TZ01特征
PrdLocstring非必须CW01储位
Unitstring非必须1单位
Qtynumber非必须3主数量
Qty1number非必须6副数量
Upnumber非必须2主单价
Up1number非必须1副单价
Taxnumber非必须1税金
DisCntnumber非必须9折扣
Remstring非必须这是表身摘要摘要
ExtendPropsobject非必须"Valid_DD":"2020-12-23","ZDY":"自定义","SEQ_ITM":1扩展功能字段名需与数据库表名一致
返回数据(单据保存)​
名称类型是否必须示例备注其他信息
EntryOrderIdstring非必须WMS调用方业务编码
CallIDstring非必须PC调用的单据识别号
CallNOstring非必须PC0C240001生成的单据号码
CallOKstring非必须T执行是否成功,是:"T" 否:"F"
Dataobject非必须"TF_TABNAME": "TF_PSS","BIL_ITM": "0","MF_TABNAME": "MF_PSS","BIL_NO": "PC0C100005","BIL_ID": "PC"单据信息,JSON 字符串格式
ErrorStrstring非必须错误信息
调用范例(单据保存)​

Request

无来源:

{
"HeadData": {
"EntryOrderId": "WMS",
"CallId": "PC",
"CusNo": "CS001",
"DepNo": "0000"
},
"BodyData": [
{
"PrdNo": "1001",
"Qty": 12.5
},
{
"PrdNo": "1002",
"Qty": 1
}
]
}

有来源(添加其他参数代表修改转入数据,如 BodyData 中 "Qty":3 代表修改来源单数量为 3):

{
"HeadData": {
"EntryOrderId": "WMS",
"CallId": "PC",
"CusNo": "CS001",
"DepNo": "0000"
},
"BodyData": [
{
"BilId": "PO",
"BilNo": "PO0C210001",
"BilItm": 1
}
]
}

Response

{
"EntryOrderId": "WMS",
"CallID": "PC",
"CallNO": "PC0C240001",
"CallOK": "T",
"Data": "{\r\n \"TF_TABNAME\": \"TF_PSS\",\r\n \"BIL_ITM\": \"0\",\r\n \"MF_TABNAME\": \"MF_PSS\",\r\n \"BIL_NO\": \"PC0C240001\",\r\n \"BIL_ID\": \"PC\"\r\n}",
"ErrorStr": ""
}
备注(单据保存)​
  • 必须在 Headers 中传入用户登录或账套验证的 LoginId。
  • 采用账套验证获取的 LoginId 时,HeadData 中 UsrNo 不能为空。用户登录则无需添加 UsrNo。
  • Body 中 JSON 字段尽量不要添加赋空值的字段。
  • ExtendProps 为扩展字段,需要对应数据库表的字段,自定义字段同样在这里处理。
  • 统一字段与接口所需数据库表字段重复时,只取统一字段的值。
  • 接口程序不处理审核,无审核流直接终审,有审核流处于未审状态。
  • 可查看后台表 LOG_BILLSAVE 查看执行信息。
  • 当 EntryOrderId 不为空时,可查看后台表 LOG_OTHERSAVE 查看单据关联信息。

2.4 C# 代码示例​

以下以 C# 语言为例,展示开发过程中调用登录接口和单据保存接口的代码。

private void btnGetLoginId_Click(object sender, EventArgs e) {
// Basic 64 加密:账套代号_操作员代号:密码
string authorization = "DEMO_ADMIN:";
byte[] b = System.Text.Encoding.Default.GetBytes(authorization);
authorization = "Basic " + Convert.ToBase64String(b);

HttpWebRequest request = (HttpWebRequest) WebRequest.Create("http://localhost:23798/api/User/login");
request.Headers["Authorization"] = authorization;
request.Headers["Languageid"] = "0";
request.Headers["ClientType"] = "WMS";
request.Method = "POST";
request.ContentType = "application/json";
string bodyString = "";

byte[] buffer = Encoding.UTF8.GetBytes(bodyString);
request.ContentLength = buffer.Length;
try {
request.GetRequestStream().Write(buffer, 0, buffer.Length);
using(HttpWebResponse response = (HttpWebResponse) request.GetResponse()) {
using(StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8)) {
MessageBox.Show(reader.ReadToEnd());
}
}
} catch (Exception ex) {
MessageBox.Show(ex.Message);
}
}
// 保存单据(单据保存接口)
private void btnSaveBill_Click(object sender, EventArgs e) {
HttpWebRequest request = (HttpWebRequest) WebRequest.Create("http://localhost:23798/api/Bill/SaveBill?CallID=PC&isConfirm=F");
request.Headers["LoginId"] = "e835943e-55c2-4bf0-832d-6f4166592941";
request.Headers["ClientType"] = "WMS";
request.Method = "POST";
request.ContentType = "application/json";

string bodyString = "{\"HeadData\": {\"EntryOrderId\":\"WMS\",\"CallId\":\"PC\",\"CusNo\": \"CS01\",\"DepNo\": \"0001\"},\"BodyData\": [{\"PrdNo\": \"1001\",\"Qty\": \"12.5\"},{\"PrdNo\": \"1002\",\"Qty\": \"1\"}]}";

byte[] buffer = Encoding.UTF8.GetBytes(bodyString);
request.ContentLength = buffer.Length;
try {
request.GetRequestStream().Write(buffer, 0, buffer.Length);
using(HttpWebResponse response = (HttpWebResponse) request.GetResponse()) {
using(StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8)) {
MessageBox.Show(reader.ReadToEnd());
}
}
} catch (Exception ex) {
MessageBox.Show(ex.Message);
}
}

三、JSON 简介​

所有接口都以 JSON 格式返回。JSON(JavaScript Object Notation)是一种与开发语言无关的轻量级数据存储格式,用于存储和交换文本信息,几乎每种开发语言都有处理 JSON 的 API。

优点:易于阅读和编写,易于程序解析与生成。

数据结构​

数据结构Object(无序的键-值集合)Array(有序的值集合)
结构样式{key:value, key:value…}[value, value…]
举例{"小明": "50分", "小红": "99分"}[1, "hi"]

JSON 数据示例​

{
"APP": [
{
"name": "天猫",
"role": "买买买",
"carts": [
{ "name": "洗发水", "price": "50" },
{ "name": "沐浴露", "price": "60" }
]
},
{
"name": "京东",
"role": "买买买",
"carts": [
{ "name": "键盘", "price": "300" },
{ "name": "鼠标", "price": "300" }
]
}
]
}

四、接口测试​

4.1 调用准备​

  • 运行 ServrConfig 启动 ERP 服务
  • 云主机上防火墙开通 23788、23798 端口
  • ERP 序列号需要注册接口系统或条码系统
  • 如需使用单据打印接口,请配置服务的模拟帐户
  • 可访问 http://localhost:23798/api/help 获取帮助

启动服务

开通端口

注册条码系统

服务控制台

4.2 单据查询接口​

基本信息(单据查询)​

信息值备注
接口名称单据查询根据单据 ID、单据号码、单据项次查询单据信息
请求状态GETRESTful 方式
接口路径http://localhost:23798/api/Bill/QueryBill向服务器地址发送 GET 请求

请求参数(单据查询)​

Headers​
参数名称参数值是否必须示例备注
Content-Typeapplication/json是用于指定数据的传输类型
LoginId679e0b11-8483-428c-82bd-83383b57e9f5是用户登录的 LoginId
Query Params​
参数名称是否必须示例备注
CallID是CallID=PO调用的单据识别号
Bil_Id是Bil_Id=PO查询单据 ID
Bil_No是Bil_No=PO0C110001查询单据号码
Bil_Itm是Bil_Itm=0查询单据项次

返回数据(单据查询)​

名称类型是否必须示例备注其他信息
EntryOrderIdstring非必须WMS调用方业务编码
CallIDstring非必须PC调用的单据识别号
CallNOstring非必须PC0C240001单据号码
CallOKstring非必须T执行是否成功,是:"T" 否:"F"
Dataobject非必须json 格式数据单据信息,JSON 字符串格式
ErrorStrstring非必须错误信息

4.3 Postman 测试工具​

Postman 是一款接口测试工具,支持发送任何类型的 HTTP 请求(GET/PUT/POST/DELETE),通过填写 URL、Headers、Body 等即可发送请求。

安装与创建请求:

打开 Postman 程序,跳过登录和更新提示。弹出创建提示时选择创建 Collection,录入名称后点击 Create 创建。

Postman 创建 Collection

Postman 创建请求

若关掉了创建窗口,可在主界面点击 New 按钮或新增图标重新打开。

Postman 新建按钮

测试步骤:

需要创建两个请求:用户登录请求和采购订单查询请求。先通过登录请求获取 LoginId,再传入查询请求。

Step 1:用户登录请求

  1. 请求类型选择 POST,地址输入 http://localhost:23798/api/User/login
  2. 点击 Authorization 页签,TYPE 选择 Basic Auth,Username 输入 DEMO_ADMIN(格式为 账套代号_用户名),Password 输入密码
  3. 点击 Preview Request 后 Headers 中自动生成 Authorization 参数

Postman 登录授权

  1. 在 Headers 页签下输入其他参数,如 Languageid、ClientType、Content-Type
  2. 点击 Send,下方 Body 页签显示返回数据,从中找到 LoginId

Postman 登录返回

  1. 可点击 Save 保存请求,录入名称后点击 save to 保存

Postman 保存请求

Step 2:采购订单查询请求

  1. 点击 + 新建请求,类型选择 GET,地址输入 http://localhost:23798/api/Bill/QueryBill

  2. 在 Params 页签下输入参数 CallID、Bil_Id、Bil_No、Bil_Itm 及对应值

    也可直接在地址栏输入完整 URL:http://localhost:23798/api/Bill/QueryBill?CallID=PO&Bil_Id=PO&Bil_No=PO0C110001&Bil_Itm=0,参数会自动解析到 Params 页签。

Postman Params

  1. 在 Headers 页签输入 Content-Type: application/json 和 LoginId(值为 Step 1 返回的 LoginId)
  2. 点击 Send,下方 Body 显示返回数据。返回数据中包含 HEADDATA、BODYDATA1 等字段时表示调用成功。同时可查看 Status,200 表示请求通过

Postman 查询返回

Step 3:添加测试断言(可选)

在 Tests 页签编写判断逻辑,验证返回数据是否正确:

pm.test("检测是否返回HEADDATA字段", function () {
pm.expect(pm.response.text()).to.include("HEADDATA");
});

点击 Send 运行后,查看 Test Results 页签:绿色 PASS 表示通过,红色 FAIL 表示失败。

Postman 测试结果

JSON 格式化:

返回的 JSON 数据可能不易阅读,可使用在线 JSON 解析工具(如 https://www.sojson.com/),将数据粘贴后点击格式化,即可得到清晰的键值结构。

JSON 解析

JSON 格式化结果

保存请求:

点击 Save 保存请求,保存后在左侧可展开查看已保存的请求。

Postman 保存

Postman 请求列表

Postman 还有其他丰富功能,可自行查阅教程。其他接口测试工具如 Restlet Client、Mockbin 等,原理类似,按需选用即可。

4.4 现有接口类型​

接口名称接口类型请求类型接口路径
用户登录登录POSThttp://localhost:23798/api/User/login
账套验证账套验证POSThttp://localhost:23798/api/WMS/GetToken
单据保存、修改单据操作POSThttp://localhost:23798/api/Bill/SaveBill
单据打印单据操作POSThttp://localhost:23798/api/Bill/PrintBillReport
单据审核单据操作POSThttp://localhost:23798/api/audit/executeaudit
单据查询单据操作GEThttp://localhost:23798/api/Bill/QueryBill
单据删除单据操作POSThttp://localhost:23798/api/Bill/DeleteBill
查询视窗查询GEThttp://localhost:23798/api/Bill/QueryWin_GetData
货品履历查询查询GEThttp://localhost:23798/api/MrpCZ/GetMrpCZData
货品库存查询查询GEThttp://localhost:23798/api/TbrECC/GetPrdStock_One
详细资料查询查询GEThttp://localhost:23798/api/Bill/QueryDataDetail

4.5 现有单据 CallID 列表​

以下单据均支持新增、删除、修改、查询接口:

CallID单据名称CallID单据名称
PO采购订单IJ库存调整单
SO销售订单T6采购入库送检
PC采购入库单TY采购入库验收
PB采购入库退回单TP生产缴库验收
SB销售出库退回单W1库存入仓单
TW托外加工单WO库存出仓单
WT批次托外单MM成品缴库单
TC托工退回单M2生产退料
M4托工领料M3生产补料
M5托工退料YB采购验收退回
M6托工补料YM制成品验收退回
M7非生产领料YK托工验收退回
M8非生产退料MBBOM 组合生产单
IC库存调拨单MDBOM 切割分装单
MC原料调拔单MX入不良品仓
PI盘点单CK备货单
PJ盘点单(批号)PN订单变更

五、HTTP 协议基础​

5.1 HTTP 协议​

HTTP(HyperText Transfer Protocol,超文本传输协议)是基于 TCP/IP 之上的应用层协议,遵循请求(Request)/响应(Response)模型。

HTTP 请求-响应模式

请求报文构成:

  1. 请求行(Request Line):请求方法、URL、协议/版本
  2. 请求头(Request Header)
  3. 请求正文(Request Body)
POST /test.html HTTP/1.1               // 请求行
HOST:www.test.com?indexid=2 // 请求头
Content-Length: 16
Content-Type: text/html
// 空行,请求头结束
Username=admin&password=admin // 请求正文

响应报文构成:

  1. 响应行(Response Line)
  2. 响应头(Response Header)
  3. 响应正文(Response Body)
HTTP/1.1 200 OK                        // 响应行
Date: Sun, 15 Nov 2015 11:02:04 GMT // 响应头
Content-Length: 360
Content-Type: text/html
// 空行,响应头结束
<html> // 响应正文
<body>Hello World</body>
</html>

5.2 HTTPS 协议​

HTTP 存在以下问题:请求信息明文传输、数据完整性未校验、无身份验证机制。

HTTPS 在 HTTP 基础上加入 SSL/TLS 层,通过 SSL 证书验证服务器身份并对通信进行加密。

HTTPS 数据传输模式

HTTPS 与 HTTP 的区别:

HTTPHTTPS
安全性明文传输SSL/TLS 加密
默认端口80443
证书不需要需要申请 SSL 证书

5.3 Base64 加密​

使用 Postman 测试时可通过自带的 Base64 加密对账套用户名密码加密。如工具不带此功能,可使用在线加密工具。

示例:打开站长工具在线加密网址,将 账套代号_用户代号:密码 录入左边,点击"Base64 加密",右边显示加密结果。将 Basic 与加密结果用空格拼接即为 Authorization 参数值。

例如账套代号 DEMO,用户代号 ADMIN,密码 123,加密结果为 REVNT19BRE1JTjoxMjM=,最终 Authorization 值为 Basic REVNT19BRE1JTjoxMjM=。

在线加密工具