Java调用U8标准API的那些事儿

Java调用U8标准API的那些事儿

业务背景

甲方提出需求,在MES系统中,回写数据到ERP系统中,并且,要实现ERP中的出库单要
能参照领料单生成,即不同单据之间,要有关联性

U8API?

在这里插入图片描述

虽然但是,U8API完全没听过,连概念都没听过,怎么搞?于是在网上查阅了大量的资料,整理了下面的内容。

难点分析

  1. U8API是什么?如何操作U8API? 有哪几种方式操作U8API? 各自对应的业务场景又是什么?
  2. U8API能保证单据之间的关联性吗?
  3. java如何调用U8API? http请求的方式?

下面逐一分析上面提到的难点

U8API的介绍

首先介绍下U8,U8API当然是基于U8这个平台的

U8是用友公司的一款ERP管理软件,一般部署在公司的内网中

那U8API其实就是一种操作U8的方式,具体来说就是,U8提供了一种方式(接口)来把数据写入U8平台的数据库。将数据写入U8的方式有多种,如下:

官方接口

1、OPENAPI

第三方系统部署在外网(互联网)与 U8 对接的场景。 限制:做不了上下游关联生单,比如采购入库单无法关联采购到货单;不支持事务。 优势:安全、接口定义面向消费者,使用相对最简单。数据标准:json,协议:https 安全性:接口调用需授权,企业对接口访问有完全控制权。

2、API

在API资源管理器中12.5后需要授权,第三方系统部署在内网,与 U8 服务器可以直接连接。 限制:开发的应用需要部署在装有 U8 的电脑上。 优势:可做上下游关联生单,性能最好,支持事务。 数据标准:开放语言中的对象类型 协议:无,直接 dll 引入调用 安全性:内网系统间对接安全性要求通常比较低

3、EAI

第三方系统部署在内网,与 U8 服务器可以直接连接。 限制:做不了上下游关联生单,比如采购入库单无法关联采购到货单;不支持事务。 优势:使用复杂度在 openapi 与 api 之间。数据标准:xml。协议:http。安全性:内网系统间对接安全性要求通常比较低

sql语句

可以通过直接更新U8的数据库实现,但是ERP是一个庞大的系统,对于业务表直接去做更新新增动作,如果不是对于所有数据表以及ERP的运行逻辑非常熟悉,可能会导致数据不一致等等一系列问题。

通过以上内容,可以看出,U8API是可以实现单据关联的,所以接下来就是java如何调用U8API的问题了

Java如何调用U8API

首先,明确一点,java是不能直接调用U8API的,当然这和U8部署在内网没关系,U8API是基于C#开发的,需要引用特定的DLL依赖而这些DLL依赖并没有对应的jar包依赖,所以java是没办法直接调用U8API的(我在前期不知道这一点,浪费了一天时间)。那业务怎么开展呢?很简单,找一个C#开发的人,把U8API封装下,对外保暴露服务接口,给第三方的系统调用。

总体思路

  1. C#二开U8API,对外暴露接口,给第三方系统调用(http请求)
  2. java调用C#提供的接口,传递业务是数据

于是,业务正式开展了…

C#二开U8API环境的搭建

1 框架选择:使用.NET Framework

  • 切记不要使用.NET CORE 6、5这种新框架,因为项目需要调用用友提供的DLL文件,文件里面很多代码都是.NET Framework特有的,使用.NET CORE会跑不起来。
  • 比如构造APIBroker,底层代码会执行:System.Activator.GetObject(),这个方法是.NET Framework特有

2 项目平台选择:X86

  • 默认是Any CPU,切记不要使用Any CPU
  • 不使用X86,即使有些DLL已经在项目中引用,也会报错找不到某些DLL

3 需要引用的DLL

  • 注意:所有的DLL必须引用U8安装文件夹内的(D:U8SOFT),不能复制出来再引用,这种也会报错!

  • 注意观察图片中所有DLL的路径!

    在这里插入图片描述

4 Interop.MSXML2的嵌入互操作改成False

在这里插入图片描述

5 参考U8内部API文档

注意,U8API的文档不完全正确,遇到的问题会有很多,这里简单说明,下面的内容会总结我的同事遇到的问题

C#调用U8API遇到的错误

1 文档中login的dll文件替换

如果是非门户的独立进程,请将U8SOFT\ufcomsql目录中的U8Login.dll替换为Debug版的Login。

对于这个问题,我们通过甲方,向U8的客服提问了,他们给出的回复是

高版本的U8不需要替换dll文件了,我们的版本是U816+,只需要修改注册表,就可以了

2 关于示例代码中获取U8 login对象参数的问题

没有注释,所以我们也不知道这个字段的含义,踩了许多坑…

//第一步:构造u8login对象并登陆(引用U8API类库中的Interop.U8Login.dll)
			//如果当前环境中有login对象则可以省去第一步
			U8Login.clsLogin u8Login = new U8Login.clsLogin();
			String sSubId = "AS"; //根据U8API文档来,是什么,就是什么,不要改
			String sAccID = "(default)@888"; //这个是账套号,注意888是示例,具体的账套号,要根据实际情况,但是要带上前面的内容,(default)@ 或者 default@
			String sYear = "2008";//年份
			String sUserID = "demo";//登录U8平台的账号密码,注意不是账套号里面的账号密码
			String sPassword = ""; //登录U8平台的账号密码,注意不是账套号里面的账号密码
			String sDate = "2008-11-11";//日期
			String sServer = "localhost"; //这里应该是U8API保存数据的数据库的地址,而不是U8服务的地址,当然如果U8API的数据库地址和U8在同一台电脑,就是本地地址。这里很容易被误导,认为是U8的服务器地址
			String sSerial = "";//给空

3 U8登录对象的问题

每次调用U8PAI,就需要获取一个新的U8登录对象,不能把这个登录对象作为全局变量使用

4 关于U8API文档中必填字段的说明

不准确,有些U8API的接口必填字段,不一定是必填;非必填的,可能是必填的字段,需要结合具体的接口来。反正如果在只是按照文档传必填参数的话,多半会报错

ERP验证上下游单据的关联性

需要到ERP系统中,具体操作,例如在出库单的界面,点击新增,看是否能显示我们使用U8API插入的领料单

总结

写这个业务,浪费了很多时间,其实总体的难度并不大,只是官方关于二开的资料太少,导致在写代码的时候,报各种错误。最好的方式,找一个U8的客服,问清楚U8API二开的具体步骤,以及注意事项。遇到实在是解决不了的问题,就直接向U8的客服提问,让他们来回答(找甲方要一个账号,去官网论坛提问)

参考链接

  • 简书 https://www.jianshu.com/p/26a16e515e00
  • CSDN https://blog.csdn.net/wyqihsj/article/details/109137339
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Java调用Windows系统API需要使用Java Native Interface(JNI),其主要步骤如下: 1.定义Native方法,用于声明要调用的Windows API函数。 2.编写C/C++代码实现Native方法。 3.将C/C++代码编译成动态链接库(DLL)。 4.在Java代码中加载动态链接库,并调用Native方法。 具体实现步骤如下: 1.定义Native方法 在Java代码中,使用native关键字声明要调用的Windows API函数,例如: ``` public class WinAPI { public static native int MessageBoxA(int hWnd, String lpText, String lpCaption, int uType); } ``` 2.编写C/C++代码实现Native方法 在C/C++代码中,实现声明的Native方法,并使用Windows API函数实现其功能。例如: ``` #include <windows.h> #include "WinAPI.h" JNIEXPORT jint JNICALL Java_WinAPI_MessageBoxA(JNIEnv *env, jclass cls, jint hWnd, jstring lpText, jstring lpCaption, jint uType) { const char *c_lpText = env->GetStringUTFChars(lpText, NULL); const char *c_lpCaption = env->GetStringUTFChars(lpCaption, NULL); int result = MessageBoxA((HWND)hWnd, c_lpText, c_lpCaption, (UINT)uType); env->ReleaseStringUTFChars(lpText, c_lpText); env->ReleaseStringUTFChars(lpCaption, c_lpCaption); return result; } ``` 3.将C/C++代码编译成动态链接库(DLL) 使用Visual Studio等工具编译C/C++代码,生成动态链接库(DLL)文件。 4.在Java代码中加载动态链接库,并调用Native方法 使用System.loadLibrary()方法加载动态链接库,例如: ``` public class Main { static { System.loadLibrary("WinAPI"); } public static void main(String[] args) { WinAPI.MessageBoxA(0, "Hello World!", "Message", 0); } } ``` 以上是Java调用Windows系统API的基本流程,需要注意的是,由于Java是跨平台的语言,因此在使用Windows API时需要特别注意函数参数和返回值的类型和大小。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值