Neo君遇到了需要調用webservice接口的情況,然而作為一只小白對這方面了解困乏,經過摸索,完成了一個小的Demo,記錄下。
一:背景
同事給了我一個webservice地址,打開后后綴是"...?wsdl",將鏈接"http://......?wsdl"放入soapUI中,可以解析出完整的。但是Neo君之前對這邊是空白的,上網搜索了一些webservice和soap以及wsdl的基本知識后,才了解了一些。但是具體到代碼里使用,網上搜到的內容好多都是copy的,且不完整。
二:Code
話不多說,中間走過的彎路一並帶過,直接貼代碼。
1 import org.apache.axis.client.Call; 2 import org.apache.axis.client.Service; 3 import org.apache.axis.encoding.XMLType; 4 import org.apache.axis.message.MessageElement; 5 import org.apache.axis.message.SOAPHeaderElement; 6 import org.apache.axis.types.Schema; 7 import org.dom4j.Document; 8 import org.dom4j.io.SAXReader; 9 10 import javax.xml.namespace.QName; 11 import javax.xml.soap.SOAPElement; 12 import javax.xml.soap.SOAPFactory; 13 import java.io.ByteArrayInputStream; 14 15 16 public class WebserviceUtilTest { 17 public static void main(String[] args) { 18 try{ 19 String endpoint="http://xxx"; 20 // 直接引用遠程的wsdl文件,"?wsdl"前的鏈接 21 String method="test"; 22 String namespace = "http://www.xxxx"; 23 24 Service service = new Service(); 25 Call call = (Call) service.createCall(); 26 //設置服務器地址 27 call.setTargetEndpointAddress(new java.net.URL(endpoint)); 28 //設置命名空間和調用方法 29 call.setOperationName(new QName(namespace,method));// WSDL里面描述的接口名稱 30 call.setUseSOAPAction(true); 31 32 33 //設置header,如果有security需求的話 34 SOAPHeaderElement soapHeaderElement = createHeader(); 35 if(soapHeaderElement == null){ 36 System.out.println("====Exception"); 37 return; 38 } 39 call.addHeader(soapHeaderElement); 40 41 //添加方法的參數,有幾個添加幾個 42 call.addParameter("param1", XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);// 接口的參數 43 call.addParameter("param2", XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);// 接口的參數 44 //設置返回類型 45 46 /*返回類型可以不設置,如果是簡單類型可以使用XMLType.XSD_STRING等簡單類型,這里使用schema解析返回的報文。 47 如果接收的類型和設置的類型不一致,會報以下異常: 48 SimpleDeserializer encountered a child element, which is NOT expected, in something it was trying to deserialize.*/ 49 call.setReturnType(XMLType.XSD_SCHEMA);// 設置返回類型 50 51 52 53 String param1Value = "test"; 54 String param2Value = "test"; 55 Schema result = (Schema) call.invoke(new Object[] { account,passwd }); 56 57 //解析返回結果 58 MessageElement[] data = result.get_any(); 59 for(int i=0; i<data.length; i++){ 60 SAXReader reader = new SAXReader(); 61 Document doc = reader.read(new ByteArrayInputStream(data[i].toString().getBytes())); 62 System.out.println(doc.getStringValue()); 63 } 64 65 66 //輸出SOAP請求報文 67 System.out.println("--SOAP Request: " + call.getMessageContext().getRequestMessage().getSOAPPartAsString()); 68 //輸出SOAP返回報文 69 System.out.println("--SOAP Response: " + call.getResponseMessage().getSOAPPartAsString()); 70 71 72 }catch (Exception e){ 73 e.printStackTrace(); 74 75 } 76 } 77 /*構造Header*/ 78 public static SOAPHeaderElement createHeader(){ 79 String AUTH_PREFIX = "wsse"; 80 String AUTH_NS = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"; 81 String TYPE = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"; 82 83 String userName= "admin"; 84 String passwd= "admin"; 85 86 87 //SOAPHeaderElement soapHeaderElement =new SOAPHeaderElement(); 88 89 90 try{ 91 SOAPFactory soapFactory =SOAPFactory.newInstance(); 92 SOAPElement wsSecHeaderElm = soapFactory.createElement("Security", AUTH_PREFIX, AUTH_NS); 93 SOAPElement userNameTokenElm = soapFactory.createElement("UsernameToken",AUTH_PREFIX, AUTH_NS); 94 SOAPElement userNameElm = soapFactory.createElement("Username",AUTH_PREFIX, AUTH_NS); 95 SOAPElement passwdElm = soapFactory.createElement("Password",AUTH_PREFIX, AUTH_NS); 96 passwdElm.setAttribute("Type", TYPE); 97 98 userNameElm.addTextNode(userName); 99 passwdElm.addTextNode(passwd); 100 101 userNameTokenElm.addChildElement(userNameElm); 102 userNameTokenElm.addChildElement(passwdElm); 103 wsSecHeaderElm.addChildElement(userNameTokenElm); 104 105 SOAPHeaderElement soapHeaderElement = new SOAPHeaderElement(wsSecHeaderElm); 106 soapHeaderElement.setMustUnderstand(true); 107 108 return soapHeaderElement; 109 }catch(Exception e) { 110 e.printStackTrace(); 111 return null; 112 } 113 } 114 }
