Java對接SAP平臺接口

1.先準備好鏈接SAP平臺的Java jar包。-- sapjco.jarhtml

2.配置SAP平臺鏈接參數,構建客戶端,鏈接SAP接口。java

import com.sap.conn.jco.*; import com.stp.saas.sap.command.RequestSapCommand; import com.stp.saas.sap.command.SendSapCommand; import com.stp.saas.sap.config.Response; import com.stp.saas.sap.domain.SapData; import com.stp.saas.sap.utils.SAPConnUtils; import org.springframework.web.bind.annotation.*; import java.util.*; /** * 調用Sap接口 * * @auther maxinhai * @desc sap平臺接口傳數據有兩種方式:簡單參數 表結構參數 */ @RestController @RequestMapping(value = "/sap") public class SAPController { /** * 鏈接SAP,並根據方法名稱和參數調用接口 * * 每一個請求必須自帶鏈接SAP配置,方法名稱,參數(非必須) * * @param command 請求SAP參數 * @return
     */ @RequestMapping(value = "/sendRequest", method = RequestMethod.POST) public Response<List<SapData>> connSAP(@RequestBody RequestSapCommand command){ if(null == command.getFunctionName()){ return Response.fail("方法名稱必填"); } // 鏈接SAP
        JCoDestination destination = SAPConnUtils.connect(command.getConnect()); // 根據方法名稱和參數調用接口
        JCoFunction function = null; try { function = destination.getRepository().getFunction(command.getFunctionName()); } catch (JCoException e) { e.printStackTrace(); return Response.fail("系統出現異常,請聯繫管理員"); } JCoTable responseTable = null; List<SapData> returnList = new ArrayList<SapData>(); for (JCoField field : function.getTableParameterList()) { responseTable = field.getTable(); if(command.getParams().size() > 0) { // 不須要參數
                JCoParameterList importParameterList = function.getImportParameterList(); for (Map.Entry<String, String> entry : command.getParams().entrySet()) { importParameterList.setValue(entry.getKey(), "null".equals(entry.getValue()) ? "" : entry.getValue()); } } try { function.execute(destination); } catch (JCoException e) { e.printStackTrace(); return Response.fail("系統出現異常,請聯繫管理員"); } // 獲取metaData(包含表的關鍵信息)
            JCoRecordMetaData metaData = responseTable.getRecordMetaData(); System.out.println("sap返    回數據:" + metaData); SapData sapData = new SapData(); sapData.setFieldCount(metaData.getFieldCount()); String[] name = new String[sapData.getFieldCount()]; List<Map<String, String>> sapList = new ArrayList<Map<String, String>>(); // 獲取所有名稱
            for (int j = 0; j < sapData.getFieldCount(); j++) { name[j] = metaData.getName(j); } sapData.setFieldNames(name); // 獲取所有數據
            for (int i = 0; i < responseTable.getNumRows(); i++) { responseTable.setRow(i); Map<String, String> sapMap = new HashMap<String, String>(); for (String fieldName : sapData.getFieldNames()) { sapMap.put(fieldName, responseTable.getString (fieldName)); } sapList.add(sapMap); } sapData.setData(sapList); returnList.add(sapData); } return Response.of(returnList); } /** * 調用sap接口 接口參數爲一張表 * * @auther maxinhai * @param command * @return
     */ @RequestMapping(value = "/sendSapOfTable", method = RequestMethod.POST) public Response<Map<String, Object>> sendSapOfTable(@RequestBody SendSapCommand command) { Map<String, Object> result = new HashMap<>(); if(null == command.getFunctionName()){ return Response.fail("方法名稱必填"); } if(null == command.getTableName()){ return Response.fail("參數表名稱必填"); } // 鏈接SAP
        JCoDestination destination = SAPConnUtils.connect(command.getConnect()); // 根據方法名稱和參數調用接口
        JCoFunction function = null; try { function = destination.getRepository().getFunction(command.getFunctionName()); //獲取傳入表參數IT_DATA
            JCoTable IT_DATA = function.getTableParameterList().getTable(command.getTableName()); if(command.getParams() != null && command.getParams().size() > 0) { for (Map<String, String> map : command.getParams()) { IT_DATA.appendRow();//增長一行 //給表參數中的字段賦值,此處測試,就隨便傳兩個值進去
                    Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry<String, String> param = iterator.next(); IT_DATA.setValue(param.getKey(), param.getValue()); } } } function.execute(destination); //String state= function.getExportParameterList().getString("E_STATUS");//調用接口返回狀態
            String message= function.getExportParameterList().getString("E_MSG");//調用接口返回信息
            result.put("state", 200); result.put("message", message); result.put("data", null); } catch (JCoException e) { e.printStackTrace(); result.put("state", 500); result.put("message", "發生錯誤"); return Response.of(result); } return Response.of(result); } }

在後面的sap接口調用過程當中,我發現sap接收數據的方式是有兩種的,之前用的都是第一種,遇到須要傳表結構的接口時會報字段不是接口成員的異常,有時候調用本身不知道的接口的時候必定要問清楚,mmp,sap接口文檔上也沒有寫清這個接口要傳表結構的參數,文檔上寫的和普通接口一毛同樣。web

推薦閱讀: https://www.cnblogs.com/hikarisama/p/10090901.htmlspring

         https://www.iteye.com/blog/liangjie5305579-126-com-1887684app

相關文章
相關標籤/搜索