1. 程式人生 > >java客戶端呼叫webservice

java客戶端呼叫webservice

         最近的工作是java和c++的互動,利用的就是webservice;部落格中介紹瞭如何利用java生成webservice,這篇部落格接著說如何利用java呼叫webservice。

        我主要用的是axis2工具來實現java的webservice呼叫。

        我比較常用的兩種方法一個是直接利用RPCServiceClient的invokeBlocking方法,另外一種是OMAbstractFactory的createOMElement方法。其實這兩種方式本質是一樣的都是處理xml。因為webservice的基石就是xml。如果你用一個抓包工具來檢視相關傳輸協議的傳輸資訊的話,你會發現,其實這兩種方式的執行過程都是通過互相傳送xml資料來進行相關的webservice方法呼叫的。

         主要過程就是java通過上面的方法把webservice的xml資訊接收到,之後在把呼叫方法的引數資訊填寫到xml中,之後webservice服務端就通過你所填寫的引數,執行相應的方法,返回相應的資料到xml中,之後java客戶端進行解析之後獲得相應的資料。這就是簡單的一個執行流程。

         知道執行流程之後,我們就要說說這兩種方法的具體使用了。

         首先匯入jar是必須的,還是axis2的jar,不介紹怎麼弄了,比較簡單。

         第一種方法:

                     RPCServiceClient serviceClient = newRPCServiceClient();

                     Optionsoptions = serviceClient.getOptions();

                     EndpointReferencetargetEPR = new EndpointReference(url);

                     options.setTo(targetEPR);

                     // 在建立QName物件時,QName類的構造方法的第一個引數表示WSDL檔案的名稱空間名,也就是<wsdl:definitions>元素的targetNamespace屬性值

                      QName opAddEntry = new QName("http://service.wf.cypheta.com",method);


        主要是建立RPCServiceClient客戶物件,通過這個物件我們能夠通過傳入相應的webservice地址完成我們相應介面的呼叫。上面的url就是我們要傳入的webservice的url。之後我們要建立QName物件,QName其實說白了就是有著特定格式的xml元素(名稱空間+特定元素),我們通過傳入名稱空間和特定元素(這裡是我們要呼叫的方法)之後定位到我們要執行方法的xml檔案資訊。

        隨後就是定義傳入引數和返回值資訊:

                      Object[] opAddEntryArgs = new Object[]{481L};

                      // 返回引數型別,這個和axis1有點區別

                      // invokeBlocking方法有三個引數,其中第一個引數的型別是QName物件,表示要呼叫的方法名;

                      // 第二個引數表示要呼叫的WebService方法的引數值,引數型別為Object[];

                      // 第三個引數表示WebService方法的返回值型別的Class物件,引數型別為Class[]。

                      // 當方法沒有引數時,invokeBlocking方法的第二個引數值不能是null,而要使用new Object[]{}

                      // 如果被呼叫的WebService方法沒有返回值,應使用RPCServiceClient類的invokeRobust方法,

                      // 該方法只有兩個引數,它們的含義與invokeBlocking方法的前兩個引數的含義相同

                      Class[] classes = new Class[] {String.class };

                      /*                Object[] object=serviceClient.invokeBlocking(opAddEntry,opAddEntryArgs,classes);

                      for(int i=0;i<object.length;i++){

                             System.out.println(object[i]);

                      }*/

                      System.out.println(serviceClient.invokeBlocking(opAddEntry,opAddEntryArgs,classes)[0].toString());

         最後通過invokeBlocking方法獲得一個物件陣列,這裡面它已經給我封裝好了xml互動的操作,所以我們非常輕鬆的就能夠呼叫webservice介面並且獲得我們相應的資料。

        第二種方法:

         這種方法主要是自己動手來實現xml的互動:這裡麵包括四部分:1、設定傳送請求的URL;2、設定呼叫的webservice地址;3、獲得返回的xml資料;4、利用dom4j解析webservice返回的資料。

第一步:

              OMFactory fac = OMAbstractFactory.getOMFactory();

              OMNamespaceomNs =fac.createOMNamespace("http://www.primeton.com/WSProcessInstManagerService", ""); // 名稱空間

              OMElementdata = fac.createOMElement(method, omNs);// 獲得要呼叫的方法名

              if(params.length!=0){

                     for (int i = 0; i< params.length; i++) {

                            OMElementinner = fac.createOMElement(params[i], omNs); // 獲得該方法名要呼叫的引數名

                            inner.setText(String.valueOf(paramValues[i]));// 輸入引數

                            data.addChild(inner);

                     }

              }

              // 將該引數加入要呼叫的方法節點

              return data;


         這一步主要是設定傳送請求的url,也就是我們要設定我們要呼叫的方法和要傳入的引數,從上面程式碼我們能夠看出,我們首先要建立這樣一個xml檔案,主要包含的資料就是名稱空間和方法名稱還有就是方法的引數資訊

         第二步:

              Options options = newOptions();

              options.setSoapVersionURI(SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI);

              options.setAction("http://www.primeton.com/WSProcessInstManagerService" +method); // 設定呼叫的名稱空間加方法

              options.setTo(targetAirline);

              options.setTransportInProtocol(Constants.TRANSPORT_HTTP); // 設定傳輸協議

              return options;


         這部分主要是設定呼叫的webservice地址,這一步和上面那種方法的前三句程式碼是一個作用,都是把呼叫的webservice的url設定好。

         第三步:

              try {

                     ServiceClientsender = new ServiceClient();

                     sender.setOptions(buildOptions(method));

                     OMElementresult = sender.sendReceive(buildParam(params,

                                   paramValues,method));

                     System.out.println("解析之前的資料:" +result.toString());

                     returnresult.toString();

              } catch(Exception e) {

                     e.printStackTrace();

                     System.out.println("調用出錯!");

                     return"調用出錯!";

              }


          這一步主要是完成相關方法的呼叫,將我們之前設定好的要傳送的xml資訊傳送給我們的webservice,webservice通過解析我們的xml請求,執行相應的方法,返回相應的資訊,這個資訊是以xml的形式返回出來的。

          最後一步:

              try {

                     Documentdoc = DocumentHelper.parseText(getResultByCode(params,

                                   paramValues,method));

                     Elementroot = doc.getRootElement();

                     Elementrn = root.element("s"); // 節點名

                     System.out.println(rn.getData());

                     return (String)rn.getData();

              } catch(DocumentException e) {

                     // TODOAuto-generated catch block

                     e.printStackTrace();

                     System.out.println("解析出錯!");

                     return"解析出錯!";

              }


         這一步就是我們通過dom4j來解析我們所需要的資料了。這個就不詳細介紹了。

         到這一步之後我們就通過java成功呼叫了webservice。其實不是非常困難,主要還是原理上明白怎麼個處理流程。

         希望通過這兩篇部落格的整理,大家能夠會使用axis2建立webservice和利用axis2呼叫webservice!