使用Java调用以WSDL形式发布的web service

webservice的 发布一般都是使用WSDL(web service descriptive language)文件的样式来发布的,在WSDL文件里面,包含这个webservice暴露在外面可供使用的接口。今天搜索到了非常好的 webservice provider列表 

http://www.webservicex.net/WCF/default.aspx 

这上面列出了70多个包括很多方面的free webservice provider,utilities->global weather就可以获取全球的天气预报。 

下面我们来看Java如何通过WSDL文件来调用这些web service: 

注意,以下的代码并没有经过真正的测试,只是说明这些情况,不同版本的Axis相差很大,大家最好以apache网站上的例子为准,这里仅仅用于说明其基本用法。 

1,直接AXIS调用远程的web service 

我觉得这种方法比较适合那些高手,他们能直接看懂XML格式的WSDL文件,我自己是看不懂的,尤其我不是专门搞这行的,即使一段时间看懂,后来也就忘记了。直接调用模式如下: 

Java代码   收藏代码
  1. import java.util.Date;  
  2. import java.text.DateFormat;  
  3. import org.apache.axis.client.Call;  
  4. import org.apache.axis.client.Service;  
  5. import javax.xml.namespace.QName;  
  6. import java.lang.Integer;  
  7. import javax.xml.rpc.ParameterMode;  
  8.    
  9. public class caClient {  
  10.               
  11.        public static void main(String[] args) {  
  12.    
  13.               try {  
  14.                      String endpoint = "http://localhost:8080/ca3/services/caSynrochnized?wsdl";  
  15.                      //直接引用远程的wsdl文件  
  16.                     //以下都是套路   
  17.                      Service service = new Service();  
  18.                      Call call = (Call) service.createCall();  
  19.                      call.setTargetEndpointAddress(endpoint);  
  20.                      call.setOperationName("addUser");//WSDL里面描述的接口名称  
  21.                      call.addParameter("userName", org.apache.axis.encoding.XMLType.XSD_DATE,  
  22.                                    javax.xml.rpc.ParameterMode.IN);//接口的参数  
  23.                      call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);//设置返回类型    
  24.                      String temp = "测试人员";  
  25.                      String result = (String)call.invoke(new Object[]{temp});  
  26.                      //给方法传递参数,并且调用方法  
  27.                      System.out.println("result is "+result);  
  28.               }  
  29.               catch (Exception e) {  
  30.                      System.err.println(e.toString());  
  31.               }  
  32.        }  
  33. }  

2,直接SOAP调用远程的webservice 
这种模式我从来没有见过,也没有试过,但是网络上有人贴出来,我也转过来 
Java代码   收藏代码
  1. import org.apache.soap.util.xml.*;  
  2. import org.apache.soap.*;  
  3. import org.apache.soap.rpc.*;  
  4.    
  5. import java.io.*;  
  6. import java.net.*;  
  7. import java.util.Vector;  
  8.    
  9. public class caService{  
  10.        public static String getService(String user) {  
  11.        URL url = null;  
  12.        try {  
  13.            url=new URL("http://192.168.0.100:8080/ca3/services/caSynrochnized");  
  14.        } catch (MalformedURLException mue) {  
  15.           return mue.getMessage();  
  16.          }  
  17.              // This is the main SOAP object  
  18.        Call soapCall = new Call();  
  19.        // Use SOAP encoding  
  20.        soapCall.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);  
  21.        // This is the remote object we're asking for the price  
  22.        soapCall.setTargetObjectURI("urn:xmethods-caSynrochnized");  
  23.        // This is the name of the method on the above object  
  24.        soapCall.setMethodName("getUser");  
  25.        // We need to send the ISBN number as an input parameter to the method  
  26.        Vector soapParams = new Vector();  
  27.    
  28.        // name, type, value, encoding style  
  29.        Parameter isbnParam = new Parameter("userName", String.class, user, null);  
  30.        soapParams.addElement(isbnParam);  
  31.        soapCall.setParams(soapParams);  
  32.        try {  
  33.           // Invoke the remote method on the object  
  34.           Response soapResponse = soapCall.invoke(url,"");  
  35.           // Check to see if there is an error, return "N/A"  
  36.           if (soapResponse.generatedFault()) {  
  37.               Fault fault = soapResponse.getFault();  
  38.              String f = fault.getFaultString();  
  39.              return f;  
  40.           } else {  
  41.              // read result  
  42.              Parameter soapResult = soapResponse.getReturnValue ();  
  43.              // get a string from the result  
  44.              return soapResult.getValue().toString();  
  45.           }  
  46.        } catch (SOAPException se) {  
  47.           return se.getMessage();  
  48.        }  
  49.     }  
  50. }  

3,使用wsdl2java把WSDL文件转成本地类,然后像本地类一样使用,即可。 
这是像我这种懒人最喜欢的方式,仍然以前面的global weather report为例。 
首先   java org.apache.axis.wsdl.WSDL2Java http://www.webservicex.net/globalweather.asmx.WSDL 
原本的网址是http://www.webservicex.net/globalweather.asmx?WSDL,中间个各问号,但是Linux下面它不能解析,所以去掉问号,改为点号。 
那么就会出现4个文件: 
GlobalWeather.java  GlobalWeatherLocator.java  GlobalWeatherSoap.java  GlobalWeatherSoapStub.java 
其中GlobalWeatherSoap.java是我们最为关心的接口文件,如果你对RMI等SOAP实现的具体细节不感兴趣,那么你只需要看接口文件即可,在使用的时候,引入这个接口即可,就好像使用本地类一样。
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值