跳到主要内容

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 获取登录凭证

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

2.2 调用业务接口

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

2.3 接口基本信息

登录接口

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

请求参数(登录接口)

Headers
参数名称参数值是否必须示例备注
Languageid0客户端语言别,0:简体 1:繁体 2:英文
AuthorizationBasic REVNT19BRE1JTjoxMjM=授权凭证,由 登录代号_操作员代号:密码 组成字符串的 Base64 加密值
ClientTypeTestMgr用户自定义的客户端识别号
Content-Typeapplication/json用于指定数据的传输类型
Keyccd105791a7447e58638b43XXXXXXX46验证注册网上的授权码
返回数据(登录接口)
名称类型是否必须备注其他信息
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用于指定数据的传输类型
LoginIde835943e-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 时,HeadDataUsrNo 不能为空。用户登录则无需添加 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 服务
  • 云主机上防火墙开通 2378823798 端口
  • 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
参数名称是否必须示例备注
CallIDCallID=PO调用的单据识别号
Bil_IdBil_Id=PO查询单据 ID
Bil_NoBil_No=PO0C110001查询单据号码
Bil_ItmBil_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 页签下输入其他参数,如 LanguageidClientTypeContent-Type
  2. 点击 Send,下方 Body 页签显示返回数据,从中找到 LoginId

Postman 登录返回

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

Postman 保存请求

Step 2:采购订单查询请求

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

  2. Params 页签下输入参数 CallIDBil_IdBil_NoBil_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/jsonLoginId(值为 Step 1 返回的 LoginId)
  2. 点击 Send,下方 Body 显示返回数据。返回数据中包含 HEADDATABODYDATA1 等字段时表示调用成功。同时可查看 Status200 表示请求通过

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=

在线加密工具