基于Axis服务端的webservice客户端实现
生活随笔
收集整理的這篇文章主要介紹了
基于Axis服务端的webservice客户端实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
之前開發webservice客戶端的時候遇到一個使用Axis2開發接口的廠家,查資料把Axis1和Axis2客戶端的開發方式總結如下:
基于Axis1服務端的客戶端實現:
/*** 使用Axis Call Client動態調用WebService* @param requestXml 請求報文* @param wsdl webservice地址* @param targetNamespace 命名空間* @param webServiceMethod 訪問的方法名* @return*/ public String getRespByAxisCallClient(String requestXml, String wsdl,String targetNamespace, String webServiceMethod){String respXml = "";try{Service service = new Service();Call call = (Call) service.createCall();//設置要訪問的WSDL地址call.setTargetEndpointAddress(new URL(wsdl));//設置要訪問的方法名call.setOperationName(new QName(wsdl,webServiceMethod));//設置參數call.addParameter("XMLFrom", XMLType.XSD_STRING, ParameterMode.IN);//設置返回值類型call.setReturnType(XMLType.XSD_STRING);//調用服務respXml = (String) call.invoke(new Object[] { requestXml.toString() }); }catch(Exception e){logger.error("服務調用異常",e);}return respXml; }
Call在線API:http://axis.apache.org/axis/java/apiDocs/org/apache/axis/client/Call.html
基于Axis2服務端的客戶端實現: 方法一: 采用RPC的方式進行遠程調用,通過URL定位告訴遠程服務器需要調用的方法名、參數等,調用遠程服務,獲取結果。如果被調用的WebService方法有返回值,應使invokeBlocking 方法 該方法有三個參數:第一個參數的類型是QName對象,表示要調用的方法名;第二個參數表示要調用的WebService方法的參數值,參數類型為Object[]; 當方法沒有參數時,invokeBlocking方法的第二個參數值不能是null,而要使用new Object[]{}。第三個參數表示WebService方法的 返回值類型的Class對象,參數類型為Class[]。如果被調用的WebService方法沒有返回值 應使用 invokeRobust 方法。該方法只有兩個參數,它們的含義與invokeBlocking方法的前兩個參數的含義相同。在創建QName對象時,QName類的構造方法的第一個參數表示WSDL文件的命名空間名,也就是 <wsdl:definitions>元素的targetNamespace屬性值。方法如下: /*** 方法一:RPC調用webservice Axis2服務* @param wsdl 接口服務端調用地址* @param webServiceMethod 調用方法* @param inParam 請求參數* @param targetNamespace 命名空間* @return*/ public String getRespByAxisRPCClient(Map<String,Object> inParam, String wsdl,String targetNamespace, String webServiceMethod){String responseStr = "";RPCServiceClient serviceClient = null; try{//獲取RPCServiceClient對象serviceClient = new RPCServiceClient();//獲取Options對象Options options = serviceClient.getOptions();//指定調用webservice的URLEndpointReference targetERP = new EndpointReference(wsdl);options.setTo(targetERP);//指定要調用的方法及wsdl文件的命名空間QName opAddEntry = new QName("http://ws.apache.org/axis2",webServiceMethod);//指定method的入參Object[] opAddEntryArgs = inParam.values().toArray();//指定方法返回值的數據類型class對象Class[] classes = new Class[]{String.class};//調用服務responseStr = (String) serviceClient.invokeBlocking(opAddEntry,opAddEntryArgs,classes)[0]; }catch(Exception e){logger.error("RPCServiceClient error",e);throw new RuntimeException("RPCServiceClient error",e); }finally{try {serviceClient.cleanupTransport();} catch (AxisFault e) {logger.error("RPCServiceClient cleanupTransport error",e);throw new RuntimeException("RPCServiceClient error",e);} }return responseStr; } 注意: 1、如果被調用的WebService方法有返回值,應使用invokeBlocking方法,該方法有三個參數: 第一個參數的類型是QName對象,表示要調用的方法名; 第二個參數表示要調用的WebService方法的參數值,參數類型為Object[];當方法沒有參數時,invokeBlocking方法的第二個參數值不能是null,而要使用new Object[]{}。 第三個參數表示WebService方法的,返回值類型的Class對象,參數類型為Class[]。 2、如果返回對象是String類型的字符串,參數為String.class;如果返回對象是double類型的數字,參數為double.class。 3、如果被調用的WebService方法沒有返回值,應使用invokeRobust方法:該方法只有兩個參數,它們的含義與invokeBlocking方法的前兩個參數的含義相同。 在開發過程中遇到以下錯誤: 錯誤一:
查找資料發現問題出在缺少必要的jar包上,經測試得知,使用RPCServiceClient所需的最少jar包如下: axiom-api-1.2.13.jar axiom-impl-1.2.13.jar axis2-adb-1.6.2.jar axis2-kernel-1.6.2.jar axis2-transport-http-1.6.2.jar axis2-transport-local-1.6.2.jar commons-codec-1.3.jar commons-httpclient-3.1.jar commons-logging-1.1.1.jar httpcore-4.0.jar neethi-3.0.2.jar wsdl4j-1.6.2.jar XmlSchema-1.4.7.jar錯誤二:
原因:webservice調用連接池默認只有兩個連接,每次調用完必須釋放連接,否則很快就會沒連接。需要在finally中加入以下代碼,釋放掉已有的連接。 finally{try {serviceClient.cleanupTransport();} catch (AxisFault e) {logger.error("RPCServiceClient cleanupTransport error",e);throw new RuntimeException("RPCServiceClient error",e);} } 錯誤三:
原因:缺少jar包 mail-1.4.jar
方法二: /*** 方法二: 應用document方式調用 webservice服務,用ducument方式可以擺脫我們不想要的耦合* @param wsdl webservice地址**/public static void getRespByDocument(String wsdl,String user,String password) {try {//獲取Options對象Options options = new Options(); // 指定調用WebService的URL EndpointReference targetEPR = new EndpointReference(wsdl); options.setTo(targetEPR); // options.setAction("urn:getPrice"); //獲取ServiceClient對象ServiceClient serviceClient = new ServiceClient(); serviceClient.setOptions(options); OMFactory fac = OMAbstractFactory.getOMFactory(); String tns = "http://quickstart.samples/"; // 命名空間,有時命名空間不增加沒事,不過最好加上,因為有時會出問題OMNamespace omNs = fac.createOMNamespace(tns, ""); OMElement method = fac.createOMElement("getPrice", omNs); OMElement symbol = fac.createOMElement("symbol", omNs); // symbol.setText("1"); symbol.addChild(fac.createOMText(symbol, "Axis2 Echo String ")); method.addChild(symbol); method.build(); //為SOAP Header構造驗證信息addValidation(serviceClient,tns,user,password);//調用服務OMElement result = serviceClient.sendReceive(method); }catch (AxisFault axisFault) { axisFault.printStackTrace(); } }/*** 為SOAP Header構造驗證信息,* 如果你的服務端是沒有驗證的,那么你不用在Header中增加驗證信息** @param serviceClient* @param tns 命名空間* @param user* @param passwrod*/ public static void addValidation(ServiceClient serviceClient, String tns , String user, String passwrod) { OMFactory fac = OMAbstractFactory.getOMFactory(); OMNamespace omNs = fac.createOMNamespace(tns, "nsl"); OMElement header = fac.createOMElement("AuthenticationToken", omNs); OMElement ome_user = fac.createOMElement("Username", omNs); OMElement ome_pass = fac.createOMElement("Password", omNs); ome_user.setText(user); ome_pass.setText(passwrod); header.addChild(ome_user); header.addChild(ome_pass); serviceClient.addHeader(header); }
總結
以上是生活随笔為你收集整理的基于Axis服务端的webservice客户端实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTTP协议原理分析
- 下一篇: HTTP、HTTPS、SSL总结