天天看點

java 調用WebService服務接口

  由于最近項目中遇到WebService應用,需要調用WebService提供的接口,搞了幾個小時,才正确的調用到接口。主要問題還是WebService接口在SOAP頭上面搞了些驗證的東西,需要傳一個SOAP頭過去。。。 Java調用WebService可以直接使用Apache提供的axis.jar自己編寫代碼,或者利用Eclipse自動生成WebService Client代碼,利用其中的Proxy類進行調用。理論上是一樣的,隻不過用Eclipse自動生成代碼省事些。 1、編寫代碼方式: package com.yudun.test; import java.rmi.RemoteException;

import org.apache.axis.client.Call;

import org.apache.axis.client.Service;

import org.apache.axis.message.PrefixedQName;

import org.apache.axis.message.SOAPHeaderElement; import com.cezanne.golden.user.Exception;

import com.cezanne.golden.user.UserManagerServiceProxy; import javax.xml.namespace.QName;

import java.net.MalformedURLException; import javax.xml.rpc.ServiceException;

import javax.xml.soap.Name;

import javax.xml.soap.SOAPException;

public class testWebService {  public static String getResult() throws ServiceException, MalformedURLException, RemoteException, SOAPException

  {

     //辨別Web Service的具體路徑

   String endpoint = "WebService服務位址";

     // 建立 Service執行個體

    Service service = new Service();  

     // 通過Service執行個體建立Call的執行個體

    Call call = (Call) service.createCall();

    //将Web Service的服務路徑加入到call執行個體之中.

    call.setTargetEndpointAddress( new java.net.URL(endpoint) );//為Call設定服務的位置     // 由于需要認證,故需要設定調用的SOAP頭資訊。  

    Name headerName = new PrefixedQName( new QName("釋出的wsdl裡的targetNamespace裡的url", "string_itemName") );

          org.apache.axis.message.SOAPHeaderElement header = new SOAPHeaderElement(headerName);

          header.addTextNode( "blablabla" );

          call.addHeader(header);

          //    SOAPHeaderElement soapHeaderElement = new SOAPHeaderElement("釋出的wsdl裡的targetNamespace裡的url", "SoapHeader");  

//    soapHeaderElement.setNamespaceURI("釋出的wsdl裡的targetNamespace裡的url");  

//    try 

//    {  

//        soapHeaderElement.addChildElement("string_itemName").setValue("blablabla");  

//    }  

//    catch (SOAPException e)  

//    {  

//        e.printStackTrace();  

//    }  

//    call.addHeader(soapHeaderElement);        //調用Web Service的方法

          org.apache.axis.description.OperationDesc oper;

          org.apache.axis.description.ParameterDesc param;

          oper = new org.apache.axis.description.OperationDesc();

          oper.setName("opName");

          param = new org.apache.axis.description.ParameterDesc(new javax.xml.namespace.QName("", "arg0"), org.apache.axis.description.ParameterDesc.IN, new javax.xml.namespace.QName(" http://www.w3.org/2001/XMLSchema", "string"), java.lang.String.class, false, false);

          param.setOmittable(true);

          oper.addParameter(param);

          param = new org.apache.axis.description.ParameterDesc(new javax.xml.namespace.QName("", "arg1"), org.apache.axis.description.ParameterDesc.IN, new javax.xml.namespace.QName(" http://www.w3.org/2001/XMLSchema", "string"), java.lang.String.class, false, false);

          param.setOmittable(true);

          oper.addParameter(param);

          param = new org.apache.axis.description.ParameterDesc(new javax.xml.namespace.QName("", "arg2"), org.apache.axis.description.ParameterDesc.IN, new javax.xml.namespace.QName(" http://www.w3.org/2001/XMLSchema", "string"), java.lang.String.class, false, false);

          param.setOmittable(true);

          oper.addParameter(param);

          oper.setReturnType(new javax.xml.namespace.QName(" http://www.w3.org/2001/XMLSchema", "string"));

          oper.setReturnClass(java.lang.String.class);

          oper.setReturnQName(new javax.xml.namespace.QName("", "return"));

          oper.setStyle(org.apache.axis.constants.Style.WRAPPED);

          oper.setUse(org.apache.axis.constants.Use.LITERAL);

          oper.addFault(new org.apache.axis.description.FaultDesc(

                        new javax.xml.namespace.QName("釋出的wsdl裡的targetNamespace裡的url", "Exception"),

                        "Exception",

                        new javax.xml.namespace.QName("釋出的wsdl裡的targetNamespace裡的url", "Exception"),

                        true

                       ));

   call.setOperation( oper );

   call.setOperationName(new javax.xml.namespace.QName("釋出的wsdl裡的targetNamespace裡的url", "opName"));      //調用Web Service,傳入參數

   String res = ( String ) call.invoke( new Object[]("arg0","arg1"));

   System.out.println("===============");

   return res;

  }  

 public static void main(String[] args) {

  try {

   System.out.println(getResult());

  } catch (MalformedURLException e) {

   e.printStackTrace();

  } catch (RemoteException e) {

   e.printStackTrace();

  } catch (ServiceException e) {

   e.printStackTrace();

  } catch (SOAPException e) {

   e.printStackTrace();

  }

    } }   2、利用Eclipse自動生成WebService client代碼就容易多了:(由于還不會發圖檔,就用語言描述了,大家酬和看吧。。。) 首先,new project,選擇other,在輸入框中輸入Web Service Client,選中搜尋後的結果,點選Next,在Service definition中輸入 WebService的釋出位址,點選Finish

這樣,WebService Client代碼已經生成好了。 接下來寫一個Test類,在main函數中輸入如下代碼:    String endpoint = "伺服器的WebService的位址";

 YourWebServiceNameProxy umsp = new YourWebServiceNameProxy (endpoint);

 try {

 String resultStr = umsp.opMethod("arg0","arg1");

 System.out.println(resultStr);

 } catch (Exception e) {

 System.out.println("異常");

 e.printStackTrace();  } catch (RemoteException e) {

 System.out.println("RemoteException異常");

 e.printStackTrace();

}