基于spring框架 实现的奇门云网关 WMS端 通用API方法:

package org.tempuri;import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.mingsoft.util.StringUtil;
import net.sf.json.JSONObject;
import net.sf.json.xml.XMLSerializer;@Controller
@RequestMapping("api/open/qiMenApi")
public class QiMenTest {@ResponseBody@RequestMapping(value="/apiRealization",produces="text/xml;charset=UTF-8")public byte[] apiRealization(HttpServletRequest request, HttpServletResponse response) {// AppKeyString appKeyVal = request.getParameter("app_key");// API接口名称String methodVal = request.getParameter("method");// 时间戳,格式:yyyy-MM-dd HH:mm:ssString timestampVal = request.getParameter("timestamp");// 请求签名String signVal = request.getParameter("sign");byte[] result = null;Map<String, Object> resultMap = new HashMap<>();InputStream inputStream;StringBuffer sb = new StringBuffer();try {// 解析xml参数inputStream = request.getInputStream();String s;BufferedReader in = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));while ((s = in.readLine()) != null) {sb.append(s);}in.close();inputStream.close();if(sb.length() > 0) {// json格式的报文参数JSONObject xmlToJson = JSONObject.fromObject(xmlForJson(sb.toString()));if(!StringUtil.isBlank(methodVal)) {switch (methodVal) {case "deliveryorder.create":// 发货单创建接口//resultMap = ;break;case "entryorder.create":// 入库单创建接口//resultMap = ;break;case "stockout.create":// 出库单创建接口//resultMap = ;break;case "order.cancel":// 单据取消接口//resultMap = ;break;case "singleitem.synchronize":// 商品同步接口//resultMap = ;break;default:resultMap.put("message", "接口名称method填写有误!");resultMap.put("flag", "failure");resultMap.put("code", "500");break;}}else {resultMap.put("message", "接口名称method不能为空!");resultMap.put("flag", "failure");resultMap.put("code", "500");}result = multilayerMapToXml(resultMap, false).getBytes("UTF-8");}else {result = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>".getBytes("UTF-8");}} catch (Exception e) {resultMap.put("flag", "failure");resultMap.put("code", "500");resultMap.put("message", "操作失败,参数有误!");try {result = multilayerMapToXml(resultMap, false).getBytes("UTF-8");} catch (UnsupportedEncodingException e1) {return null;}}return result;}/*** xml字符串转json字符串* @param xml* @return*/private Object xmlForJson(String xml) {XMLSerializer xmlSerializer = new XMLSerializer();String resutStr = xmlSerializer.read(xml).toString();return resutStr;}/*** (多层)map转换为xml格式字符串** @param map 需要转换为xml的map* @param isCDATA 是否加入CDATA标识符 true:加入 false:不加入* @return xml字符串* @throws UnsupportedEncodingException */public static String multilayerMapToXml(Map<String, Object> map, boolean isCDATA) throws UnsupportedEncodingException{String parentName = "response";Document doc = DocumentHelper.createDocument();doc.addElement(parentName);String xml = recursionMapToXml(doc.getRootElement(), parentName, map, isCDATA);return formatXML(xml);}/*** multilayerMapToXml核心方法,递归调用** @param element 节点元素* @param parentName 根元素属性名* @param map 需要转换为xml的map* @param isCDATA 是否加入CDATA标识符 true:加入 false:不加入* @return xml字符串*/@SuppressWarnings("unchecked")private static String recursionMapToXml(Element element, String parentName, Map<String, Object> map, boolean isCDATA) {Element xmlElement = element.addElement(parentName);map.keySet().forEach(key -> {Object obj = map.get(key);if (obj instanceof Map) {recursionMapToXml(xmlElement, key, (Map<String, Object>)obj, isCDATA);} else {String value = obj == null ? "" : obj.toString();if (isCDATA) {xmlElement.addElement(key).addCDATA(value);} else {xmlElement.addElement(key).addText(value);}}});return xmlElement.asXML();}/*** 格式化xml,显示为容易看的XML格式** @param xml 需要格式化的xml字符串* @return*/public static String formatXML(String xml) {String requestXML = null;try {// 拿取解析器SAXReader reader = new SAXReader();Document document = reader.read(new StringReader(xml));if (null != document) {StringWriter stringWriter = new StringWriter();// 格式化,每一级前的空格OutputFormat format = new OutputFormat("  ", true);// xml声明与内容是否添加空行format.setNewLineAfterDeclaration(false);// 是否设置xml声明头部format.setSuppressDeclaration(false);// 是否分行format.setNewlines(true);XMLWriter writer = new XMLWriter(stringWriter, format);writer.write(document);writer.flush();writer.close();requestXML = stringWriter.getBuffer().toString();}return requestXML;} catch (Exception e) {e.printStackTrace();return null;}}}

编码思路:

1.接收ERP端xml类型的参数(request.getInputStream()),为方便取值转换为Json格式(xmlForJson(sb.toString()))

2.判断ERP端请求的奇门接口名称(request.getParameter("method"))走不同的业务实现方法(switch case注释部分),各接口返回数据均有差异,请参照淘宝奇门接口API文档

3.各实现方法返回Map格式数据,转换为xml格式返回,为防止乱码情况,我们转为byte数组返回(multilayerMapToXml(resultMap, false).getBytes("UTF-8"))

Java版WMS系统奇门云网关(奇门仓储)接口实现相关推荐

  1. JAVA版WMS物流仓储管理系统源码,包含PDA端和Web端

    JAVA版WMS仓储管理系统源码 物流仓库管理系统源码 源码免费分享,需要学习可私信. 一.源码介绍: 基于JAVA开发的物流仓库管理系统(支持自营和第三方),包含PDA端和Web端.WMS在经过多家 ...

  2. 我的世界java版合成表_《我的世界》基础攻略 JAVA版合成系统详解

    Java版合成系统 2×2合成网格 3×3合成网格(工作台上) 对于一些物品的合成,其原材料的排放位置无关紧要.这些配方通常称为"无序配方".譬如,发酵蛛眼的合成配方就是无序配方, ...

  3. OFCMS 模板开发手册 java 版cms系统

    一.模板说明 项目概述 java 版CMS系统.基于java技术研发的内容管理系统.功能:栏目模板自定义.内容模型自定义.多个站点管理.在线模板页面编辑等功能.代码完全开源.MIT授权协议. 技术选型 ...

  4. java版停车系统(纯数据结构,无数据库)

    ** java版停车场管理系统 ** 项目要求:需要使用栈和队列两种数据结构.其中栈用于停车场和中转区,队列用于便道,对应的类名分别为:CarStack和CarQueue.CarStack为顺序栈,C ...

  5. 选WMS系统时,云WMS能给企业带来什么好处

    随着数字化.智能化互联网时代的到来,越来越多的企业在选择WMS系统时会选择云WMS.为什么?能给企业带来什么好处? 由于大市场环境下企业之间的竞争日益激烈,企业在不断提高仓库管理优势的同时节约成本:云 ...

  6. 锐思WMS和金蝶云星辰V1单据接口对接

    对接源平台:金蝶云星辰V1 金蝶云·星辰基于金蝶云·苍穹云原生PaaS平台构建,聚焦小型企业在线经营和数字化管理,提供财务云.税务云.进销存云.零售云.订货商城等SaaS服务,支持企业拓客开源.智能管 ...

  7. Redis队列实现Java版秒杀系统(无脚本、可用于生产)

    本文系转载,原作者:控场的朴哥 原文地址:blog.csdn.net/weixin_43074462/article/details/103756536 写在前面 需求是做一个秒杀系统,比如大家来抢1 ...

  8. JAVA版基于netty的物联网网关

    码云地址: https://gitee.com/willbeahero/IOTGate 通过netty实现自定义协议物联网网关(附有报文格式) window笔记本电脑本地测试:单网关.单前置节点,每秒 ...

  9. Java版分布式微服务云开发架构 Spring Cloud+Spring Boot+Mybatis+ElementUI

    鸿鹄云架构[系统管理平台]是一个大型 企业.分布式.微服务.云架构的JavaEE体系快速研发平台,基于 模块化.微服务化.原子化.热部署的设计思想,使用成熟领先的无商业限制的主流开源技术 (Sprin ...

最新文章

  1. enspar启动失败40_负债80万开始爆仓,快40岁的人了没钱创业,精神恍惚该怎么翻身?...
  2. Find The Multiple POJ - 1426(只包含01的十进制倍数(同余模定理))
  3. Word for mac 分小节问题
  4. 微信小程序~自定义属性设置和获取(data-)
  5. Django框架——状态保持(cookie、session)
  6. NLP︱LDA主题模型的应用难题、使用心得及从多元统计角度剖析
  7. mysql 时间戳截断_列的Mysql时间戳数据被截断
  8. java gzip 文件夹_Java GZip 基于磁盘实现压缩和解压的方法
  9. linux安装quota软件包,CentOS关于quota的总结与实践详解
  10. Visio使用技巧之默认字体大小更改
  11. 刷机大师独家支持android,刷机大师:独家支持Android L一键刷机
  12. 【校招实习面试实战,身临其境】华为软件开发工程师面试复盘总结
  13. Ubuntu 16.04安装sogou 拼音输入法
  14. 守望空城,一位摄影师镜头下的武汉
  15. Qt 网络聊天室项目
  16. 暗影骑士擎Pro 之 安装Ubuntu18.04 双系统 踩坑记录(一)
  17. 学习笔记三:MLP基本原理、矩阵求导术推反向传播、激活函数、Xavier
  18. QQ浏览器F12弹出新窗口问题
  19. Vue 知识点汇总(下)--附案例代码及项目地址
  20. 【转】Linux那些事儿之我是Hub(7)蝴蝶效应

热门文章

  1. 百分点:利用大数据做智慧商业
  2. “2048”游戏项目技术招标书
  3. 智能安防系统具备什么价值—甲由科技
  4. 上市首日市值超过福特汽车,Rivian能否成下一个“特斯拉”?
  5. LabVIEW中如何使用多绘图光标
  6. 《Hexo: 从零开始编写自己的主题》5. 添加本地搜索功能以及发布博客让官网接收
  7. java 自动下载自动搜索_必应美图下载 - 自动更换批量下载的壁纸
  8. ErrorResponse(code = AccessDenied, message = Access denied, bucketName = bucket, objectName = null
  9. 什么是通用离散传感器
  10. SQLite嵌入式数据库(转)