package com.tonbusoft.uums.demo; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.StringReader; import java.io.StringWriter; import java.net.HttpURLConnection; import java.net.URL; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.dom4j.Document; 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 com.tonbusoft.uums.commons.utils.JsonMsg; import com.tonbusoft.uums.commons.utils.SendUtil; @Controller public class SoapController { private static Map<String,String> map = new HashMap<String,String>(); @RequestMapping("/soap/postSoap") public void postSoap(HttpServletRequest req, HttpServletResponse res) { String type = req.getParameter("type"); String params = req.getParameter("params"); if (null == type || null == params) { SendUtil.write(res, new JsonMsg(false, "參數錯誤")); } String url = req.getParameter("url"); JsonMsg msg = new JsonMsg(); InputStream is = null; OutputStream os = null; HttpURLConnection conn = null; if (null == type || null == params) { msg = new JsonMsg(false, "參數錯誤"); } else { String[] items = params.split(";"); try { String webUrl = req.getRequestURL().toString(); int index = webUrl.indexOf("/soap/postSoap.do"); webUrl = webUrl.substring(0,index); //服務的地址 ConfigBean.RootPath URL wsUrl = null; if (null == url || "".equals(url)) { wsUrl = new URL(webUrl + "/webservice/myService/"+type+"?wsdl"); } else { wsUrl = new URL(url); } conn = (HttpURLConnection) wsUrl.openConnection(); conn.setDoInput(true); conn.setDoOutput(true); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "text/xml;charset=UTF-8"); os = conn.getOutputStream(); //請求體 String data = "<?xml version='1.0' encoding='utf-8'?>"; data += "<soap:Envelope "; data += "xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' "; data += "xmlns:xsd='http://www.w3.org/2001/XMLSchema' "; data += "xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/' >"; data += "<soap:Body> "; data += "<m:" + type + " xmlns:m='http://service.webservice.uums.tonbusoft.com/'> "; for ( int i = 0; i < items.length; i++) { String element = items[i]; String[] ele = element.split(","); if (ele.length < 2) { data += "<m:"+ ele[0] +"></m:"+ ele[0] +"> "; } else { data += "<m:"+ ele[0] +">"+ele[1]+"</m:"+ ele[0] +"> "; } } data += "</m:"+type+"> "; os.write(data.getBytes()); is = conn.getInputStream(); byte[] b = new byte[1024]; int len = 0; String s = ""; String resultStr = ""; while((len = is.read(b)) != -1){ String ss = new String(b,0,len,"UTF-8"); s += ss; } if (s.contains("error_token_validate")) { resultStr = getErrorToken(type); } else { resultStr = s; } msg = new JsonMsg(true, "soap success", paraXml(resultStr)); } catch (Exception e) { try { msg = new JsonMsg(false, "系統錯誤"); } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); } e.printStackTrace(); } finally { if (null != is) { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } if (null != os) { try { os.close(); } catch (IOException e) { e.printStackTrace(); } } if (null != conn) { conn.disconnect(); } } } SendUtil.write(res, msg); } /** * 解析 SOAP 消息 XML文件 遞歸 * @param element * @author wyf */ public static Map<String,String> readSoap(Element element){ if(element.elements().size()==0){ System.out.println(element.getName()+"="+element.getText()); return null; } for (Iterator<Element> iter=element.elementIterator();iter.hasNext();) { Element ele=iter.next(); if(ele.getParent().getName().equalsIgnoreCase("BODY")){ System.out.println("body的子元素:"+ele.getName()); } System.out.println(ele.getName()+"="+ele.getText().trim()); if(ele.elements().size()!=0){ readSoap(ele); } if(!"".equals(ele.getText().trim())&&ele.getText()!=null){ map.put(ele.getName(), ele.getText()); } } return map; } public static String changeToHtml(String soapData){ if(soapData!=null && !"".equals(soapData)){ soapData=soapData.replace("<", "<"); soapData=soapData.replace(">", ">"); } return soapData; } public static String paraXml(String str) throws Exception{ SAXReader reader = new SAXReader(); // System.out.println(reader); // 註釋:建立一個串的字符輸入流 StringReader in = new StringReader(str); Document doc = reader.read(in); // System.out.println(doc.getRootElement()); // 註釋:建立輸出格式 OutputFormat formater = OutputFormat.createPrettyPrint(); //formater=OutputFormat.createCompactFormat(); // 註釋:設置xml的輸出編碼 formater.setEncoding("utf-8"); // 註釋:建立輸出(目標) StringWriter out = new StringWriter(); // 註釋:建立輸出流 XMLWriter writer = new XMLWriter(out, formater); // 註釋:輸出格式化的串到目標中,執行後。格式化後的串保存在out中。 writer.write(doc); writer.close(); return out.toString(); } private String getErrorToken(String type){ String errorToken = "<soap:Envelope xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'>"; errorToken += "<soap:Body><ns2:" + type + "Response xmlns:ns2='http://service.webservice.uums.tonbusoft.com/'><ns2:result>"; errorToken += "token無效 請從新登陸</ns2:result></ns2:" + type + "Response></soap:Body></soap:Envelope>"; return errorToken; } }