java调用webservice随感

近日在找工作时,经常碰到公司很关心webservice的操作。于是从没使用过的我在家里自己研究了一阵。在本机上发布在本机上调用很顺利的完成了,可是后来我试着调用网上免费的web服务时,老是出问题。我在网上查找资料也收获很少,最后在QQ问问上,百度上向高手求助,最后在几天之后的今天,在一个叫echo的网友帮助下,然后再根据他的提示上网搜索资料,终于解决啦。下面对把我困扰了几天的问题及解决办法公布,好让以后学习webservice碰到我同样问题的人少走弯路,也是因为我这几天一直受到各位不认识的朋友的无私帮助,很感激。
我要调用的是.net发布的一个天气预报服务。描述如下:
[quote]2400多个城市天气预报 WEB服务 公用事业
Endpoint: http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx
Disco: http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx?disco
WSDL: http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl
[/quote]
我的客户端调用使用axis1.4,代码如下:

// webservice路径
String endpoint = "http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl";
String res = null;

// 查询城市天气的接口方法名
String operationName = "getWeather";
// 定义service对象
Service service = new Service();
// 创建一个call对象
Call call = (Call) service.createCall();
// 设置目标地址,即webservice路径
call.setTargetEndpointAddress(endpoint);
// 设置操作名称,即方法名称
call.setOperationName("getWeather");
// 设置方法参数
call.addParameter( new QName("http://WebXml.com.cn/","getWeatherHttpGetIn"),
org.apache.axis.encoding.XMLType.XSD_STRING,
javax.xml.rpc.ParameterMode.IN);
// 设置返回值类型
//对于返回是字符串数组的返回类型只有这两种可行

call.setReturnType(org.apache.axis.encoding.XMLType.SOAP_STRING);


call.setUseSOAPAction(true);
call.setSOAPActionURI("http://WebXml.com.cn/");

res=(String) call.invoke(new Object[]{""});

return res;
}

这段代码是我现在在正确的基础上回忆的,可能之前尝试了好多种方法,如果有部分失误,请见谅!下面继续。
这个代码的运行是老是抛异常
java调用.net的webservice异常:
严重: Servlet.service() for servlet WeatherServlet threw exception
org.codehaus.xfire.XFireRuntimeException: Could not invoke service.. Nested exception is org.codehaus.xfire.fault.XFireFault: 服务器未能识别 HTTP 头 SOAPAction 的值: 。
org.codehaus.xfire.fault.XFireFault: 服务器未能识别 HTTP 头 SOAPAction 的值: 。

我在网上找了好多,修改了我的call.setSOAPActionURI(),但是无论我怎么改还是不行。今天那个echo告诉我,不但我的call.setSOAPActionURI()有问题,而且我的输入参数也错啦。后来我才开始检查,按照他给我的一些思路和代码去改,果然是的,我的代码漏洞百出,修改后是这样的,功能实现了。

// http://WebXml.com.cn/是wsdl中definitions根节点的targetNamespace属性


// webservice路径
// 这里后面加不加 "?wsdl" 效果都一样的
String endpoint = "http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl";
String[] res = null;

// 查询城市天气的接口方法名
String operationName = "getWeather";
// 定义service对象
Service service = new Service();
// 创建一个call对象
Call call = (Call) service.createCall();
// 设置目标地址,即webservice路径
call.setTargetEndpointAddress(endpoint);
// 设置操作名称,即方法名称
call.setOperationName(new QName("http://WebXml.com.cn/",operationName));
// 设置方法参数
call.addParameter( new QName("http://WebXml.com.cn/","theCityCode"),
org.apache.axis.encoding.XMLType.XSD_STRING,
javax.xml.rpc.ParameterMode.IN);
call.addParameter( new QName("http://WebXml.com.cn/","theUserID"),
org.apache.axis.encoding.XMLType.XSD_STRING,
javax.xml.rpc.ParameterMode.IN);
// 设置返回值类型
//对于返回是字符串数组的返回类型只有这两种可行

//call.setReturnType(org.apache.axis.encoding.XMLType.SOAP_VECTOR);
call.setReturnClass(java.lang.String[].class);

call.setUseSOAPAction(true);
call.setSOAPActionURI("http://WebXml.com.cn/"+"getWeather");

res=(String[]) call.invoke(new Object[]{cityCode,userId});

// 如果返回类型是org.apache.axis.encoding.XMLType.SOAP_VECTOR时用下面的转型接收
//Vector v=(Vector) call.invoke(new Object[]{cityCode,userId});
for(String str:res)
{
System.out.println(str);
}
return res;
}

原来我主要是对wsdl文件的结构不熟悉,误解了它的意思,导致我很多地方参数设置错误了。
这里总结以下几点我觉得需要初学者注意的:
[list]
[*]一个wsdl的命名空间就是defininations的targetnamespace属性
call.setSOAPActionURI("http://WebXml.com.cn/"+"getWeather");这个方法网上好多地方都只是传入一个URI,就是那个wsdl的命名空间,这是错的,必须接上我们要调用的接口方法
对于我类似我这种返回类型是字符串数组型的,可以设置返回类型为org.apache.axis.encoding.XMLType.SOAP_VECTOR或java.lang.String[].class,其它的好像不可以,我测了下
还有setOperationName()方法中的参数最好使用QName对象传入,防止出错。
对于其它的请看我的附件吧(是一个wsdl结构文档和我此次调用的代码)
[/list]


[b]这是我第一次在网上发表自己的东西,请各位多多包涵,呵呵。也希望我的这篇处女作确实能帮到人,也希望更多的人能够分享自己的心得[/b]
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值