英国童谣歪歪扭扭的人:java 调用WebService服务接口

来源:百度文库 编辑:偶看新闻 时间:2024/04/29 13:10:05
由于最近项目中遇到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;
  } /**
  * @param args
  */
 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();
}
欢迎大家一起讨论~