近日在找工作时,经常碰到公司很关心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结构文档和我此次调用的代码)
这是我第一次在网上发表自己的东西,请各位多多包涵,呵呵。也希望我的这篇处女作确实能帮到人,也希望更多的人能够分享自己的心得
分享到:
相关推荐
java调用webservicejava调用webservice.zipjava调用webservice.zipjava调用webservice.zipjava调用webservice.zipjava调用webservice.zipjava调用webservice.zipjava调用webservice.zipjava调用webservice.zipjava...
下面我们将详细探讨Java调用WebService的相关知识点。 1. **WebService概念**: WebService是一种基于互联网的、平台无关的应用程序接口,它允许不同系统之间通过标准协议进行通信。常见的WebService协议有SOAP...
JAVA调用WEBSERVICE接口
java调用webservice接口案例,精简,service调用webservice接口案例;不用生成一堆代码,逻辑清晰
在探讨Java调用带有JSON参数的WebService之前,我们首先需要了解几个关键的技术概念:Java、JSON以及WebService。 Java是一种广泛使用的编程语言,它具有面向对象、跨平台、多线程以及健壮性等特点。Java在企业级...
调用WebService,最简单的办法当然是直接添加WEB引用,然后自动产生代理类,但是在调用JAVA的WebService时并没有这么简单,特别是对于SoapHeader的处理,通过C#添加Web引用方式访问JavaWebService的方法,除了string...
Java调用WebService工程是将Java应用程序与通过WebService接口提供的服务进行交互的过程。WebService是一种基于XML标准的、平台和语言无关的通信方式,它允许不同系统间的应用能够共享数据和服务。在Java中,我们...
"Java 调用 Webservice 的几种方法总结" Java 调用 Webservice 的几种方法总结中,主要介绍了使用 JDK Web 服务 API、Axis 和 XFire 等方法来调用 Webservice。下面将对每种方法进行详细的介绍。 使用 JDK Web ...
2. **创建WebService客户端**:使用WSDL(Web Service Description Language)文件,你可以自动生成Java客户端代码。Eclipse和MyEclipse都有工具可以做到这一点。WSDL文件描述了Web服务的接口、操作、消息格式等。 ...
Java调用WebService接口方法是Java开发中常见的任务,尤其在分布式系统和跨平台通信中扮演着重要角色。这里我们主要探讨使用Apache Axis库来实现这一功能。Apache Axis是一款开源工具,它提供了Java到SOAP(简单对象...
"Java 使用 XFire 调用 webService 接口" 在本文中,我们将学习如何使用 XFire 框架在 Java 中调用 webService 接口。XFIRE 是一个基于 Java 的开源框架,用于简化 Web 服务的开发和集成。下面,我们将通过一个简单...
Java调用WebService是一种常见的在不同应用之间进行通信的方式,它允许Java应用程序通过SOAP(Simple Object Access Protocol)消息与远程Web服务交互。以下是两种常见的Java调用WebService的方法: **一、利用JDK ...
使用Java调用webservice服务,工具类中获取天气服务,可根据官方api进行修改
Java调用WebService接口是Web应用程序开发中的常见任务,主要用于实现不同系统间的远程通信和数据交换。在本资料中,我们重点关注Java如何与基于SOAP(Simple Object Access Protocol)的WebService进行交互。 1. *...
本教程将深入探讨如何使用Axis库来实现在Java中调用WebService接口。Axis是一个开源的Java SOAP栈,它提供了从Java代码中创建和消费Web服务的能力。 **一、什么是WebService?** WebService是一种基于XML的协议,它...
JAVA 调用 SAP SOAP webservice 详解 在本文中,我们将详细介绍如何使用 JAVA 调用 SAP SOAP webservice,包括配置 SAP 登录信息、创建 java 项目、添加 web 服务客户端、生成 JAVA 类、调用接口等步骤。 配置 SAP...
以下将详细介绍Java调用WebService所需的关键JAR文件以及相关的知识点。 1. **SOAP协议**:Java调用WebService通常采用SOAP(Simple Object Access Protocol)协议,这是一种基于XML的协议,用于交换结构化的和类型...
自定义xml调用webservice
本话题主要探讨如何使用Java调用由C++实现的Web服务(Webservice)。在给出的描述中,提到了通过WSDL(Web Services Description Language)文件来实现这一目标。以下是关于这个主题的详细知识点: 1. **Web服务...