当前位置: 代码迷 >> Web前端 >> dom4j调用webservice回到xml形式的String类型的数据(soap头请求方式)实例
  详细解决方案

dom4j调用webservice回到xml形式的String类型的数据(soap头请求方式)实例

热度:599   发布时间:2012-10-13 11:38:17.0
dom4j调用webservice返回xml形式的String类型的数据(soap头请求方式)实例

package cn.xuediit.dom4j;

import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

/***要导入dom4j-1.6.1.jar
 * DomXMLString.java(一般而言,只要NETDATA_URL地址访问正常,本程序即可正常运行)
 * @author xuechong
 * @time 6/12/2010 12:09
 * @src  http://eric-619.iteye.com/blog/693154
 * @title  dom4j调用webservice返回xml形式的String类型的数据(soap头请求方式)
 * 根据url来定,浏览器中能得到什么,java程序这里就能输出什么
 */
@SuppressWarnings("unused")
public class Weather{
	//远程WebService接口url
    private static String NETDATA_URL = "http://www.webxml.com.cn/WebServices/WeatherWebService.asmx";
    
	public static void main(String args[]){
		Document document = getWeatherDocument("菏泽");
		if(document != null){
			System.out.println(document.asXML());
		}
	}
	
	public static Document getWeatherDocument(String city){
		Document document = null;
		SAXReader reader = new SAXReader();
		String str = "";
		Map<String, String> map = new HashMap<String, String>();
		reader.getDocumentFactory().setXPathNamespaceURIs(map);
		try {
			InputStream inputStream = getSoapInputStream(city);    //得到输入流
			document = reader.read(inputStream);    //将输入流转化为document
		} catch (Exception e){
			e.printStackTrace();
		}
		return document;
	}
	
	public static InputStream getSoapInputStream(String city) throws Exception {
		try{
			String soap = getSoapRequest(city);
			if(soap == null){
				return null;
			}
			URL url = new URL(NETDATA_URL);
			URLConnection conn = url.openConnection();
			conn.setUseCaches(false);
			conn.setDoInput(true);
			conn.setDoOutput(true);
			//参数参考http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?op=getWeatherbyCityName
			conn.setRequestProperty("Content-Length", Integer.toString(soap.length()));
			conn.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
			conn.setRequestProperty("SOAPAction", "http://WebXml.com.cn/getWeatherbyCityName");
			OutputStream outputStream = conn.getOutputStream();
			OutputStreamWriter outputSW = new OutputStreamWriter(outputStream, "utf-8");
			outputSW.write(soap);
			outputSW.flush();
			outputSW.close();
			InputStream inputStream = conn.getInputStream();
			return inputStream;
		}catch(Exception e){
			e.printStackTrace();
			return null;
		}
	}
	
	/**
	 * 获取soap请求头,并替换其中的标志符号为用户的自定义输入符号
	 * @param city 用户输入城市名
	 * @return 用户将要发送给服务器的soap请求
	 */
	private static String getSoapRequest(String city){
		StringBuilder sb = new StringBuilder();
		//参数参考http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?op=getWeatherbyCityName
		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>	" +
					       "<getWeatherbyCityName xmlns='http://WebXml.com.cn/'>"
				+              "<theCityName>" + city + "</theCityName>	"
				+		   "</getWeatherbyCityName>"
				+      "</soap:Body>"
				+ "</soap:Envelope>");
		return sb.toString();
	}
	
}
1 楼 rainerliu 2010-06-24  
支持,不错!
2 楼 beilejiang 2011-03-14  
嗯,但是如果返回的数据量很大,如达到了400K,这样的该如何做呢?求教
3 楼 shaomeng95 2011-03-14  
兄弟 你这没啥意义啊
  相关解决方案