金蝶接口简介
首先吐槽一下金蝶的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(