一、概念、原理
WebService的主要目标是跨平台(xml)的可互操作性。
场景:异构系统之间交换数据。访问其他部门的同构系统。实现应用之间的松耦合。 把可重复使用的应用程序组件作为服务来提供,比如天气预报。在不同的应用程序与平台之间来交换数据。
不适用场景:一台机器或一个局域网里面运行的同构应用程序。性能低。
Web services 使用 XML 来编解码数据,并使用 SOAP 来传输数据。
Web服务的体系结构是基于Web服务提供者、Web服务请求者、Web服务中介者(wsdl)三个角色和发布、发现、绑定三个动作构建的。
请求者利用wsdl描述SOAP(Simple Object Access Protocol,简单对象访问协议,)消息向Web服务提供者发送请求以获得服务
SOAP 是一种基于 XML 的简易协议,允许应用程序通过 HTTP 来交换信息。
WSDL(网络服务描述语言,Web Services Description Language)是一门基于 XML 的语言,用一个简单的 XML 文档来描述 Web Services 以及如何对它们进行访问。
<?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> <soap:Header> ... ... </soap:Header> <soap:Body> ... ... <soap:Fault> ... ... </soap:Fault> </soap:Body> </soap:Envelope>
二、 cxf
1、服务端:
服务端和客户端都使用版本:cxf-2.7.7,使用了如下几个包
package com.thrillerzw.springtest.cxf.server; import java.util.List; import javax.jws.WebService; import com.thrillerzw.springtest.cxf.User; /** * * webservice接口 * * @author thrillerzw * @date 2013年9月26日 */ @WebService public interface IHelloService { //字符串 public String sayHello(String username); //对象 public User getUser(long id); //list集合 public List<User> getList(); }
package com.thrillerzw.springtest.cxf.server; import java.util.ArrayList; import java.util.List; import javax.jws.WebService; import com.thrillerzw.springtest.cxf.User; /** * webservice实现类 * * @author thrillerzw * @date 2013年9月26日 */ @WebService(endpointInterface = "com.thrillerzw.springtest.cxf.server.IHelloService") public class HelloServiceImpl implements IHelloService { @Override public String sayHello(String username) { return "hello, " + username; } @Override public User getUser(long id) { User user = new User(); user.setId(id); user.setName("名字thrillerzw"); user.setAge(27); return user; } @Override public List<User> getList() { List<User> list = new ArrayList<User>(); if (list != null) { for (int i = 1; i <= 3; i++) { User user = new User(); user.setId(i); user.setName("名字thrillerzw" + i); user.setAge(20 + i); list.add(user); } } return list; } }
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <!-- ***注意*** 手动添加的内容: xmlns:jaxws="http://cxf.apache.org/jaxws" http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd" --> <import resource="classpath:META-INF/cxf/cxf.xml" /> <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" /> <import resource="classpath:META-INF/cxf/cxf-servlet.xml" /> <jaxws:endpoint id="helloService" implementor="com.thrillerzw.springtest.cxf.server.HelloServiceImpl" address="/helloService" /> </beans>
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <!-- Spring上下文配置 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/classes/applicationContext-*.xml</param-value> </context-param> <!-- Spring监听器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- cxf --> <servlet> <servlet-name>CXFServlet</servlet-name> <display-name>CXFServlet</display-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>CXFServlet</servlet-name> <url-pattern>/ws/*</url-pattern> </servlet-mapping> </web-app>
2、客户端:
生成客户端代码:
F:\apache-cxf-2.7.7\bin>wsdl2java -d src -client http://192.168.1.2/springtest
/ws/helloService?wsdl
手动创建src目录
拷贝生成的文件到工程,不需要拷贝IHelloService.java ,IHelloService_HelloServiceImplPort_Client.java 这2个文件。
package cxf.client; import java.util.List; import org.apache.cxf.endpoint.Client; import org.apache.cxf.endpoint.dynamic.DynamicClientFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.thrillerzw.springtest.cxf.server.IHelloService; import com.thrillerzw.springtest.cxf.server.User; /** * cxf客户端 * * @author thrillerzw * @date 2013年9月26日 */ public class CxfClient { public static void main(String[] args) { //直接调用字符串 DynamicClientFactory dcf = DynamicClientFactory.newInstance(); Client client = dcf.createClient("http://192.168.1.2/springtest/ws/helloService?wsdl"); Object[] reply=null; try { reply = client.invoke("sayHello", new Object[] { "thrillerzw" }); } catch (Exception e) { e.printStackTrace(); } System.out.println(reply[0]); try { reply = client.invoke("getUser", new Object[] { new Long(1) }); } catch (Exception e) { e.printStackTrace(); } System.out.println(reply[0]); //通过spring,调用字符串、对象、集合 System.out.println("spring---------------------"); ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-cxf-client.xml"); IHelloService helloService = (IHelloService) context.getBean("client"); System.out.println(helloService.sayHello("thrillerzw")); User user=helloService.getUser(20); System.out.println(user.getId()+" "+user.getName()+" "+user.getAge()); List<User> list= helloService.getList(); for(User u: list){ System.out.println(u.getId()+" "+u.getName()+" "+u.getAge()); } } }
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <!-- ***注意*** 手动添加的内容: xmlns:jaxws="http://cxf.apache.org/jaxws" http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd" --> <import resource="classpath:META-INF/cxf/cxf.xml" /> <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" /> <import resource="classpath:META-INF/cxf/cxf-servlet.xml" /> <bean id="client" class="com.thrillerzw.springtest.cxf.server.IHelloService" factory-bean="clientFactory" factory-method="create" /> <bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean"> <property name="serviceClass" value="com.thrillerzw.springtest.cxf.server.IHelloService" /> <property name="address" value="http://192.168.1.2/springtest/ws/helloService" /> </bean> </beans>
输出:
hello, thrillerzw
com.thrillerzw.springtest.cxf.server.User@1f4cdd2
spring---------------------
hello, thrillerzw
20 名字thrillerzw 27
1 名字thrillerzw1 21
2 名字thrillerzw2 22
3 名字thrillerzw3 23
Apache cxf 学习笔记 http://wenku.baidu.com/view/ae7f5fa8d1f34693daef3e91.html
三、axis2
1 调用天气客户端
http://www.webxml.com.cn/WebServices/WeatherWebService.wsdl
package com.thrillerzw.springtest.axis2.client; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.apache.axiom.om.OMAbstractFactory; import org.apache.axiom.om.OMElement; import org.apache.axiom.om.OMFactory; import org.apache.axiom.om.OMNamespace; import org.apache.axiom.soap.SOAP11Constants; import org.apache.axis2.Constants; import org.apache.axis2.addressing.EndpointReference; import org.apache.axis2.client.Options; import org.apache.axis2.client.ServiceClient; import org.apache.axis2.transport.http.HttpTransportProperties.ProxyProperties; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.Node; import org.dom4j.XPath; import org.dom4j.io.SAXReader; public class WeatherTest { private static EndpointReference targetEPR = new EndpointReference( "http://www.webxml.com.cn/WebServices/WeatherWebService.asmx"); public OMElement getResult() throws Exception { ServiceClient sender = new ServiceClient(); sender.setOptions(buildOptions()); OMElement result = sender.sendReceive(buildParam()); // System.out.println(result); return result; } private static OMElement buildParam() { OMFactory fac = OMAbstractFactory.getOMFactory(); OMNamespace omNs = fac.createOMNamespace("http://WebXml.com.cn/", ""); OMElement data = fac.createOMElement("getWeatherbyCityName", omNs); OMElement inner = fac.createOMElement("theCityName", omNs); inner.setText("北京"); data.addChild(inner); return data; } private static Options buildOptions() { Options options = new Options(); options.setSoapVersionURI(SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI); options.setAction("http://WebXml.com.cn/getWeatherbyCityName"); options.setTo(targetEPR); // options.setProperty 如果不是通过代理上网,此句可省 // options.setProperty(HTTPConstants.PROXY, buildProxy()); options.setTransportInProtocol(Constants.TRANSPORT_HTTP); return options; } /** * 本机采用代理服务器上网时,需要设置代理 * * @return */ public static ProxyProperties buildProxy() { ProxyProperties proxyProperties = new ProxyProperties(); proxyProperties.setProxyName("代理名称"); proxyProperties.setProxyPort(8080); return proxyProperties; } public static List<String> parseOMElement(OMElement element) { if (element == null) { return null; } Iterator<OMElement> iterator = element.getChildElements(); List<String> list = new ArrayList<String>(); OMElement result = null; Iterator<OMElement> childIte=null; while (iterator.hasNext()) { result = iterator.next(); childIte= result.getChildElements(); while (childIte.hasNext()) { OMElement elem = childIte.next(); list.add(elem.getText()); } } return list; } public static List<String> parseXml(String xml) { List<String> list = new ArrayList<String>(); try { Document document = DocumentHelper.parseText(xml); //方法一:遍历 /* Element root = document.getRootElement(); Element element=root.element("getWeatherbyCityNameResult"); List<Element> strList = element.elements("string"); for(Element e:strList){ list.add(e.getTextTrim()); }*/ //方法二:通过xpath查找 ,注意:设置namespace /* 如果没有namespace会简单很多,如下 * Node root = document.getRootElement(); * List<Element> elements=root.selectNodes("/getWeatherbyCityNameResponse/ns:getWeatherbyCityNameResult/ns:string"); */ Map map = new HashMap(); //ns自己定义 map.put("ns", "http://WebXml.com.cn/"); //根元素不是必须带ns: 或者 相对查找 ns:getWeatherbyCityNameResult/ns:string 或者 //ns:string XPath x = document .createXPath("/getWeatherbyCityNameResponse/ns:getWeatherbyCityNameResult/ns:string"); x.setNamespaceURIs(map); List<Element> nodelist = x.selectNodes(document); for(Element e:nodelist){ list.add(e.getText()); } } catch (DocumentException e) { e.printStackTrace(); } return list; } public static void main(String[] args) throws Exception { WeatherTest s = new WeatherTest(); OMElement oMElement = s.getResult(); System.out.println("------------------ parseOMElement"); List<String> list = parseOMElement(oMElement); for (String value : list) { System.out.println(value); } System.out.println("------------------ parseXml"); List<String> xmlList = parseXml(oMElement.toString()); for (String value : xmlList) { System.out.println(value); } } }
输出:
------------------ parseOMElement
直辖市
北京
54511
54511.jpg
2013-10-1 12:49:01
12℃/20℃
10月1日 多云转晴
北风3-4级
1.gif
0.gif
今日天气实况:气温:16℃;风向/风力:东北风 3级;湿度:89%;空气质量:良;紫外线强度:最弱
穿衣指数:较舒适,建议穿薄外套或牛仔裤等服装。
过敏指数:不易发,除特殊体质,无需担心过敏问题。
运动指数:较不宜,有较强降水,请在室内进行休闲运动。
洗车指数:不宜,有雨,雨水和泥水会弄脏爱车。
晾晒指数:不宜,有较强降水会淋湿衣物,不适宜晾晒。
旅游指数:一般,风稍大,较强降雨将给出行带来不便。
路况指数:湿滑,路面湿滑,车辆易打滑,减慢车速。
舒适度指数:舒适,白天不冷不热,风力不大。
空气污染指数:良,气象条件有利于空气污染物扩散。
紫外线指数:最弱,辐射弱,涂擦SPF8-12防晒护肤品。
9℃/23℃
10月2日 晴
北风3-4级转无持续风向微风
0.gif
0.gif
12℃/23℃
10月3日 晴
无持续风向微风
0.gif
0.gif
北京位于华北平原西北边缘,市中心位于北纬39度,东经116度xxx...
------------------ parseXml
直辖市
北京
54511
54511.jpg
2013-10-1 12:49:01
12℃/20℃
10月1日 多云转晴
北风3-4级
1.gif
0.gif
今日天气实况:气温:16℃;风向/风力:东北风 3级;湿度:89%;空气质量:良;紫外线强度:最弱
穿衣指数:较舒适,建议穿薄外套或牛仔裤等服装。
过敏指数:不易发,除特殊体质,无需担心过敏问题。
运动指数:较不宜,有较强降水,请在室内进行休闲运动。
洗车指数:不宜,有雨,雨水和泥水会弄脏爱车。
晾晒指数:不宜,有较强降水会淋湿衣物,不适宜晾晒。
旅游指数:一般,风稍大,较强降雨将给出行带来不便。
路况指数:湿滑,路面湿滑,车辆易打滑,减慢车速。
舒适度指数:舒适,白天不冷不热,风力不大。
空气污染指数:良,气象条件有利于空气污染物扩散。
紫外线指数:最弱,辐射弱,涂擦SPF8-12防晒护肤品。
9℃/23℃
10月2日 晴
北风3-4级转无持续风向微风
0.gif
0.gif
12℃/23℃
10月3日 晴
无持续风向微风
0.gif
0.gif
北京位于华北平原西北边缘,市中心位于北纬39度,东经116度xxx...
2 调用客户端
命令行生成客户端:
D:\asix2\axis2-1.6.2-bin\axis2-1.6.2\bin>wsdl2java.bat -uri http://www.web
xml.com.cn/WebServices/WeatherWebService.wsdl -p com.thrillerzw.springtest.axis2.client.stub -o f:\1
-p 为包名,-o 为输出目录
输出:
WeatherWebServiceCallbackHandler.java WeatherWebServiceStub.java
编写调用helper类:
package com.thrillerzw.springtest.axis2.client.stub; import java.rmi.RemoteException; import org.apache.axis2.AxisFault; import com.thrillerzw.springtest.axis2.client.stub.WeatherWebServiceStub.ArrayOfString; import com.thrillerzw.springtest.axis2.client.stub.WeatherWebServiceStub.GetWeatherbyCityName; import com.thrillerzw.springtest.axis2.client.stub.WeatherWebServiceStub.GetWeatherbyCityNameResponse; /** * 命令行生成axis2的客户端,获取北京的天气 * * @author thrillerzw * @date 2013年10月5日 */ public class WeatherWSHelper { public static void main(String[] args) { try { WeatherWebServiceStub stub = new WeatherWebServiceStub(); GetWeatherbyCityName request = new GetWeatherbyCityName(); request.setTheCityName("北京"); GetWeatherbyCityNameResponse response = stub .getWeatherbyCityName(request); ArrayOfString arr = response.getGetWeatherbyCityNameResult(); String[] strArr = arr.getString(); for (int i = 0; i < strArr.length; i++) { System.out.println(strArr[i]); } } catch (AxisFault e) { e.printStackTrace(); } catch (RemoteException e) { e.printStackTrace(); } } }
输出同第一种方式:
直辖市
北京
54511
54511.jpg
2013-10-5 21:50:35
12℃/22℃
。。。
相关推荐
这个场景通常是通过Web服务,如WebService来实现。本文将详细介绍如何在Android应用中利用WebService接口连接到SQLServer数据库,实现数据的增删改查操作。 首先,理解概念: 1. Android:Android是一种开源操作...
这个"WebService教程+实例+代码提示功能WebService实例.rar"压缩包文件显然包含了关于WebService的学习资料、实例代码和可能的代码提示功能,旨在帮助用户深入理解和实践WebService的开发。 首先,"教程地址.txt"很...
WebserviceStudio是一款强大的Web服务测试和调用工具,版本为20。这款工具主要帮助开发者和测试人员方便地测试和调试他们的Web服务。以下是WebserviceStudio的一些核心功能和相关知识点: 1. **图形化界面**:...
调用WebService,最简单的办法当然是直接添加WEB引用,然后自动产生代理类,但是在调用JAVA的WebService时并没有这么简单,特别是对于SoapHeader的处理,通过C#添加Web引用方式访问JavaWebService的方法,除了string...
### SqlServer触发器调用WebService知识点详解 #### 一、SqlServer触发器简介 在了解如何通过Sql Server触发器调用WebService之前,我们首先需要对触发器有一个基本的认识。触发器是一种特殊的存储过程,它被定义...
然而,由于其自身不直接支持Web服务(WebService)的调用,开发者通常需要借助第三方库或者特定的技术来实现。本篇文章将详细讲解如何在C++中调用WebService,包括静态和动态方式,并探讨相关的源码实现。 首先,让...
【标题】:Idea实现WebService实例 在Java开发中,WebService是一种常见的跨平台、跨语言的通信方式,它允许不同的应用程序之间交换数据。IntelliJ IDEA(简称Idea)是广受欢迎的Java集成开发环境,提供了强大的...
根据提供的文件信息,本文将详细解释一个简单的 WebService 示例,并深入探讨其中的关键概念和技术细节。 ### 一、WebService 概念 #### 1.1 WebService 定义 WebService 是一种支持通过网络进行调用的服务形式,...
### WebService的优势与劣势 #### 一、WebService概述 WebService是一种平台独立的、分布式的、基于互联网的应用程序接口(API),它使用标准的Internet协议(如HTTP)进行通信,并使用XML来交换数据。WebService...
在本案例中,我们关注的是一个特定的Web服务类型——WebService,它用于获取一个包含泛型对象的List。这个场景在分布式系统、微服务架构或者跨平台数据共享中非常常见。让我们深入探讨一下相关的知识点。 1. **...
WebService是一种基于XML(可扩展标记语言)的互联网通信标准,它允许不同的应用程序之间进行互操作。这个名为"WebService依赖jar以及xml.zip"的压缩包文件包含了一组用于构建和运行WebService所需的重要组件。 ...
WebserviceStudio20便是一款专门用于模拟Web服务客户端的测试工具,帮助开发者便捷地进行功能验证和性能测试。 WebserviceStudio20的核心功能主要包括以下几点: 1. **SOAP请求构造**:它允许用户直接在界面中输入...
在WinForm应用程序中调用WebService是一项常见的任务,它允许客户端应用程序与远程服务器上的服务进行交互,从而实现数据交换和功能扩展。以下是如何在WinForm中实现这一操作的详细步骤及涉及的相关知识点: 1. **...
在VC++中调用WebService服务是一项常见的任务,尤其在跨平台通信、系统集成或扩展应用程序功能时。WebService是一种基于Web的、松耦合的服务,它使用标准的HTTP协议进行通信,并通过XML(eXtensible Markup Language...
本主题聚焦于C#中的WebService客户端和服务器的交互,以及如何利用Json进行数据交换。Json(JavaScript Object Notation)是一种轻量级的数据交换格式,因其易读性和易于编写而被广泛应用。 一、C# WebService简介 ...
泛微 Webservice 接口文档说明 泛微 Webservice 接口文档说明是指泛微系统提供的一种基于 XML 的 Web 服务接口,用于实现客户关系管理(CRM)系统与其他系统之间的数据交互。该接口文档提供了接口的使用说明、数据...
这里我们关注的是动态调用WebService并处理返回的JSON数据,然后将这些数据展示在GridView中。这个过程涉及到的技术主要包括:WebService的调用、JSON数据解析以及数据绑定到GridView。 首先,让我们来理解...
【标题】:“C# WebService调用测试工具” 在IT领域,Web Service是一种基于网络的、松散耦合的软件组件,它允许不同系统之间的数据交换。C# WebService调用测试工具是专为开发者设计的,用于测试和调试Web Service...
WebServiceStudio是一款基于C#开发的轻量级工具,主要用于测试和调试Web服务接口。这个工具的源码提供了深入理解Web服务交互机制的机会,对于学习和开发相关应用具有很高的价值。以下将详细介绍其中涉及的主要知识点...