ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

WMS仓储系统对接奇门云网关Java接口实现

2020-01-14 10:51:12  阅读:797  来源: 互联网

标签:xml map 网关 Java String WMS resultMap return import


介绍:

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

编码思路:

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"))

代码实现:

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) {
        // AppKey
        String appKeyVal = request.getParameter("app_key");
        // API接口名称
        String methodVal = request.getParameter("method");
        // 时间戳,格式:yyyy-MM-dd HH:mm:ss
        String 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;
        }
    }
    
}

标签:xml,map,网关,Java,String,WMS,resultMap,return,import
来源: https://www.cnblogs.com/superSubfn/p/12190817.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有