packageorg.tempuri;importjava.io.BufferedReader;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.io.StringReader;importjava.io.StringWriter;importjava.io.UnsupportedEncodingException;importjava.util.HashMap;importjava.util.Map;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importorg.dom4j.Document;importorg.dom4j.DocumentHelper;importorg.dom4j.Element;importorg.dom4j.io.OutputFormat;importorg.dom4j.io.SAXReader;importorg.dom4j.io.XMLWriter;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.ResponseBody;importcom.mingsoft.util.StringUtil;importnet.sf.json.JSONObject;importnet.sf.json.xml.XMLSerializer;
@Controller
@RequestMapping("api/open/qiMenApi")public classQiMenTest {
@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 resultMap = new HashMap<>();
InputStream inputStream;
StringBuffer sb= newStringBuffer();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;
}
}returnresult;
}/*** xml字符串转json字符串
*@paramxml
*@return
*/
privateObject xmlForJson(String xml) {
XMLSerializer xmlSerializer= newXMLSerializer();
String resutStr=xmlSerializer.read(xml).toString();returnresutStr;
}/*** (多层)map转换为xml格式字符串
*
*@parammap 需要转换为xml的map
*@paramisCDATA 是否加入CDATA标识符 true:加入 false:不加入
*@returnxml字符串
*@throwsUnsupportedEncodingException*/
public static String multilayerMapToXml(Map map, boolean isCDATA) throwsUnsupportedEncodingException{
String parentName= "response";
Document doc=DocumentHelper.createDocument();
doc.addElement(parentName);
String xml=recursionMapToXml(doc.getRootElement(), parentName, map, isCDATA);returnformatXML(xml);
}/*** multilayerMapToXml核心方法,递归调用
*
*@paramelement 节点元素
*@paramparentName 根元素属性名
*@parammap 需要转换为xml的map
*@paramisCDATA 是否加入CDATA标识符 true:加入 false:不加入
*@returnxml字符串*/@SuppressWarnings("unchecked")private static String recursionMapToXml(Element element, String parentName, Map map, booleanisCDATA) {
Element xmlElement=element.addElement(parentName);
map.keySet().forEach(key->{
Object obj=map.get(key);if (obj instanceofMap) {
recursionMapToXml(xmlElement, key, (Map)obj, isCDATA);
}else{
String value= obj == null ? "": obj.toString();if(isCDATA) {
xmlElement.addElement(key).addCDATA(value);
}else{
xmlElement.addElement(key).addText(value);
}
}
});returnxmlElement.asXML();
}/*** 格式化xml,显示为容易看的XML格式
*
*@paramxml 需要格式化的xml字符串
*@return
*/
public staticString formatXML(String xml) {
String requestXML= null;try{//拿取解析器
SAXReader reader = newSAXReader();
Document document= reader.read(newStringReader(xml));if (null !=document) {
StringWriter stringWriter= newStringWriter();//格式化,每一级前的空格
OutputFormat format = new OutputFormat(" ", true);//xml声明与内容是否添加空行
format.setNewLineAfterDeclaration(false);//是否设置xml声明头部
format.setSuppressDeclaration(false);//是否分行
format.setNewlines(true);
XMLWriter writer= newXMLWriter(stringWriter, format);
writer.write(document);
writer.flush();
writer.close();
requestXML=stringWriter.getBuffer().toString();
}returnrequestXML;
}catch(Exception e) {
e.printStackTrace();return null;
}
}
}