axis,jax-ws,xfire客户端调用分析,以及webservice万能客户端

合集下载

Webservice框架性能对比

Webservice框架性能对比

几种流行Webservice框架性能对比(转载、拼接)1摘要开发webservice应用程序中离不开框架的支持,当open-open网站列举的就有很多种,这对于开发者如何选择带来一定的疑惑。

性能Webservice的关键要素,不同的框架性能上存在较大差异,而当前在官方网站、网络资料中可以方便的找到各自框架的介绍,但是很少有针对不同框架性能测试数据。

本文选择了比较流行几个框架:Apache Axis1、Apache Axis2、Codehaus XFire、Apache CXF、Apache Wink、Jboss RESTEasy、sun JAX-WS(最简单、方便)、阿里巴巴Dubbo (除外)等,采用java作为测试用例,通过本机和远程两种进行测试方式,对这几种框架进行了性能测试,并对测试结果分析和性能比较,最后并对性能优异的框架进行了推荐。

目前三种主流的web服务实现方法:REST(新型):表象化状态转变(软件架构风格)RESTEasy、Wink、CXF、Axis2……. SOAP(比较成熟):简单对象访问协议Xfire、Axis2、CXF、Axis1XML-RPC(淘汰):远程过程调用协议(慢慢被soap 所取代)REST 简单易用,效率高,貌似未来有很大的发展空间,也有宣称rest性能个方便比soap强大的,已经有很多框架宣称对rest进行支持比如spring 3.0、struts…….. (百度观点)SOAP 成熟度较高,安全性较好关键词:Axis1、Axis2、XFire、CXF、Spring、SOAP、StAX、WSDL2框架介绍2.1 Apache Axis1Axis本质上就是一个SOAP引擎(Apache Axis is an implementation of the SOAP),提供创建服务器端、客户端和网关SOAP操作的基本框架。

但Axis并不完全是一个SOAP引擎,它还包括:●是一个独立的SOAP服务器。

XFire开发webservice服务和客户端全攻略

XFire开发webservice服务和客户端全攻略

使用XFire开发webservice服务和客户端全攻略收藏XFire 是与Axis 2并列的新一代Web Service框架,通过提供简单的API支持Web Service 各项标准协议,帮助你方便快速地开发Web Service应用。

相对于Axis来说,目前XFire相对受欢迎,加上其提供了和Spring集成的支持,在目前的Web Service开源社区拥有众多的追随者。

并且因为XFire为Spring提供的支持,使得我们可以很容易在Spring中使用XFire构建Web Service应用。

XFire 与Axis2相比具有如下特征:l 支持一系列Web Service的新标准--JSR181、WSDL2.0 、JAXB2、WS-Security 等;l 使用Stax解释XML,性能有了质的提高。

XFire采用Woodstox 作Stax实现;l 容易上手,可以方便快速地从pojo发布服务;l 支持Spring、Pico、Plexus、Loom等容器;l 灵活的Binding机制,包括默认的Aegis,xmlbeans,jaxb2,castor;l 高性能的SOAP 栈设计;l 支持Spring、Pico、Plexus、Loom等容器。

XFire 与Axis1性能的比较如下:l XFire 比Axis1.3快2-6倍;l XFire 的响应时间是Axis1.3的1/2到1/5。

XFire 在WebService框架中开始较晚,它从现有的框架中借鉴了许多优秀的理念,力争将Web Service的应用开发难度降到最低。

此外,还提供了各种绑定技术、支持多种传输协议,对WebService体系中许多新的规范提供了支持。

下面让我们来看一个XFire于Spring集成的helloWorld的简单例子。

一.实现的功能和特点本例具有如下功能和特点:1)基于J2EE平台的Web Service服务;2)开发方便,配置简单;3)与spring无缝集成。

Web+Services发布与调用(axis,xfire)

Web+Services发布与调用(axis,xfire)

目录一使用Axis和XFire发布Web Service (2)1.1 准备工作 (2)1.1.1 新建工程 (2)1.1.2 axis依赖文件 (3)1.1.3 XFire依赖文件 (3)1.2 Axis发布Web Service (4)1.2.1 传递简单数据类型的Web Service (4)1.2.2 带自定义对象传递的Web Service (8)1.3 XFire发布Web Services (10)1.3.1 传递简单数据类型的Web Service (10)1.3.2传递复杂数据类型的Web Service (12)附录: 1Server的结构 (16)二调用Web Services (17)2.1 准备工作 (17)2.1.1 新建工程 (17)2.1.2 启动Tomcat上发布的1Server服务 (17)2.2 Axis发布的Web Service调用方式 (18)2.2.1 Dynamic Invocation Interface (DII)方式 (18)2.2.2 Dynamic Proxy方式 (19)2.2.3 Stubs方式 (20)2.3调用XFire发布的Web Service (22)2.3.1服务以jar包形式发布的时候直接调用 (23)2.3.2 使用Axis的Client包 (23)2.3.3 使用Xfire的Client包 (24)附录2:2Client目录结构 (31)一使用Axis和XFire发布Web Service 1.1 准备工作Axis主页:/Axis下载:/dist/ws/XFire主页:/XFire下载:/Download去以上站点下载axis最新包和XFire最新包,包内有axis和XFire依赖的其他jar包。

1.1.1 新建工程1.1.2 axis依赖文件1.1.3 XFire依赖文件1.2 Axis发布Web Service1.2.1 传递简单数据类型的Web Service1.把Axis依赖的jar包放入lib文件夹下.2.在web.xml中加入如下:<!-- ****************** axis ws start ****************** --> <listener><listener-class>org.apache.axis.transport.http.AxisHTTPSessionListener </listener-class></listener><servlet><servlet-name>AxisServlet</servlet-name><servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class></servlet><servlet><servlet-name>AdminServlet</servlet-name><servlet-class>org.apache.axis.transport.http.AdminServlet</servlet-class><load-on-startup>100</load-on-startup></servlet><servlet><servlet-name>SOAPMonitorService</servlet-name><servlet-class>org.apache.axis.monitor.SOAPMonitorService</servlet-class><init-param><param-name>SOAPMonitorPort</param-name><param-value>5001</param-value></init-param><load-on-startup>100</load-on-startup></servlet><servlet-mapping><servlet-name>AxisServlet</servlet-name><url-pattern>/servlet/AxisServlet</url-pattern></servlet-mapping><servlet-mapping><servlet-name>AxisServlet</servlet-name><url-pattern>*.jws</url-pattern></servlet-mapping><servlet-mapping><servlet-name>AxisServlet</servlet-name><url-pattern>/services/*</url-pattern></servlet-mapping><servlet-mapping><servlet-name>SOAPMonitorService</servlet-name><url-pattern>/SOAPMonitor</url-pattern></servlet-mapping><!-- uncomment this if you want the admin servlet --><!--<servlet-mapping><servlet-name>AdminServlet</servlet-name><url-pattern>/servlet/AdminServlet</url-pattern></servlet-mapping>--><session-config><!-- Default to 5 minute session timeouts --><session-timeout>5</session-timeout></session-config><!-- currently the W3C havent settled on a media type for WSDL;/TR/2003/WD-wsdl12-20030303/#ietf-draftfor now we go with the basic 'it's XML' response -->3.发布到Tomcat5.0+ 启动Tomcat服务启动的时候若出现下面错误。

axis,jax-ws,xfire客户端调用分析,以及webservice万能客户端

axis,jax-ws,xfire客户端调用分析,以及webservice万能客户端

最近一个项目需要调用一个webservice接口,遇到一个问题.项目中的jdom版本为0.9.而webservice client需要用到jdom1.0 如果将jdom版本升级则会造成现有系统异常.因此需要在不改变现有项目jar的情况下解决这个问题.service端使用的jax-ws2.wsdl如下:Java代码<?xml version="1.0" encoding="UTF-8"?><!-- Published by JAX-WS RI at . RI's version is JAX-WS RI 2.1.1 in JDK 6. --><!-- Generated by JAX-WS RI at . RI's version is JAX-WS RI 2.1.1 in JDK 6. --><definitionsxmlns:soap="/wsdl/soap/"xmlns:tns="/ZySearch"xmlns:xsd="/2001/XMLSchema"xmlns="/wsdl/"targetNamespace="/ZySearch"name="UserLinkWebServiceService"><types></types><message name="getUserLink"><part name="linkNo" type="xsd:string"></part></message><message name="getUserLinkResponse"><part name="returnVal" type="xsd:string"></part></message><portType name="UserLinkWebService"><operation name="getUserLink" parameterOrder="linkNo"><input message="tns:getUserLink"></input><output message="tns:getUserLinkResponse"></output></operation></portType><binding name="UserLinkWebServicePortBinding"type="tns:UserLinkWebService"><soap:binding transport="/soap/http"style="rpc"></soap:binding><operation name="getUserLink"><soap:operation soapAction="getUserLink"></soap:operation><input><soap:body use="literal"namespace="/ZySearch"></soap:body></input><output><soap:body use="literal"namespace="/ZySearch"></soap:body></output></operation></binding><service name="UserLinkWebServiceService"><port name="UserLinkWebServicePort"binding="tns:UserLinkWebServicePortBinding"><soap:addresslocation="http://192.168.1.1.154:9010/ZySearch"></soap:address></port></service></definitions>1.xfire调用对方给我们的client是使用xfire的client调用,代码如下:Java代码package mon;import .URL;import java.util.Map;import org.codehaus.xfire.client.Client;import com.thoughtworks.xstream.XStream;import com.thoughtworks.xstream.io.xml.DomDriver;public class Test {public static void main(String[] args) {String url ="http://192.168.1.1:8000/RES_Searcher/service/IUserLinkWebService?wsd l";Client client;try {client = new Client(new URL(url));Object params[] = {"123456"};String result = (String)client.invoke("getUserLink", params)[0];XStream xStream = new XStream(new DomDriver());Map map = (Map)xStream.fromXML(result);} catch (Exception e) {e.printStackTrace();}}}2.axis调用但是由于jar包的原因,我们不能使用上面的方法,想出的第一个解决方案是使用axis的客户端来调用接口,代码如下:Java代码import java.util.Iterator;import java.util.Map;import java.util.Map.Entry;import space.QName;import org.apache.axis.client.Call;import org.apache.axis.client.Service;import com.thoughtworks.xstream.XStream;import com.thoughtworks.xstream.io.xml.DomDriver;public class TestReflection {public static void main(String[] arg) {String url = "http://192.168.1.1:9010/ZySearch";try {Service service = new Service();Call call = (Call) service.createCall();// 设置调用服务地址call.setTargetEndpointAddress(new .URL(url));//此处一定要配置wsdl的namespace参数/ZySearchcall.setOperationName(newQName("/ZySearch", "getUserLink"));//此处需要配置传入参数类型与参数名称,如果未设置jax-ws则无法接受参数,会认为传入的参数为nullcall.addParameter("linkNo",org.apache.axis.encoding.XMLType.XSD_ST RING,javax.xml.rpc.ParameterMode.IN);//如果设置类传入参数类型,此处也需要设置返回参数类型call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);call.setUseSOAPAction(true);call.setSOAPActionURI(url);String result = (String) call.invoke(new Object[] { "AD0006526305" });XStream xStream = new XStream(new DomDriver());Map map = (Map) xStream.fromXML(result);Iterator it = map.entrySet().iterator();while (it.hasNext()) {Map.Entry enty = (Entry) it.next();System.out.println(enty.getKey() + ":" + enty.getValue());}} catch (Exception e) {e.printStackTrace();}}}3.http模拟调用由于开始对axis的了解有限,在写axis调用是总是有问题,于是便想了另外一个方法,这个方法有点剑走偏锋.但是适用性却很强,因为调用的是java自带的api 不会产生兼容性问题.大家知道webservice请求实际上也就是一个http请求,将数据通过xml文件进行交换.既然知道了原理我们就可以模拟一个http请求来调用webservice.Java代码try{String url2 = "http://192.168.1.1:9010/ZySearch?wsdl";URL getUrl = new URL(url2);HttpURLConnection connection = (HttpURLConnection) getUrl.openConnection();connection.setDoOutput(true);connection.setDoInput(true);connection.setRequestMethod("POST");connection.setRequestProperty("Content-type","text/xml");connection.setRequestProperty("Accept","text/xml");connection.setRequestProperty("User-Agent","JAX-WS RI2.1.3-hudson-390-");String send="<soap:Envelopexmlns:soap=\"/soap/envelope/\"xmlns:xsd=\"/2001/XMLSchema\"xmlns:xsi=\"/2001/XMLSchema-instance\"><soap:Body><ns1:getUserLinkxmlns:ns1=\"/ZySearch\"><linkNoxmlns=\"\">"+par+"</linkNo></ns1:getUserLink></soap:Body></soap:Envel ope>";connection.getOutputStream().write(send.getBytes());connection.getOutputStream().flush();connection.getOutputStream().close();connection.connect();// 取得输入流,并使用Reader读取BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(),"utf-8"));//设置编码,否则中文乱码System.out.println("=============================");System.out.println("Contents of get request");System.out.println("=============================");String lines="";String reuslts = "";while ((lines = reader.readLine()) != null){//lines = new String(lines.getBhqytes(), "utf-8"); reuslts+=lines.replaceAll("&lt;", "<").replaceAll("&gt;", ">");}reader.close();System.out.println("type:"+connection.getContentType()); // 断开连接connection.disconnect();System.out.println(reuslts);System.out.println("============================="); System.out.println("Contents of get request ends"); System.out.println("=============================");XStream xStream = new XStream(new DomDriver());reuslts =reuslts.substring(reuslts.indexOf("<returnVal>")+11);reuslts =reuslts.substring(0,reuslts.indexOf("</returnVal>"));System.out.println(reuslts);Map result = (Map)xStream.fromXML(reuslts);Iterator it = result.entrySet().iterator();while(it.hasNext()){Map.Entry enty = (Entry) it.next();System.out.println(enty.getKey()+":"+enty.getValue());}}catch(Exception e){e.printStackTrace();}4.jax-ws调用最后再写上一个jax-ws的client代码Java代码import .MalformedURLException;import java.util.Map;import space.QName;import javax.xml.soap.MessageFactory;import javax.xml.soap.SOAPBody;import javax.xml.soap.SOAPBodyElement;import javax.xml.soap.SOAPElement;import javax.xml.soap.SOAPMessage;import javax.xml.ws.BindingProvider;import javax.xml.ws.Dispatch;import javax.xml.ws.Service;import javax.xml.ws.WebServiceException;import javax.xml.ws.soap.SOAPBinding;public class Client {// 名字空间public static final String targetNamespace ="/ZySearch";//服务名public static final String serName = "UserLinkWebServiceService"; //端口名public static final String pName = "UserLinkWebServicePort";//服务地址public static final String endpointAddress ="http://192.168.1.1:9010/ZySearch?wsdl";//方法名public static final String OPER_NAME = "getUserLink";//参数名public static final String INPUT_NMAE = "linkNo";/*** @param args* @throws MalformedURLException* @throws Exception*/public static void main(String[] args) throws MalformedURLException, Exception {// TODO Auto-generated method stubQName serviceName = new QName(targetNamespace, serName);QName portName = new QName(targetNamespace, pName);javax.xml.ws.Service service = Service.create(serviceName); service.addPort(portName, SOAPBinding.SOAP11HTTP_BINDING, endpointAddress);Dispatch<SOAPMessage> dispatch =service.createDispatch(portName,SOAPMessage.class, Service.Mode.MESSAGE);BindingProvider bp = (BindingProvider) dispatch;Map<String, Object> rc = bp.getRequestContext();rc.put(BindingProvider.SOAPACTION_USE_PROPERTY, Boolean.TRUE); rc.put(BindingProvider.SOAPACTION_URI_PROPERTY, OPER_NAME);MessageFactory factory =((SOAPBinding)bp.getBinding()).getMessageFactory();SOAPMessage request = factory.createMessage();SOAPBody body = request.getSOAPBody();QName payloadName = new QName(targetNamespace, OPER_NAME, "ns1"); SOAPBodyElement payload = body.addBodyElement(payloadName);SOAPElement message = payload.addChildElement(INPUT_NMAE);message.addTextNode("AD0006526305");SOAPMessage reply = null;try{reply = dispatch.invoke(request);}catch (WebServiceException wse){wse.printStackTrace();}SOAPBody soapBody = reply.getSOAPBody();SOAPBodyElement nextSoapBodyElement =(SOAPBodyElement)soapBody.getChildElements().next ();SOAPElement soapElement =(SOAPElement)nextSoapBodyElement.getChildElements().next();System.out.println("获取回应信息为:" +soapElement.getValue());}}。

java webservice几种调用方式

java webservice几种调用方式

Java WebService几种调用方式一、介绍Java WebService是一种基于SOAP协议的远程方法调用技术,可以实现跨评台、跨语言的通信。

在实际应用中,我们可以使用多种方式来调用Web服务,本文将介绍Java WebService几种常见的调用方式。

二、基于JAX-WS的调用方式JAX-WS(Java API for XML Web Services)是一种用于创建和调用Web服务的Java标准。

通过使用JAX-WS,我们可以方便地创建客户端和服务端,并进行方法调用。

在客户端,我们可以通过使用wsimport命令生成客户端的Java代码,并使用Java代码来调用Web服务的方法。

在服务端,我们可以通过使用@WebService注解来发布服务,并使用Java代码实现方法的具体逻辑。

三、基于Axis的调用方式Apache Axis是一个流行的开源Java Web服务框架,它支持SOAP协议,可以用于创建和调用Web服务。

在基于Axis的调用方式中,我们可以使用WSDL2Java工具生成客户端的Java代码,然后使用Java代码来调用Web服务的方法。

在服务端,我们可以使用Java代码实现方法的逻辑,并使用Axis框架来发布服务。

四、基于CXF的调用方式Apache CXF是另一个流行的开源Java Web服务框架,它也支持SOAP协议,并提供了丰富的特性和扩展性。

在基于CXF的调用方式中,我们可以使用wsdl2java工具生成客户端的Java代码,然后使用Java代码来调用Web服务的方法。

在服务端,我们可以使用Java代码实现方法的逻辑,并使用CXF框架来发布服务。

五、总结在本文中,我们介绍了Java WebService几种常见的调用方式,包括基于JAX-WS、Axis和CXF。

通过这些调用方式,我们可以方便地创建和调用Web服务,实现跨评台、跨语言的通信。

个人观点和理解作为Java开发人员,我认为Java WebService是一种非常重要的技术,它可以帮助我们实现分布式系统之间的通信,为企业级应用的开发提供了很大的便利。

WebService框架JWS、Axis2、XFire、CXF的区别

WebService框架JWS、Axis2、XFire、CXF的区别

WebService框架JWS、Axis2、XFire、CXF的区别1、JWS是Java语言对WebService服务的一种实现,用来开发和发布服务。

而从服务本身的角度来看JWS服务是没有语言界限的。

但是Java语言为Java开发者提供便捷发布和调用WebService服务的一种途径。

2、Axis2是Apache下的一个重量级WebService框架,准确说它是一个Web Services / SOAP / WSDL 的引擎,是WebService框架的集大成者,它能不但能制作和发布WebService,而且可以生成Java和其他语言版WebService客户端和服务端代码。

这是它的优势所在。

但是,这也不可避免的导致了Axis2的复杂性,使用过的开发者都知道,它所依赖的包数量和大小都是很惊人的,打包部署发布都比较麻烦,不能很好的与现有应用整合为一体。

但是如果你要开发Java之外别的语言客户端,Axis2提供的丰富工具将是你不二的选择。

3、XFire是一个高性能的WebService框架,在Java6之前,它的知名度甚至超过了Apache的Axis2,XFire的优点是开发方便,与现有的Web整合很好,可以融为一体,并且开发也很方便。

但是对Java之外的语言,没有提供相关的代码工具。

XFire后来被Apache收购了,原因是它太优秀了,收购后,随着Java6 JWS的兴起,开源的WebService引擎已经不再被看好,渐渐的都败落了。

4、CXF是Apache旗下一个重磅的SOA简易框架,它实现了ESB (企业服务总线)。

CXF来自于XFire项目,经过改造后形成的,就像目前的Struts2来自WebWork一样。

可以看出XFire的命运会和WebWork的命运一样,最终会淡出人们的视线。

CXF不但是一个优秀的Web Services / SOAP / WSDL 引擎,也是一个不错的ESB总线,为SOA的实施提供了一种选择方案,当然他不是最好的,它仅仅实现了SOA架构的一部分。

使用XFire调用WebService需注意的事项

使用XFire调用WebService需注意的事项
(二):连接时注意修改一些参数
比如:HttpClientParams.CONNECTION_MANAGER_TIMEOUT // 设置Timeout
这其实不止是这里需要,任何网络编程都需要注意此事项。当对方服务死了或网络异常,
如果不做timeout处理,按照默认的时间去处理,将会导致服务积压严重甚至被脱死。
E_EXPECT_CONTINUE //client handshake
如果服务不需要传输大量的数据,保持长连接,还是建议关闭掉此功能,设置为false。
否则,在业务量很大的情况下,很容易将服务端和自己都搞的很慢甚至拖死。
HttpClientParams params = new HttpClientParams();
at org.codehaus.xfire.client.Client.invoke(Client.java:336)
at org.codehaus.xfire.client.Client.invoke(Client.jkeisuo贡献
使用XFire调用WebService需注意的事项
(一):注意过滤输入和输出参数空白字符
如果出现空白字符解析不了导致调用失败,导致下面的异常:
org.codehaus.xfire.fault.XFireFault: Error writing document.. Nested exception is com.ctc.wstx.exc.WstxIOException: Invalid null character in text to output
hcparams.setParameter(E_EXPECT_CONTINUE, Boolean.FALSE);

Axis2 Java调用WebService

Axis2 Java调用WebService

Axis2是一套崭新的WebService引擎,该版本是对Axis1.x重新设计的产物。

Axis2不仅支持SOAP1.1和SOAP1.2,还集成了非常流行的REST WebService,同时还支持Spring、JSON等技术。

这些都将在后面的系列教程中讲解。

在本文中主要介绍了如何使用Axis2开发一个不需要任何配置文件的WebService,并在客户端使用Java和C#调用这个WebService。

一、Axis2的下载和安装读者可以从如下的网址下载Axis2的最新版本:/axis2/在本文使用了目前Axis2的最新版本1.4.1。

读者可以下载如下两个zip包:axis2-1.4.1-bin.zipaxis2-1.4.1-war.zip其中axis2-1.4.1-bin.zip文件中包含了Axis2中所有的jar文件, axis2-1.4.1-war.zip 文件用于将WebService发布到Web容器中。

将axis2-1.4.1-war.zip文件解压到相应的目录,将目录中的axis2.war文件放到<Tomcat安装目录>\webapps目录中(本文使用的Tomcat的版本是6.x),并启动Tomcat。

在浏览器地址栏中输入如下的URL:http://localhost:8080/axis2/如果在浏览器中显示出如图1所示的页面,则表示Axis2安装成功。

图1二、编写和发布WebService对于用Java实现的服务程序给人的印象就是需要进行大量的配置,不过这一点在Axis2中将被终结。

在Axis2中不需要进行任何的配置,就可以直接将一个简单的POJO发布成WebService。

其中POJO中所有的public方法将被发布成WebService方法。

下面我们来实现一个简单的POJO,代码如下:public class SimpleService{public String getGreeting(String name){return "你好 " + name;}public int getPrice(){return new java.util.Random().nextInt(1000);}}在SimpleService类中有两个方法,由于这两个方法都是public方法,因此,它们都将作为WebService方法被发布。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

最近一个项目需要调用一个webservice接口,遇到一个问题.项目中的jdom版本为0.9.而webservice client需要用到jdom1.0 如果将jdom版本升级则会造成现有系统异常.因此需要在不改变现有项目jar的情况下解决这个问题.service端使用的jax-ws2.wsdl如下:Java代码<?xml version="1.0" encoding="UTF-8"?><!-- Published by JAX-WS RI at . RI's version is JAX-WS RI 2.1.1 in JDK 6. --><!-- Generated by JAX-WS RI at . RI's version is JAX-WS RI 2.1.1 in JDK 6. --><definitionsxmlns:soap="/wsdl/soap/"xmlns:tns="/ZySearch"xmlns:xsd="/2001/XMLSchema"xmlns="/wsdl/"targetNamespace="/ZySearch"name="UserLinkWebServiceService"><types></types><message name="getUserLink"><part name="linkNo" type="xsd:string"></part></message><message name="getUserLinkResponse"><part name="returnVal" type="xsd:string"></part></message><portType name="UserLinkWebService"><operation name="getUserLink" parameterOrder="linkNo"><input message="tns:getUserLink"></input><output message="tns:getUserLinkResponse"></output></operation></portType><binding name="UserLinkWebServicePortBinding"type="tns:UserLinkWebService"><soap:binding transport="/soap/http"style="rpc"></soap:binding><operation name="getUserLink"><soap:operation soapAction="getUserLink"></soap:operation><input><soap:body use="literal"namespace="/ZySearch"></soap:body></input><output><soap:body use="literal"namespace="/ZySearch"></soap:body></output></operation></binding><service name="UserLinkWebServiceService"><port name="UserLinkWebServicePort"binding="tns:UserLinkWebServicePortBinding"><soap:addresslocation="http://192.168.1.1.154:9010/ZySearch"></soap:address></port></service></definitions>1.xfire调用对方给我们的client是使用xfire的client调用,代码如下:Java代码package mon;import .URL;import java.util.Map;import org.codehaus.xfire.client.Client;import com.thoughtworks.xstream.XStream;import com.thoughtworks.xstream.io.xml.DomDriver;public class Test {public static void main(String[] args) {String url ="http://192.168.1.1:8000/RES_Searcher/service/IUserLinkWebService?wsd l";Client client;try {client = new Client(new URL(url));Object params[] = {"123456"};String result = (String)client.invoke("getUserLink", params)[0];XStream xStream = new XStream(new DomDriver());Map map = (Map)xStream.fromXML(result);} catch (Exception e) {e.printStackTrace();}}}2.axis调用但是由于jar包的原因,我们不能使用上面的方法,想出的第一个解决方案是使用axis的客户端来调用接口,代码如下:Java代码import java.util.Iterator;import java.util.Map;import java.util.Map.Entry;import space.QName;import org.apache.axis.client.Call;import org.apache.axis.client.Service;import com.thoughtworks.xstream.XStream;import com.thoughtworks.xstream.io.xml.DomDriver;public class TestReflection {public static void main(String[] arg) {String url = "http://192.168.1.1:9010/ZySearch";try {Service service = new Service();Call call = (Call) service.createCall();// 设置调用服务地址call.setTargetEndpointAddress(new .URL(url));//此处一定要配置wsdl的namespace参数/ZySearchcall.setOperationName(newQName("/ZySearch", "getUserLink"));//此处需要配置传入参数类型与参数名称,如果未设置jax-ws则无法接受参数,会认为传入的参数为nullcall.addParameter("linkNo",org.apache.axis.encoding.XMLType.XSD_ST RING,javax.xml.rpc.ParameterMode.IN);//如果设置类传入参数类型,此处也需要设置返回参数类型call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);call.setUseSOAPAction(true);call.setSOAPActionURI(url);String result = (String) call.invoke(new Object[] { "AD0006526305" });XStream xStream = new XStream(new DomDriver());Map map = (Map) xStream.fromXML(result);Iterator it = map.entrySet().iterator();while (it.hasNext()) {Map.Entry enty = (Entry) it.next();System.out.println(enty.getKey() + ":" + enty.getValue());}} catch (Exception e) {e.printStackTrace();}}}3.http模拟调用由于开始对axis的了解有限,在写axis调用是总是有问题,于是便想了另外一个方法,这个方法有点剑走偏锋.但是适用性却很强,因为调用的是java自带的api 不会产生兼容性问题.大家知道webservice请求实际上也就是一个http请求,将数据通过xml文件进行交换.既然知道了原理我们就可以模拟一个http请求来调用webservice.Java代码try{String url2 = "http://192.168.1.1:9010/ZySearch?wsdl";URL getUrl = new URL(url2);HttpURLConnection connection = (HttpURLConnection) getUrl.openConnection();connection.setDoOutput(true);connection.setDoInput(true);connection.setRequestMethod("POST");connection.setRequestProperty("Content-type","text/xml");connection.setRequestProperty("Accept","text/xml");connection.setRequestProperty("User-Agent","JAX-WS RI2.1.3-hudson-390-");String send="<soap:Envelopexmlns:soap=\"/soap/envelope/\"xmlns:xsd=\"/2001/XMLSchema\"xmlns:xsi=\"/2001/XMLSchema-instance\"><soap:Body><ns1:getUserLinkxmlns:ns1=\"/ZySearch\"><linkNoxmlns=\"\">"+par+"</linkNo></ns1:getUserLink></soap:Body></soap:Envel ope>";connection.getOutputStream().write(send.getBytes());connection.getOutputStream().flush();connection.getOutputStream().close();connection.connect();// 取得输入流,并使用Reader读取BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(),"utf-8"));//设置编码,否则中文乱码System.out.println("=============================");System.out.println("Contents of get request");System.out.println("=============================");String lines="";String reuslts = "";while ((lines = reader.readLine()) != null){//lines = new String(lines.getBhqytes(), "utf-8"); reuslts+=lines.replaceAll("&lt;", "<").replaceAll("&gt;", ">");}reader.close();System.out.println("type:"+connection.getContentType()); // 断开连接connection.disconnect();System.out.println(reuslts);System.out.println("============================="); System.out.println("Contents of get request ends"); System.out.println("=============================");XStream xStream = new XStream(new DomDriver());reuslts =reuslts.substring(reuslts.indexOf("<returnVal>")+11);reuslts =reuslts.substring(0,reuslts.indexOf("</returnVal>"));System.out.println(reuslts);Map result = (Map)xStream.fromXML(reuslts);Iterator it = result.entrySet().iterator();while(it.hasNext()){Map.Entry enty = (Entry) it.next();System.out.println(enty.getKey()+":"+enty.getValue());}}catch(Exception e){e.printStackTrace();}4.jax-ws调用最后再写上一个jax-ws的client代码Java代码import .MalformedURLException;import java.util.Map;import space.QName;import javax.xml.soap.MessageFactory;import javax.xml.soap.SOAPBody;import javax.xml.soap.SOAPBodyElement;import javax.xml.soap.SOAPElement;import javax.xml.soap.SOAPMessage;import javax.xml.ws.BindingProvider;import javax.xml.ws.Dispatch;import javax.xml.ws.Service;import javax.xml.ws.WebServiceException;import javax.xml.ws.soap.SOAPBinding;public class Client {// 名字空间public static final String targetNamespace ="/ZySearch";//服务名public static final String serName = "UserLinkWebServiceService"; //端口名public static final String pName = "UserLinkWebServicePort";//服务地址public static final String endpointAddress ="http://192.168.1.1:9010/ZySearch?wsdl";//方法名public static final String OPER_NAME = "getUserLink";//参数名public static final String INPUT_NMAE = "linkNo";/*** @param args* @throws MalformedURLException* @throws Exception*/public static void main(String[] args) throws MalformedURLException, Exception {// TODO Auto-generated method stubQName serviceName = new QName(targetNamespace, serName);QName portName = new QName(targetNamespace, pName);javax.xml.ws.Service service = Service.create(serviceName); service.addPort(portName, SOAPBinding.SOAP11HTTP_BINDING, endpointAddress);Dispatch<SOAPMessage> dispatch =service.createDispatch(portName,SOAPMessage.class, Service.Mode.MESSAGE);BindingProvider bp = (BindingProvider) dispatch;Map<String, Object> rc = bp.getRequestContext();rc.put(BindingProvider.SOAPACTION_USE_PROPERTY, Boolean.TRUE); rc.put(BindingProvider.SOAPACTION_URI_PROPERTY, OPER_NAME);MessageFactory factory =((SOAPBinding)bp.getBinding()).getMessageFactory();SOAPMessage request = factory.createMessage();SOAPBody body = request.getSOAPBody();QName payloadName = new QName(targetNamespace, OPER_NAME, "ns1"); SOAPBodyElement payload = body.addBodyElement(payloadName);SOAPElement message = payload.addChildElement(INPUT_NMAE);message.addTextNode("AD0006526305");SOAPMessage reply = null;try{reply = dispatch.invoke(request);}catch (WebServiceException wse){wse.printStackTrace();}SOAPBody soapBody = reply.getSOAPBody();SOAPBodyElement nextSoapBodyElement =(SOAPBodyElement)soapBody.getChildElements().next ();SOAPElement soapElement =(SOAPElement)nextSoapBodyElement.getChildElements().next();System.out.println("获取回应信息为:" +soapElement.getValue());}}。

相关文档
最新文档