`
gaozi131
  • 浏览: 16928 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

java调用webservice随感

阅读更多
近日在找工作时,经常碰到公司很关心webservice的操作。于是从没使用过的我在家里自己研究了一阵。在本机上发布在本机上调用很顺利的完成了,可是后来我试着调用网上免费的web服务时,老是出问题。我在网上查找资料也收获很少,最后在QQ问问上,百度上向高手求助,最后在几天之后的今天,在一个叫echo的网友帮助下,然后再根据他的提示上网搜索资料,终于解决啦。下面对把我困扰了几天的问题及解决办法公布,好让以后学习webservice碰到我同样问题的人少走弯路,也是因为我这几天一直受到各位不认识的朋友的无私帮助,很感激。
我要调用的是.net发布的一个天气预报服务。描述如下:
引用
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  

我的客户端调用使用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文件的结构不熟悉,误解了它的意思,导致我很多地方参数设置错误了。
这里总结以下几点我觉得需要初学者注意的:
  • 一个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结构文档和我此次调用的代码)



这是我第一次在网上发表自己的东西,请各位多多包涵,呵呵。也希望我的这篇处女作确实能帮到人,也希望更多的人能够分享自己的心得
7
0
分享到:
评论
7 楼 liuruirui1986 2016-04-08  
new Object[]{cityCode,userId}中的cityCode,userId的值从哪儿取?
6 楼 sammer_mx 2014-05-08  
试了下,可以运行,但是就是版本有点老啦。
5 楼 liberD 2011-06-11  
楼主,在吗?!我使用CXF的wsdl2java访问,就不成。总是报错,想问问是怎么回事。
4 楼 gaozi131 2009-12-25  
哦,不好意思,我做的是java,对于.net不是很了解。
3 楼 juse 2009-12-14  
楼主我到有个问题,如果对方是dataset类型的数据,该怎么处理呢?
2 楼 gaozi131 2009-12-06  
不好意思  我现在住的那儿不能上网了  换了公司也不能上网  所以好久没上了
请问有什么事?
1 楼 yihui720 2009-11-30  
楼主在了吗?紧急呼叫 有急事相访

相关推荐

    自动驾驶运动规划(Motion Planning).pdf

    自动驾驶运动规划(Motion Planning)问题分析

    财务数据分析模型6.xlsx

    Excel数据看板,Excel办公模板,Excel模板下载,Excel数据统计,数据展示

    人力资源数据分析看版.xlsx

    Excel数据看板,Excel办公模板,Excel模板下载,Excel数据统计,数据展示

    重庆大学2011-2012(2)数字电子技术II.pdf

    重庆大学期末考试试卷,重大期末考试试题,试题及答案

    随波逐流CTF编码工具 V5.6 20240424.rar

    由随波逐编写开发,CTF编码工具为用户提供丰富的离线加密解密功能,还可以对字符编码进行转换,文件隐写查看,用户可以根据自己的需求来使用功能,非常实用,能够提高大家的工作效率!

    重庆大学电磁场原理08年考题(A).pdf

    重庆大学期末考试试卷,重大期末考试试题,试题及答案

    基于matlab的SUI信道模型内含数据集.zip

    基于matlab的SUI信道模型内含数据集.zip

    年执行校长岗位工作总结.docx

    工作总结,新年计划,岗位总结,工作汇报,个人总结,述职报告,范文下载,新年总结,新建计划。

    Java项目合集

    提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

    2023产业经济大脑建设方案.pptx

    2023产业经济大脑建设方案.pptx

    基于51单片机设计多功能计算器软硬件资料(包括原理图+仿真+ 软件源程序+文档资料).zip

    基于51单片机设计多功能计算器软硬件资料(包括原理图+仿真+ 软件源程序+文档资料) 本设计是以STC89C52单片机为核心的计算器模拟系统设计,输入采用5×8矩阵键盘,可以进行加、减、乘、除等十几种数字运算,同时支持括号的嵌套使用级浮点数的运算,并在LCD1602上显示操作过程。 本次设计注重设计方法及流程,首先根据原理设计电路,利用keil编程,借助实验开发平台进行仿真实验,进而利用altium designer 制作PCB,最后到焊接元器件,直至调试成功。在设计的同时,特别注重keil软件和altium designer软件的使用方法和技巧以及常用的LCD显示器和矩阵键盘的设计和使用方法。 【关键词】 计算器,STC89C52,矩阵键盘,1602液晶

    年企业个人年度工作总结.docx

    工作总结,新年计划,岗位总结,工作汇报,个人总结,述职报告,范文下载,新年总结,新建计划。

    杭电数据结构期末复习题.pdf

    杭州电子科技大学,期末考试资料,计算机专业期末考试试卷,试卷及答案,数据结构。

    weixin103基于h5移动网赚项目微信小程序+springboot后端毕业源码案例设计.zip

    提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

    C++开发的图书管理系统

    C++开发的图书管理系统

    ... data》

    提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

    FPGA工程师面试题目2020年7月份

    这是我2020年7月份在海淀参加FPGA工程师面试的题目,选择题、问答题,适用于参加FPGA工程师面试的小伙伴。这是当初我参加某个FPGA开发岗位的面试的考卷,里面有我做的答案。该试卷同样适用于FPGA学习者做能力测验。尤其适合尚未开始FPGA开发工作的小伙伴,用于提前试水,作为了解面试考题的素材之一

    采用倒频谱法来估计模糊图像的模糊角度matlab代码.zip

    1.版本:matlab2014/2019a/2021a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    营业额日报.xlsx

    Excel数据看板,Excel办公模板,Excel模板下载,Excel数据统计,数据展示

    人力资源数据分析4.xlsx

    Excel数据看板,Excel办公模板,Excel模板下载,Excel数据统计,数据展示

Global site tag (gtag.js) - Google Analytics