介绍
网上关于java调用sap接口的相关资料少得可怜,为了大家更方便,我把开发过程中使用到的sap调用方式以文字+代码介绍出来
- 基本使用,首先得把sap相关环境弄好,网上挺多的,我就不去做重复工了
private static final Logger log = LoggerFactory.getLogger(SapApi.class); private static final String ABAP_AS_POOLED = "ABAP_AS_WITH_POOL"; static{ Properties connectProperties = new Properties(); connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, "xxxxx");//测试服务器 connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR, "xx"); //系统编号 connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, "xxx"); //客户端编号 connectProperties.setProperty(DestinationDataProvider.JCO_USER, "xxx"); //SAP用户名 connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, "xxxxxx"); //密码 connectProperties.setProperty(DestinationDataProvider.JCO_LANG, "zh"); //登录语言 connectProperties.setProperty(DestinationDataProvider.JCO_POOL_CAPACITY, "3"); //最大连接数 connectProperties.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT, "10"); //最大连接线程 createDataFile(ABAP_AS_POOLED, "jcoDestination", connectProperties); } /** * 创建SAP接口属性文件。 * @param name ABAP管道名称 * @param suffix 属性文件后缀 * @param properties 属性文件内容 */ private static void createDataFile(String name, String suffix, Properties properties){ File cfg = new File(name+"."+suffix); if(cfg.exists()){ cfg.deleteOnExit(); } try{ FileOutputStream fos = new FileOutputStream(cfg, false); properties.store(fos, "for tests only !"); fos.close(); }catch (Exception e){ System.out.println("Create Data file fault, error msg: " + e.toString()); throw new RuntimeException("Unable to create the destination file " + cfg.getName(), e); } } /** * 获取SAP连接 * @return SAP连接对象 */ public static JCoDestination connect(){ JCoDestination destination =null; try { destination = JCoDestinationManager.getDestination(ABAP_AS_POOLED); } catch (JCoException e) { log.error("Connect SAP fault, error msg: " + e.toString()); } return destination; }
-
开始调用接口(函数)相关api
JCoFunction function = null;
JCoDestination destination = SAPConn.connect();
String type = "";//调用接口返回状态
String message = "";//调用接口返回信息
List<String> partNoList=new ArrayList<>();
try {
//调用Z_APS_STOCK_DEPTH函数(接口名)
function = destination.getRepository().getFunction("接口名");
JCoParameterList input = function.getImportParameterList();
for (String partNo: partNoList) {
//Z_APS_STOCK_DEPTH
input.setValue("NAME", "狗蛋儿");//普通请求参数
JCoTable it_matnr = function.getTableParameterList().getTable("T_USER");//以表作为请求参数
it_matnr.appendRow();
it_matnr.setValue("age",18);//设置表值
function.execute(destination);//开始执行请求接口
type = function.getExportParameterList().getString("ES_TYPE");//调用接口返回状态
message = function.getExportParameterList().getString("ES_MESSAGE");//调用接口返回信息
System.out.println("调用返回状态--->" + type + ";调用返回信息--->" + message);
//获取数据(T_OUTPUT为返回结果表=http接口的json返回值)
JCoTable output = function.getTableParameterList().getTable("T_OUTPUT");
int numRows = output.getNumRows();//行数为0可以直接return
for (int i = 0; i < numRows; i++) {
output.setRow(i);//设置索引 获取返回表里的数据
//Z_APS_STOCK_DEPTH
String NAME= output.getString("NAME");//解析表字段值
String AGE= output.getString("AGE");
System.out.println(NAME);
System.out.println(AGE);
}
}
} catch (Exception e) {
e.printStackTrace();
}
3.调用sap接口通过数组传参暂未测试,有这样使用过的可以留个言,还是很简单的,网上看了很多然并卵的文章,所以自己直接来点干货。