金蝶接口简介

​ 首先吐槽一下金蝶的api文档,由于金蝶是C#开发的,用C#能很方便地实现接口对接,因为他们有开发C#的工具类K/3 Cloud WebAPI进行接口的调用,并且把JSON的格式封装好了。但是JAVA就头疼了,调用接口的JSON格式和字段说明写的不清不楚,对接人员也爱理不理,回答问题牛头不对马嘴,最后只能靠网上资料来解决问题。金蝶系统复杂,这里记录一下我踩过的坑以及解决方案。

​ 这次对接接口主要是部门想将TAPD的工时记录列表导入金蝶的工时记录单,因此这里要调用工时记录单的接口,当时看到金蝶的接口,心里就忍不住吐槽了,登录,查看,删除能够一目了然,但是其他的这是什么?新增和修改呢?再看一下查看接口里的参数,没有经过培训完全看不懂,而且有的字段说是必录其实不录也行。


吐槽完了回到正题,多次询问金蝶对接人员之后才知道

1.查看是查询单条记录

2.单据查询是按条件查询多条记录

3.保存是修改和新增记录 (字段多得怀疑人生)

4.formid是表单模板的ID,要在BOS(创建表单模板的设计器)里面查

5.编码是记录的编号(不知道的还以为是字符编码)

登录接口

​ 因为要知道金蝶的JSON格式才能调接口,第一个想到的就是用postman,所以用它来测试登录以及cookie的获取,这里比较顺利,测试成功。其中parameters是必须的,其他可以不填。paramters里面填四个值分别是账套ID,用户名,密码,语言。其中账套ID要到金蝶的webapi里面查,这里是第一个坑,一般登录只要用户密码就行了,而这里还要用到额外的账套ID和语言。

​ 在postman成功调接口之后,尝试用java调,接口是调到了,但是显示用户密码错误。最大的嫌疑莫非就是JSON格式的错误,之后便进行各种debug,换JSON包,改JSON格式,换UTF-8,GBK编码等等操作,在这卡了一天无果。

​ 后来百度到金蝶论坛上的代码,便拿来试了试,成功登录了!看了下源码,它将JSON编码转为了UNICODE编码,原来用户密码错误就是这个原因,忍不住吐槽金蝶,文档写的太随便了。

​ 以下是这两个类的代码,它把每个接口的URL和需要的json格式封装好了,需要哪个接口就调哪个方法

InvokeHelper.java

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;import org.json.JSONArray;
import org.json.JSONObject;public class InvokeHelper {// K3 Cloud WebSite URL Example "http://192.168.19.113/K3Cloud/"public static String POST_K3CloudURL = "http://192.168.19.113/K3Cloud/";// Cookie 值private static String CookieVal = null;private static Map map = new HashMap();static {map.put("Save","Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.Save.common.kdsvc");map.put("View","Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.View.common.kdsvc");map.put("Submit","Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.Submit.common.kdsvc");map.put("Audit","Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.Audit.common.kdsvc");map.put("UnAudit","Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.UnAudit.common.kdsvc");map.put("StatusConvert","Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.StatusConvert.common.kdsvc");}// HttpURLConnectionprivate static HttpURLConnection initUrlConn(String url, JSONArray paras)throws Exception {URL postUrl = new URL(POST_K3CloudURL.concat(url));HttpURLConnection connection = (HttpURLConnection) postUrl.openConnection();if (CookieVal != null) {connection.setRequestProperty("Cookie", CookieVal);}if (!connection.getDoOutput()) {connection.setDoOutput(true);}connection.setRequestMethod("POST");connection.setUseCaches(false);connection.setInstanceFollowRedirects(true);connection.setRequestProperty("Content-Type", "application/json");DataOutputStream out = new DataOutputStream(connection.getOutputStream());UUID uuid = UUID.randomUUID();int hashCode = uuid.toString().hashCode();JSONObject jObj = new JSONObject();jObj.put("format", 1);jObj.put("useragent", "ApiClient");jObj.put("rid", hashCode);jObj.put("parameters", chinaToUnicode(paras.toString()));jObj.put("timestamp", new Date().toString());jObj.put("v", "1.0");out.writeBytes(jObj.toString());out.flush();out.close();return connection;}// Loginpublic static boolean Login(String dbId, String user, String pwd, int lang)throws Exception {boolean bResult = false;String sUrl = "Kingdee.BOS.WebApi.ServicesStub.AuthService.ValidateUser.common.kdsvc";JSONArray jParas = new JSONArray();jParas.put(dbId);// 帐套IdjParas.put(user);// 用户名jParas.put(pwd);// 密码jParas.put(lang);// 语言HttpURLConnection connection = initUrlConn(sUrl, jParas);// 获取CookieString key = null;for (int i = 1; (key = connection.getHeaderFieldKey(i)) != null; i++) {if (key.equalsIgnoreCase("Set-Cookie")) {String tempCookieVal = connection.getHeaderField(i);if (tempCookieVal.startsWith("kdservice-sessionid")) {CookieVal = tempCookieVal;break;}}}BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));String line;System.out.println(" ============================= ");System.out.println(" Contents of post request ");System.out.println(" ============================= ");while ((line = reader.readLine()) != null) {String sResult = new String(line.getBytes(), "utf-8");System.out.println(sResult);bResult = line.contains("LoginResultType");}System.out.println(" ============================= ");System.out.println(" Contents of post request ends ");System.out.println(" ============================= ");reader.close();connection.disconnect();return bResult;}// Savepublic static void Save(String formId, String content) throws Exception {Invoke("Save", formId, content);}// Viewpublic static void View(String formId, String content) throws Exception {Invoke("View", formId, content);}// Submitpublic static void Submit(String formId, String content) throws Exception {Invoke("Submit", formId, content);}// Auditpublic static void Audit(String formId, String content) throws Exception {Invoke("Audit", formId, content);}// UnAuditpublic static void UnAudit(String formId, String content) throws Exception {Invoke("UnAudit", formId, content);}// StatusConvertpublic static void StatusConvert(String formId, String content)throws Exception {Invoke("StatusConvert", formId, content);}private static void Invoke(String deal, String formId, String content)throws Exception {String sUrl = map.get(deal).toString();JSONArray jParas = new JSONArray();jParas.put(formId);jParas.put(content);HttpURLConnection connectionInvoke = initUrlConn(sUrl, jParas);BufferedReader reader = new BufferedReader(new InputStreamReader(connectionInvoke.getInputStream()));String line;System.out.println(" ============================= ");System.out.println(" Contents of post request ");System.out.println(" ============================= ");while ((line = reader.readLine()) != null) {String sResult = new String(line.getBytes(), "utf-8");System.out.println(sResult);}System.out.println(" ============================= ");System.out.println(" Contents of post request ends ");System.out.println(" ============================= ");reader.close();connectionInvoke.disconnect();}/*** 把中文转成Unicode码** @param str* @return*/public static String chinaToUnicode(String str) {String result = "";for (int i = 0; i < str.length(); i++) {int chr1 = (char) str.charAt(i);if (chr1 >= 19968 && chr1 <= 171941) {// 汉字范围 \u4e00-\u9fa5 (中文)result += "\\u" + Integer.toHexString(chr1);} else {result += str.charAt(i);}}return result;}
}

InvokeTest.java

import org.json.JSONObject;public class InvokeTest {public static void main(String[] args) throws Exception {InvokeHelper.POST_K3CloudURL = "";String dbId = "";String uid = "";String pwd = "";int lang = 2052;if (InvokeHelper.Login(dbId, uid, pwd, lang)) {// 销售订单保存测试// 业务对象Id//String sFormId = "SAL_SaleOrder";//需要保存的数据// 如下字段可能需要根据自己实际值做修改// FCustId FSalerId FMaterialId FUnitID//String sContent = "{"Creator":"String","NeedUpDateFields":["FBillTypeID","FDate","FBusinessType","FSaleOrgId","FCustId","FSettleCurrId","FSalerId","SAL_SaleOrder__FSaleOrderEntry","FMaterialId","FSettleOrgIds","FUnitID","FQty","SAL_SaleOrder__FSaleOrderFinance","FSettleCurrId","FLocalCurrId","FIsIncludedTax","FBillTaxAmount","FBillAmount","FBillAllAmount","FExchangeTypeId","FExchangeRate"],"Model":{"FID":0,"FBillTypeID":{"FNumber":"XSDD01_SYS"},"FBusinessType":"NORMAL","FSaleOrgId":{"FNUMBER":"100"},"FCustId":{"FNUMBER":"CUST0001"},"FSettleCurrId":{"FNUMBER":"PRE001"},"FSalerId":{"FNUMBER":"0002"},"SAL_SaleOrder__FSaleOrderFinance":{"FExchangeRate":6.8123},"SAL_SaleOrder__FSaleOrderEntry":[{"FMaterialId":{"FNUMBER":"001"},"FSettleOrgIds":{"FNUMBER":"100"},"FUnitID":{"FNumber":"个"},"FQty":10}]}}";//InvokeHelper.Save(sFormId, sContent);String formid="";//QWZE_WorkingHoursString content="{\"Number\":\"EMPGS201911280002\"}";System.out.println(content);InvokeHelper.View(formid, content);System.out.println("hola success");}}
}

查看接口

​ 这个接口我用postman调用失败了,用java调用也失败了(测试过多种json格式也不行),用它自带的测试接口反而可以成功调用,估计是它自带的接口会进行一些格式的验证和修改所以能成功,最终传出去的json是什么格式,由于我水平有限,不得而知,这个坑暂时无法解决,还希望大神指教。

java对接金蝶接口相关推荐

  1. java金蝶星空云金蝶Java 对接 金蝶云星空 接口 对接 金蝶API 对接 金蝶 接口 解决 会话失效 问题 会话已失效,请重新登录

    java金蝶星空云金蝶Java 对接 金蝶云星空 接口 对接 金蝶API 对接 金蝶 接口 解决 会话失效 问题 会话已失效,请重新登录 1.准备工作 1.1 接口调用账户 1.2 下载 金蝶星空云 ...

  2. Java对接金蝶云星空

    Java对接金蝶云星空 一:下载官方SDK 二:编写测试代码 三:登录授权成功 一:下载官方SDK 并将第三方包拉到project并pom引入 二:编写测试代码 K3CloudApiClient cl ...

  3. JAVA对接短信通知接口

    JAVA对接验证码短信接口DEMO示例 本文为您提供了JAVA语言版本的验证码短信接口对接DEMO示例 新用户注册·验证码短信.语音解决方案 * 接口类型:触发短信接口,支持发送验证码短信.订单通知短 ...

  4. java对接第三方接口

    1.准备与第三方接口对接的账号 配置到了Apollo上面 @Value("${taofake.appId}")private String appId;@Value("$ ...

  5. java 对接第三方接口

    感想 这是我第一次要写对外的接口,一开始还是比较迷茫的,因为要考虑到数据的安全传输,很多技术我都还是比较的不熟悉,后来经过对每一个技术的了解,终于还是写出来了. 感觉一切都是从陌生到熟悉,再到亲切 哈 ...

  6. Java调用金蝶接口

    //接口路径 // Kingdee.BOS.WebApi.ServicesStub.AuthService.ValidateUser.common.kdsvc #登录接口// Kingdee.BOS. ...

  7. java 对接webapi接口数据提交方式之 application/x-www-form-urlencoded

    Content-Type: application/x-www-form-urlencoded;charset=utf-8  这应该是最常见的 POST 提交数据的方式了.浏览器的原生 form 表单 ...

  8. java对接支付宝接口,客服给的参考代码

    public static void main(String[] args) { /** 支付宝网关 **/ String URL = "https://openapi.alipay.com ...

  9. Java 对接打印机接口

    1.下载TSCLIB.dll,将该文件放置到C:\Windows\System32下即可. 2.主要功能可以打印文字,图片,条码,二维码等信息(设备支持) 3.安装打印机驱动,配置相应的端口,usb, ...

  10. 2021.12.9 java代码对接sap接口(soap协议、webservice)

    2021.12.9 java对接sap接口(soap协议.webservice) 问题:对接sap接口,代码调试 执行: 1.soapui 软件测试是否能正确访问 未能正确访问,因为未在本地配置域名映 ...

最新文章

  1. UVALive 7070 The E-pang Palace 暴力
  2. 「图像分割模型」全景分割是什么?
  3. bnu 4067 美丽的花环
  4. boost::signals2模块实现为类定义后构造函数的示例
  5. 【Lucene4.8教程之中的一个】使用Lucene4.8进行索引及搜索的基本操作
  6. SAP ABAP刷新ALV 渲染刷新 (我也不太懂,反正就这么写了)
  7. 【Jmeter篇】jmeter Ant Jenkins接口自动化测试集成之半路逆转(二)
  8. Bash vs. Python:您应该使用哪种语言?
  9. python访问多个网页_如何使用python请求登录具有多个页面的CAS?
  10. 如何将html转为report,如何把Html5 Report Viewer添加到Web项目
  11. 【OpenCV学习笔记】【函数学习】十(常用的OpenCV函数汇总说明)
  12. 2021年度 Egon Balas 奖得主:达摩院印卧涛
  13. 如何让你的 x86 openwrt虚拟机上网
  14. 威联通NAS TS-873A 实测
  15. Win10如何使用命令释放IP和重新获取新IP
  16. Unrecoverable error: corrupted cluster config file.
  17. 公众号如何涨粉?会其中一种都可以让你爆粉
  18. navigator 导航标签
  19. [分享]高手是怎样炼成的:精妙SQL语句介绍
  20. 七、系统架构 - 伸缩性架构设计

热门文章

  1. 面向电缆行业的高级计划与排程(商简SPS)解决方案
  2. 简单的商品信息管理系统(Java 和sql server数据库)源码
  3. python实现超市商品销售管理系统_python实现超市商品销售管理系统
  4. 国内外中英文版一元购网站开发案例源码
  5. 什么新东西值得学「GitHub 热点速览 v.22.29」
  6. 数学建模线性规划之Lingo教程
  7. iPad PPT演示录屏踩坑及后续ffmpeg处理
  8. ipad分屏功能怎么开启_win10录屏功能怎么开启
  9. 支付宝小程序平台的IM聊天插件
  10. emu8086:汇编语言复制数组案例