`
gaozi131
  • 浏览: 17012 次
  • 性别: 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  
楼主在了吗?紧急呼叫 有急事相访

相关推荐

    java调用webservice.zip

    java调用webservicejava调用webservice.zipjava调用webservice.zipjava调用webservice.zipjava调用webservice.zipjava调用webservice.zipjava调用webservice.zipjava调用webservice.zipjava调用webservice.zipjava...

    java 调用 webService工具类

    下面我们将详细探讨Java调用WebService的相关知识点。 1. **WebService概念**: WebService是一种基于互联网的、平台无关的应用程序接口,它允许不同系统之间通过标准协议进行通信。常见的WebService协议有SOAP...

    JAVA调用WEBSERVICE接口

    JAVA调用WEBSERVICE接口

    java调用webservice接口案例,service调用webservice接口

    java调用webservice接口案例,精简,service调用webservice接口案例;不用生成一堆代码,逻辑清晰

    java调用json参数的webservice

    在探讨Java调用带有JSON参数的WebService之前,我们首先需要了解几个关键的技术概念:Java、JSON以及WebService。 Java是一种广泛使用的编程语言,它具有面向对象、跨平台、多线程以及健壮性等特点。Java在企业级...

    C#调用JavaWebService

    调用WebService,最简单的办法当然是直接添加WEB引用,然后自动产生代理类,但是在调用JAVA的WebService时并没有这么简单,特别是对于SoapHeader的处理,通过C#添加Web引用方式访问JavaWebService的方法,除了string...

    java调用webservice工程

    Java调用WebService工程是将Java应用程序与通过WebService接口提供的服务进行交互的过程。WebService是一种基于XML标准的、平台和语言无关的通信方式,它允许不同系统间的应用能够共享数据和服务。在Java中,我们...

    java 调用webservice的几种方法总结

    "Java 调用 Webservice 的几种方法总结" Java 调用 Webservice 的几种方法总结中,主要介绍了使用 JDK Web 服务 API、Axis 和 XFire 等方法来调用 Webservice。下面将对每种方法进行详细的介绍。 使用 JDK Web ...

    JAVA调用webservice并解析xml

    2. **创建WebService客户端**:使用WSDL(Web Service Description Language)文件,你可以自动生成Java客户端代码。Eclipse和MyEclipse都有工具可以做到这一点。WSDL文件描述了Web服务的接口、操作、消息格式等。 ...

    java调用webservice接口方法

    Java调用WebService接口方法是Java开发中常见的任务,尤其在分布式系统和跨平台通信中扮演着重要角色。这里我们主要探讨使用Apache Axis库来实现这一功能。Apache Axis是一款开源工具,它提供了Java到SOAP(简单对象...

    java使用XFire调用webService接口

    "Java 使用 XFire 调用 webService 接口" 在本文中,我们将学习如何使用 XFire 框架在 Java 中调用 webService 接口。XFIRE 是一个基于 Java 的开源框架,用于简化 Web 服务的开发和集成。下面,我们将通过一个简单...

    java 调用webservice的各种方法总结

    Java调用WebService是一种常见的在不同应用之间进行通信的方式,它允许Java应用程序通过SOAP(Simple Object Access Protocol)消息与远程Web服务交互。以下是两种常见的Java调用WebService的方法: **一、利用JDK ...

    java调用第三方webservice服务工具类

    使用Java调用webservice服务,工具类中获取天气服务,可根据官方api进行修改

    java调用webservice接口方法.rar

    Java调用WebService接口是Web应用程序开发中的常见任务,主要用于实现不同系统间的远程通信和数据交换。在本资料中,我们重点关注Java如何与基于SOAP(Simple Object Access Protocol)的WebService进行交互。 1. *...

    java调用webservice接口.zip

    本教程将深入探讨如何使用Axis库来实现在Java中调用WebService接口。Axis是一个开源的Java SOAP栈,它提供了从Java代码中创建和消费Web服务的能力。 **一、什么是WebService?** WebService是一种基于XML的协议,它...

    JAVA 调用SAP SOAP webservice.docx

    JAVA 调用 SAP SOAP webservice 详解 在本文中,我们将详细介绍如何使用 JAVA 调用 SAP SOAP webservice,包括配置 SAP 登录信息、创建 java 项目、添加 web 服务客户端、生成 JAVA 类、调用接口等步骤。 配置 SAP...

    JAVA调用WebService所需要的JAR

    以下将详细介绍Java调用WebService所需的关键JAR文件以及相关的知识点。 1. **SOAP协议**:Java调用WebService通常采用SOAP(Simple Object Access Protocol)协议,这是一种基于XML的协议,用于交换结构化的和类型...

    java调用webservice几种方式

    自定义xml调用webservice

    java调用C++ webservice

    本话题主要探讨如何使用Java调用由C++实现的Web服务(Webservice)。在给出的描述中,提到了通过WSDL(Web Services Description Language)文件来实现这一目标。以下是关于这个主题的详细知识点: 1. **Web服务...

Global site tag (gtag.js) - Google Analytics