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的方式来生成客户端代码和调用客户端代码====
<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的方式来生成客户端代码和调用客户端代码====