java对接金蝶接口

金蝶接口简介

​ 首先吐槽一下金蝶的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");
        }

        // HttpURLConnection
        private 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;
        }

        // Login
        public 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);// 帐套Id
                jParas.put(user);// 用户名
                jParas.put(pwd);// 密码
                jParas.put(lang);// 语言

                HttpURLConnection connection = initUrlConn(sUrl, jParas);
                // 获取Cookie
                String 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;
        }

        // Save
        public static void Save(String formId, String content) throws Exception {
    
    
                Invoke("Save", formId, content);
        }

        // View
        public static void View(String formId, String content) throws Exception {
    
    
                Invoke("View", formId, content);
        }

        // Submit
        public static void Submit(String formId, String content) throws Exception {
    
    
                Invoke("Submit", formId, content);
        }

        // Audit
        public static void Audit(String formId, String content) throws Exception {
    
    
                Invoke("Audit", formId, content);
        }

        // UnAudit
        public static void UnAudit(String formId, String content) throws Exception {
    
    
                Invoke("UnAudit", formId, content);
        }

        // StatusConvert
        public 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_WorkingHours
                 String content="{\"Number\":\"EMPGS201911280002\"}";
        	 	 System.out.println(content);
                 InvokeHelper.View(formid, content);
                 System.out.println("hola success");
         }
	 }
}

查看接口

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

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Heqinze/article/details/105842863