`
thrillerzw
  • 浏览: 143843 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

webservice

 
阅读更多

一、概念、原理

 

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℃

。。。

 

 

 

 

 

  • 大小: 4.8 KB
0
2
分享到:
评论

相关推荐

    Android通过webservice连接Sqlserver实例

    这个场景通常是通过Web服务,如WebService来实现。本文将详细介绍如何在Android应用中利用WebService接口连接到SQLServer数据库,实现数据的增删改查操作。 首先,理解概念: 1. Android:Android是一种开源操作...

    WebService教程+实例+代码提示功能WebService实例.rar

    这个"WebService教程+实例+代码提示功能WebService实例.rar"压缩包文件显然包含了关于WebService的学习资料、实例代码和可能的代码提示功能,旨在帮助用户深入理解和实践WebService的开发。 首先,"教程地址.txt"很...

    webservice测试调用工具WebserviceStudio20

    WebserviceStudio是一款强大的Web服务测试和调用工具,版本为20。这款工具主要帮助开发者和测试人员方便地测试和调试他们的Web服务。以下是WebserviceStudio的一些核心功能和相关知识点: 1. **图形化界面**:...

    C#调用JavaWebService

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

    SqlServer触发器调用WebService

    ### SqlServer触发器调用WebService知识点详解 #### 一、SqlServer触发器简介 在了解如何通过Sql Server触发器调用WebService之前,我们首先需要对触发器有一个基本的认识。触发器是一种特殊的存储过程,它被定义...

    c++调用webservice(包括静态和动态以及webservice源码)

    然而,由于其自身不直接支持Web服务(WebService)的调用,开发者通常需要借助第三方库或者特定的技术来实现。本篇文章将详细讲解如何在C++中调用WebService,包括静态和动态方式,并探讨相关的源码实现。 首先,让...

    Idea实现WebService实例

    【标题】:Idea实现WebService实例 在Java开发中,WebService是一种常见的跨平台、跨语言的通信方式,它允许不同的应用程序之间交换数据。IntelliJ IDEA(简称Idea)是广受欢迎的Java集成开发环境,提供了强大的...

    一个简单的WEBSERVICE 例子

    根据提供的文件信息,本文将详细解释一个简单的 WebService 示例,并深入探讨其中的关键概念和技术细节。 ### 一、WebService 概念 #### 1.1 WebService 定义 WebService 是一种支持通过网络进行调用的服务形式,...

    WebService的优势与劣势

    ### WebService的优势与劣势 #### 一、WebService概述 WebService是一种平台独立的、分布式的、基于互联网的应用程序接口(API),它使用标准的Internet协议(如HTTP)进行通信,并使用XML来交换数据。WebService...

    webservice获取List案例

    在本案例中,我们关注的是一个特定的Web服务类型——WebService,它用于获取一个包含泛型对象的List。这个场景在分布式系统、微服务架构或者跨平台数据共享中非常常见。让我们深入探讨一下相关的知识点。 1. **...

    WebService依赖jar以及xml.zip

    WebService是一种基于XML(可扩展标记语言)的互联网通信标准,它允许不同的应用程序之间进行互操作。这个名为"WebService依赖jar以及xml.zip"的压缩包文件包含了一组用于构建和运行WebService所需的重要组件。 ...

    webservice模拟客户端测试工具WebserviceStudio20.rar

    WebserviceStudio20便是一款专门用于模拟Web服务客户端的测试工具,帮助开发者便捷地进行功能验证和性能测试。 WebserviceStudio20的核心功能主要包括以下几点: 1. **SOAP请求构造**:它允许用户直接在界面中输入...

    在WinForm程序中调用WebService

    在WinForm应用程序中调用WebService是一项常见的任务,它允许客户端应用程序与远程服务器上的服务进行交互,从而实现数据交换和功能扩展。以下是如何在WinForm中实现这一操作的详细步骤及涉及的相关知识点: 1. **...

    VC++中WebService服务的调用

    在VC++中调用WebService服务是一项常见的任务,尤其在跨平台通信、系统集成或扩展应用程序功能时。WebService是一种基于Web的、松耦合的服务,它使用标准的HTTP协议进行通信,并通过XML(eXtensible Markup Language...

    C# WebService 客户端 服务器 Json

    本主题聚焦于C#中的WebService客户端和服务器的交互,以及如何利用Json进行数据交换。Json(JavaScript Object Notation)是一种轻量级的数据交换格式,因其易读性和易于编写而被广泛应用。 一、C# WebService简介 ...

    webservice接口文档说明.docx

    泛微 Webservice 接口文档说明 泛微 Webservice 接口文档说明是指泛微系统提供的一种基于 XML 的 Web 服务接口,用于实现客户关系管理(CRM)系统与其他系统之间的数据交互。该接口文档提供了接口的使用说明、数据...

    动态调取webservice返回json数据并处理

    这里我们关注的是动态调用WebService并处理返回的JSON数据,然后将这些数据展示在GridView中。这个过程涉及到的技术主要包括:WebService的调用、JSON数据解析以及数据绑定到GridView。 首先,让我们来理解...

    C#webservice调用测试工具

    【标题】:“C# WebService调用测试工具” 在IT领域,Web Service是一种基于网络的、松散耦合的软件组件,它允许不同系统之间的数据交换。C# WebService调用测试工具是专为开发者设计的,用于测试和调试Web Service...

    WebServiceStudio C#源码

    WebServiceStudio是一款基于C#开发的轻量级工具,主要用于测试和调试Web服务接口。这个工具的源码提供了深入理解Web服务交互机制的机会,对于学习和开发相关应用具有很高的价值。以下将详细介绍其中涉及的主要知识点...

Global site tag (gtag.js) - Google Analytics