`

WebService(WEB服务)--获取网络数据

    博客分类:
  • XML
阅读更多
运用WebService(WEB服务),可以很方便快捷的获取想要的数据。http://www.webxml.com.cn/zh_cn/index.aspx网站提供了很多web服务。下面以获取汇率为例,来说明webservice的用法。
这个例子运用到了dom4j操作xml文件,先是从两个web服务中分别获取数据,最后根据具体需求将数据整合在一起,生成一个xml文件。本例中需要用到的webservice有两个:http://webservice.webxml.com.cn/WebServices/ExchangeRateWebService.asmxhttp://webservice.webxml.com.cn/WebServices/ForexRmbRateWebService.asmx。完整版代码见附件,精简版代码如下,哈哈
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.URL;
import java.net.URLConnection;
import java.text.DecimalFormat;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
/**
 * getExchangeRate
 */

/**
 * getForexRmbRate
 */

/**
 * 调用webservice得到汇率服务
 * @author gerry
 * 2010-09-06
 */
public class ExchangeRateXML{
	private static String encodeOut = "GBK";
	private static String encodeIn = "UTF-8";
	
	private static Proxy proxy;//代理
	private static String proxyStr = "10.3.1.93";//代理IP地址 若不用代理请设置proxyStr="";
	private static int proxyCode = 3128;//代理端口
	
	private static int COUNT = 10;//尝试连接次数
	
	/**
	 * 单例模式
	 */
	private static ExchangeRateXML exchangeRateXML;
	
	/**
	 * 私有的构造方法
	 */
	private ExchangeRateXML(){
		
	}
	
	/**
	 * public的获取单例对象的方法
	 */
	public static ExchangeRateXML getInstance(){
		if(exchangeRateXML==null){
			exchangeRateXML = new ExchangeRateXML();
			InetSocketAddress isa = new InetSocketAddress(proxyStr, proxyCode);
			proxy = new Proxy(Proxy.Type.HTTP, isa);
		}
		return exchangeRateXML;
	}
	
	
	/**
	 * 通过dom4j生成xml文件
	 * @return 成功true   失败false
	 */
	private  boolean createExchangeRateXMLFile(String fileName){
		boolean flag = false;
		Document document=null;
		SAXReader reader = new SAXReader();
		
		Map<String,String> map = new HashMap<String,String>();
		map.put("xxx", "");
		reader.getDocumentFactory().setXPathNamespaceURIs(map);
		
		try{
			InputStream is = getSoapInputStream(1);//得到输入流
			document=reader.read(is);//将输入流转化为document
			List<Element> list = document.selectNodes("//xxx:ExchangeRate");
			Element relativeRootElement = list.get(0).getParent().getParent();//diffgr:diffgram节点  相对根节点
			DecimalFormat df = new DecimalFormat("###0.0000"); //保留小数点后4位
			Element e = null;
			for(int i=0; i<=6; i++){  
				e = list.get(i);
				//先把名称改为"美元Currency"的格式
				e.element("Currency").setText("美元"+e.element("Currency").getText());
				e.element("Code").setText("USD-"+e.element("Code").getText());
			}
			
			is = getSoapInputStream(2);//得到输入流
			Document doc = reader.read(is);    //将输入流转化为document
			List<Element> l = doc.selectNodes("//xxx:ForexRmbRate");
			Element ele = null;
			for (Iterator<Element> it = l.iterator(); it.hasNext();) {
				ele = it.next();
				//ele.element("Name").setText(ele.element("Name").getText()+"人民币");
				ele.element("Name").setText(ele.element("Symbol").getText()); //为了解决在Linux上中文字符的问题
				ele.element("Symbol").setText(ele.element("Symbol").getText()+"-RMB");
			}
			Element element = (Element)doc.selectSingleNode("//xxx:getForexRmbRate");
			Element elementCopy = element.createCopy();//copy节点
			relativeRootElement.add(elementCopy);
			//或relativeRootElement.appendContent(element.getParent());
			
			OutputFormat format = OutputFormat.createPrettyPrint();
			format.setEncoding(encodeOut);
			format.setIndent("     ");
			XMLWriter writer = new XMLWriter(new FileWriter(new File(fileName)),format); 
			writer.write(document); 
			writer.close(); 
			flag = true;
		}catch (Exception e){
			e.printStackTrace();
		}
		return flag;
	}
	
	
	/**
	 * 从xml文件中获取数据  采用XPath
	 * @return
	 */
	@SuppressWarnings("unchecked")
	private static void getExchangeRateDataFromXMLFile(String fileName){
		SAXReader reader = new SAXReader();
		Map<String,String> map = new HashMap<String,String>();
		map.put("aaa", "");
		reader.getDocumentFactory().setXPathNamespaceURIs(map);
		try {
			InputStream is = new FileInputStream(fileName);
			Document document = reader.read(is);
			//上行代码也可以写成Document document = reader.read(new File(fileName));
			//找到ForexRmbRate节点
			List<Element> list = document.selectNodes("//aaa:ForexRmbRate");
			for (Iterator<Element> it = list.iterator(); it.hasNext();) {
				Element elm = it.next();
				String temp = null;
				temp = elm.element("BasePrice").getText();
				temp = elm.element("fBuyPrice").getText();
				temp = elm.element("SellPrice").getText();
			}
			
		} catch (DocumentException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	
	/**
	 * 用户把SOAP请求发送给服务器端,并返回服务器点返回的输入流
	 * flag : 为1时代表getExchangeRate,为2时代表getForexRmbRate
	 * @return 服务器端返回的输入流,供客户端读取
	 */
	private InputStream getSoapInputStream(int flag) throws Exception {
		//InputStreamReader isr = null;
		try {
			String soap = getSoapRequest(flag);
			if (soap == null) {
				return null;
			}
			String urlStr = null;
			String SOAPActionValue = null;
			if(flag==1){
				urlStr = "http://webservice.webxml.com.cn/WebServices/ExchangeRateWebService.asmx";
				SOAPActionValue = "http://webxml.com.cn/getExchangeRate";
			}else if(flag==2){
				urlStr = "http://webservice.webxml.com.cn/WebServices/ForexRmbRateWebService.asmx";
				SOAPActionValue = "http://webxml.com.cn/getForexRmbRate";
			}
			URL url = new URL(urlStr);
			URLConnection conn = null;
			if (!proxyStr.equals("")) {
				conn = url.openConnection(proxy);
			} else {
				conn = url.openConnection();
			}
			conn.setUseCaches(false);
			conn.setDoInput(true);
			conn.setDoOutput(true);
			conn.setRequestProperty("Content-Length", Integer.toString(soap.length()));
			conn.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
			conn.setRequestProperty("SOAPAction",SOAPActionValue);
			OutputStream ops = conn.getOutputStream();
			OutputStreamWriter osw = new OutputStreamWriter(ops, encodeIn);
			osw.write(soap);
			osw.flush();
			osw.close();
			InputStream is = conn.getInputStream();
//			isr = new InputStreamReader(is, encodeIn);
//			return isr;
			return is;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	
	
	/**
	 * 获取soap请求头
	 * flag : 为1时代表getExchangeRate,为2时代表getForexRmbRate
	 * @return 用户将要发送给服务器的soap请求
	 */
	private String getSoapRequest(int flag) {
		StringBuilder sb = new StringBuilder();
		if(flag==1){
			sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>"
				+ "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" "
				+ "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" "
				+ "xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"
				+ "<soap:Body>	<getExchangeRate xmlns=\"http://webxml.com.cn/\">"
				+ "<theType>" + "A"
				+ "</theType>	</getExchangeRate>"
				+ "</soap:Body></soap:Envelope>");
		}else if(flag==2){
			sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>"
				+ "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" "
				+ "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" "
				+ "xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"
				+ "<soap:Body>	<getForexRmbRate xmlns=\"http://webxml.com.cn/\">"
				+ "</getForexRmbRate>"
				+ "</soap:Body></soap:Envelope>");
		}
		return sb.toString();
	}
	

	/**
	 * 外部可访问的方法,获得汇率数据
	 */
	public void getExchangeRate(){
		for(int i=0; i<COUNT; i++){
			if(ExchangeRateXML.getInstance().createExchangeRateXMLFile("ExRate.xml")){
				break;
			}
		}
		getExchangeRateDataFromXMLFile("ExRate.xml");
	}
}

这个链接中有一个简单的webservice例子,是获取天气预报的:http://qinshuwei.com/webservic.html
分享到:
评论

相关推荐

    webservice-cxf-spring-jar.zip

    【标题】"webservice-cxf-spring-jar.zip" 是一个包含了使用Apache CXF与Spring框架集成开发Web服务的Java库集合。这个压缩包提供了一整套必要的JAR文件,以便于开发者在他们的项目中快速搭建和运行基于CXF的Web服务...

    webservice-client-demo.rar

    【标题】"webservice-client-demo.rar" 是一个与之前的 "webservice-service-demo.rar" 相对应的压缩包,它主要展示了如何在SpringBoot环境下构建并使用Web服务客户端来调用已经存在的Web服务。这个Demo旨在帮助...

    WebService开源程序---天气预报查询---IP查询(最新)

    总的来说,这个开源项目为开发者提供了一个快速构建天气预报和IP查询功能的起点,通过学习和使用这个项目,开发者可以熟悉Java Web服务的开发、部署和调用过程,同时了解如何与外部API进行交互,获取和展示数据。

    Laravel开发-laravel-webservice

    【Laravel开发-laravel-webservice】是一个专注于在Laravel框架中构建Web服务的项目,它利用了httpful库来提供高效、简洁的API交互。在本文中,我们将深入探讨Laravel框架的基础,Web服务的概念,以及httpful库如何...

    WebService之JAX-WS自学笔记

    - **2.4.1.1 开发步骤**:首先需要获取 Web 服务的 WSDL 文件,然后使用 `wsimport` 工具生成客户端需要的 Java 类。 - **2.4.1.2 运行 wsimport**:类似于服务端的 `wsimport` 过程,但生成的是客户端代码。 - **...

    PyPI 官网下载 | webservice_foundation-1.0.0.tar.gz

    `webservice_foundation`库显然是为构建Web服务基础框架而设计的,它可能包含了一系列用于创建、管理和操作Web服务的工具和模块。1.0.0是其初始版本,通常意味着该库已经具备了基本的功能,并且对外发布了第一个正式...

    webservice 获取图片

    Web服务(WebService)是一种基于互联网的、平台独立的交互方式,允许不同系统之间进行数据交换。在本场景中,我们关注的是如何通过Web服务来获取图片。这种技术常常用于跨平台应用集成,例如移动应用从服务器获取...

    WebService CXF --- 由WSDL文件开发Client端

    WebService CXF是一个强大的开源框架,用于创建和消费Web服务。它允许开发者基于WSDL(Web Service Description Language)文件快速地生成服务端和客户端代码,极大地简化了Web服务的开发流程。在本篇中,我们将深入...

    连接webservice数据接口,获取数据的小例子,这里使用的是winfrom

    本文将深入探讨如何使用Windows Forms(Winform)客户端连接到Web服务接口并获取数据。Winform是.NET Framework下的一个桌面应用程序开发框架,提供丰富的用户界面设计工具,适合构建桌面应用。 首先,我们要理解...

    labview调用webservice访问远程数据1

    首先,我们需要获取天气 Web 服务接口,例如:http://www.webxml.com.cn/WebServices/WeatherWebService.asmx。然后,我们使用 cmd 来生成 C# 语言的代理类,命令为:wsdl /l:cs /out:WeatherWebService.cs ...

    基于CXF的webService本地数据交互----PC端与Android端(一)

    在IT行业中,Web服务是一种广泛使用的技术,它允许不同系统之间的数据交换。本文将深入探讨基于Apache CXF实现的Web Service在本地数据交互中的应用,尤其是如何在PC端与Android端之间进行通信。Apache CXF是一个...

    ajax WebService 对表格数据的异步获取和处理 实例.doc

    在Web开发中,异步数据获取和处理是提高用户体验的关键技术之一。Ajax(Asynchronous JavaScript and XML)和WebService的结合使用使得网页可以在不刷新整个页面的情况下与服务器进行交互,从而实现动态更新表格数据...

    基于WebService服务获取天气信息

    【基于WebService服务获取天气信息】 在信息技术领域,WebService是一种通过标准协议(如SOAP或REST)在互联网上交换数据的方式。这种技术使得不同系统之间能够共享数据和服务,即使它们使用不同的编程语言、操作...

    北大青鸟ACCP-5.0-Ajax与WebService整合PPT-05

    WebService通常使用SOAP(Simple Object Access Protocol)协议传输数据,WSDL(Web Services Description Language)用于描述服务,而UDDI(Universal Description, Discovery, and Integration)则提供了服务的...

    基于CXF的webService本地数据交互----PC端(四)

    Web服务是一种通过网络进行通信的应用程序,它们使用开放标准如XML、SOAP(Simple Object Access Protocol)和WSDL(Web Services Description Language)来交换数据。CXF框架使得开发者能够轻松地创建这些服务,而...

    axis2 axis webservice web 服务

    标题中的“Axis2 Axis WebService Web 服务”指的是Apache Axis2,它是一个强大的Web服务框架,主要用于构建和部署Web服务。Axis2是Apache SOAP(Simple Object Access Protocol)项目的第二代实现,专门设计用于...

    北大青鸟ACCP5.0-Ajax与WebService整合PPT-02

    【Ajax与WebService整合】是北大青鸟ACCP5.0课程中的一个重要部分,主要探讨如何利用Ajax技术提升Web应用程序的用户体验,并结合WebService实现数据的高效交互。Ajax全称为"Asynchronous JavaScript and XML",即...

    storm调试webservice

    Web Service则是一种通过网络进行通信的服务,通常基于SOAP(Simple Object Access Protocol)或RESTful(Representational State Transfer)架构。 调试Web Service通常是开发过程中的关键步骤,目的是找出并修复...

Global site tag (gtag.js) - Google Analytics