webservice 客户端_java自带方式和Axis2方式

本文介绍了两种调用Webservice的方法:一种是通过Java自带的wsimport工具将WSDL文件转换为Java代码;另一种是利用Axis2工具生成客户端代码。文中还提供了具体的步骤和示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 首先要有wsdl文件,然后从wsdl文件中找到<soap:address location="http://172.26.24.166:81/web1/ZSGHWebService.asmx" />




<wsdl:service name="Service1">//这个是主要类
    <wsdl:port name="Service1Soap" binding="tns:Service1Soap">//这个是调用soap协议的类,就是调用提供方法的类
      <soap:address location="http://172.26.24.166:81/web1/ZSGHWebService.asmx" />//这个就是webservice的url
    </wsdl:port>
  </wsdl:service>


2 知道了地址后,需要将wsdl文件转化为java文件,
方法(在能访问该ip的机器上运行cmd,然后输入):
wsimport -d d: -keep -verbose http://172.26.24.166:81/web1/ZSGHWebService.asmx?wsdl


wsimport命令表示将wsdl文件转化为java文件,
参数说明:
-d 表示输出的目录,目录必须事先存在,否则导出失败。
  -keep表示导出webservice的class文件时是否也导出源代码java文件。
-verbose表示详细信息。
看我们的导出命令。我们直接导在d盘中。


wsdl文件中 soap:address标签中的location值后面加上?wsdl即是wsdl文件的网络路径。
如:soap:address标签中的location值为http://172.26.24.166:81/web1/ZSGHWebService.asmx
网络wsdl文件的网络路径:http://172.26.24.166:81/web1/ZSGHWebService.asmx?wsdl


3 建立普通java工程,将其所生成的java文件加入其中,然后再创建一个测试方法,测试方法的main方法如下:
public static void main(String[] args) {
System.out.println(" main is start");


//这个Service1,在wsdl方法中能找到如上,wsdl:service标签的name值
        Service1 service1=new Service1();


//这个Service1Soap,在wsdl方法中能找到如上,wsdl:port标签的name值,必须通过主要的getService1Soap()得到调用的类
        Service1Soap service1Soap=service1.getService1Soap();


        String result_str=service1Soap.dcQueryAISDetails("412415920", "");//调用接口方法
        System.out.println("收到返回值:"+result_str);
        System.out.println(" main is end");
}


将其工程放置在能访问到webservice的任意一个机器上进行测试,
(例如通过jar来执行,首先将其打成jar(打成可运行的jar)。然后在能访问的任意一台机器上执行java -jar xxxx.jar)


参考资料:
http://my.oschina.net/u/1859292/blog/373940
http://blog.youkuaiyun.com/yaerfeng/article/details/8366212






!!!!注意:
wsimport工具在生成类文件时可能会出错,原因可能是解析xml时出错,大概是有写语法不支持,
可以先将xml文件下载到本地(另存为wsdl文件格式),
使用本地的wsdl文件生成类文件,看到报错的位置,进行相应修改,可能会影响到部分功能,生成的类文件耦合了wsdl文档目录,需要生成后修改。




=====下面介绍第二种方式,第一种方式是java自带的方式,第二种方式是Axis2的方式来生成客户端代码和调用客户端代码====
1 下载Axis2-1.6.2(主要用的就是wsdl2java.bat文件,在Axis2-1.6.2\bin中)


2 打开cmd 进入wsdl2java.bat文件的文件夹目录。然后执行
wsdl2java -uri http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx?wsdl -p cn.com.webxml -o train
参数解释:
-uri表示参数指定了wsdl文件的路径,可以是本地路径,也可以是网络路径
-p参数指定了生成的Java类的包名
-o参数指定了生成的一系列文件保存的根目录
在执行完上面的命令后,读者就会发现在当前目录下多了个train目录,可以找到一个TrainTimeWebServiceStub.java文件,该文件复杂调用WebService,读者可以在程序中直接使用这个类。
这样客户端代码就生成好了。




3 新建普通工程,将生成的客户端代码
加入到src下(将Axis2的jar都添加进来),然后新建测试类。建立main方法。如下:
public static void main(String[] args) {
        try {
//客户端
            WeatherWebServiceStub client=new WeatherWebServiceStub();


//生成参数对象(axis2的方式是将方法的参数都放到参数对象中,通过参数对象进行设值)
            WeatherWebServiceStub.GetSupportProvince province=new WeatherWebServiceStub.GetSupportProvince();


//生成返回值的对象(将返回值也变为了对象)
            WeatherWebServiceStub.ArrayOfString arrayOfString=new WeatherWebServiceStub.ArrayOfString();


//通过调用方法,参数为参数对象,得到返回结果
            arrayOfString=client.getSupportProvince(province).getGetSupportProvinceResult();


//解析
            String[] array_str=arrayOfString.getString();
            for(int i=0;i<array_str.length;i++){
                System.out.println(array_str[i]);
            }


//另外一个参数对象
            WeatherWebServiceStub.GetWeatherbyCityName getWeatherbyCityName2=new WeatherWebServiceStub.GetWeatherbyCityName();


//给参数对象进行设值
            getWeatherbyCityName2.setTheCityName("南京");


//将参数对象作为参数传递,得到返回值对象,然后进行解析
            arrayOfString=client.getWeatherbyCityName(getWeatherbyCityName2).getGetWeatherbyCityNameResult();


//然后进行解析
            array_str=arrayOfString.getString();
            for(int i=0;i<array_str.length;i++){
                System.out.println(array_str[i]);
            }
        }
        catch (AxisFault e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (RemoteException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }


参考资料:
http://blog.sina.com.cn/s/blog_5d7d6f390101crl9.html
http://blog.163.com/lizhenming_2008/blog/static/7655833320143167433925/


注:如果通过axis2调用webservice时,出现“服务器无法处理请求。 ---> 未将对象引用设置到对象的实例。”
可能是因为“值不能为空,说明有一些参数传少了或不够”导致的。


webservice可以通过网页来查看wsdl和调用方法
通过网页上查看wsdl:
http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx?wsdl


通过网页上调用方法(getStationAndTimeByStationName为方法名,后面的是方法的参数和参数值,!!!!!太重要了):
http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx/getStationAndTimeByStationName?StartStation=上海虹桥&ArriveStation=南京南&UserID=
=====第二种方式是Axis2的方式来生成客户端代码和调用客户端代码====
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值