终于有空写一下blog了,说一下java调用webservice的方式吧,这里的网络API是DoNet写的,与网上其他的调用有点不一样。
axis方式:
首先,到apache官网下载axis的包,或者百度一下。
接着,就是把jar包放到工程的WEB-INF/lib下,相信这个就不用我多说了吧 !
以下就是代码:
import
java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import javax.xml.namespace.QName;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
public class PutWeather
{
private String url = " http://www.webxml.com.cn/WebServices/WeatherWebService.asmx " ;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import javax.xml.namespace.QName;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
public class PutWeather
{
private String url = " http://www.webxml.com.cn/WebServices/WeatherWebService.asmx " ;
//提供接口的地址
private String soapaction = " http://WebXml.com.cn/ " ; //域名,这是在server定义的
public PutWeather()
{
String City = " 北京 " ;
Service service = new Service();
try {
Call call = (Call)service.createCall();
call.setTargetEndpointAddress(url);
call.setOperationName( new QName(soapaction, " getWeatherbyCityName " )); //设置要调用哪个方法
call.addParameter( new QName(soapaction, " theCityName " ), //设置要传递的参数
org.apache.axis.encoding.XMLType.XSD_STRING,
javax.xml.rpc.ParameterMode.IN);
call.setReturnType( new QName(soapaction, " getWeatherbyCityName " ),Vector. class ); //要返回的数据类型(自定义类型)
// call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);//(标准的类型)
call.setUseSOAPAction( true );
call.setSOAPActionURI(soapaction + " getWeatherbyCityName " );
Vector v = (Vector)call.invoke( new Object[]{City});//调用方法并传递参数
for ( int i = 0 ;i < v.size();i ++ )
{
System.out.println(v.get(i));
}
} catch (Exception ex){ex.printStackTrace();}
}
public static void main(String args[])
{
PutWeather pw = new PutWeather();
}
}
private String soapaction = " http://WebXml.com.cn/ " ; //域名,这是在server定义的
public PutWeather()
{
String City = " 北京 " ;
Service service = new Service();
try {
Call call = (Call)service.createCall();
call.setTargetEndpointAddress(url);
call.setOperationName( new QName(soapaction, " getWeatherbyCityName " )); //设置要调用哪个方法
call.addParameter( new QName(soapaction, " theCityName " ), //设置要传递的参数
org.apache.axis.encoding.XMLType.XSD_STRING,
javax.xml.rpc.ParameterMode.IN);
call.setReturnType( new QName(soapaction, " getWeatherbyCityName " ),Vector. class ); //要返回的数据类型(自定义类型)
// call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);//(标准的类型)
call.setUseSOAPAction( true );
call.setSOAPActionURI(soapaction + " getWeatherbyCityName " );
Vector v = (Vector)call.invoke( new Object[]{City});//调用方法并传递参数
for ( int i = 0 ;i < v.size();i ++ )
{
System.out.println(v.get(i));
}
} catch (Exception ex){ex.printStackTrace();}
}
public static void main(String args[])
{
PutWeather pw = new PutWeather();
}
}
我所调用的这个接口是免费使用的,但是会有限制就是在同意个ip在一天之内只能访问300次,实际我也没有试过真的去访问300次,也是听别人说的。
这个webservice会返回一个大小为23的字符串数组,因此在
call.setReturnType(new QName(soapaction,"getWeatherbyCityName"),Vector.class);
与下面的有所不同,这里设置的返回类型是自定义类型的,也就是没有jar包所提供的类型,因此要返回数组就只能用这种方式设置自定义类型了,如果想把返回的值强制转换为字符串数组会报异常。
call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);
关于axis2的将在过几天再发表,据说axis2要比axis的效率更加高喔!