基于soap形式封装xml请求编写webservie客户端

记录一个作为客户端,以Soap协议方式访问webservice接口服务端的工具类,也作为大家的一个参考。

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.URLConnection;
import java.util.Map;

public class SOAPUtils {

	private static String getSoapRequest(String xmlPath,
			Map<String, String> params) {
		try {
			InputStreamReader isr = new InputStreamReader(new FileInputStream(
					new File(xmlPath)), "UTF-8");
			BufferedReader reader = new BufferedReader(isr);
			String soap = "";
			String tmp;
			while ((tmp = reader.readLine()) != null) {
				soap += tmp;
			}
			reader.close();
			isr.close();

			for (String paramName : params.keySet()) {
				String paramValue = params.get(paramName);
				soap = soap.replace(":" + paramName, paramValue);
			}

			return soap;
		} catch (Exception ex) {
			ex.printStackTrace();
			return null;
		}
	}

	/**
	 * 
	 * @param urlString
	 *            :webservice的url
	 * @param SOAPAction
	 *            :调用的接口中的方法名
	 * @param xmlPath
	 *            :传入参数的xml文件路径
	 * @param params
	 *            :需要传入的动态配置的参数
	 * @return:返回一个可指定编码的IO
	 * @throws Exception
	 */
	public static InputStreamReader getSoapInputStream(String urlString,
			String SOAPAction, String xmlPath, Map<String, String> params)
			throws Exception {
		try {
			String soap = getSoapRequest(xmlPath, params);
			if (soap == null) {
				return null;
			}
			URL url = new URL(urlString);
			URLConnection 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", urlString + "/" + SOAPAction);

			OutputStream os = conn.getOutputStream();
			OutputStreamWriter osw = new OutputStreamWriter(os, "utf-8");
			osw.write(soap);
			osw.flush();
			osw.close();

			InputStream is = conn.getInputStream();
			// 指定返回编码
			InputStreamReader isr = new InputStreamReader(is, "UTF-8");

			return isr;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 将返回的IO转化为一个String返回
	 * 
	 * @param urlString
	 * @param SOAPAction
	 * @param xmlPath
	 * @param params
	 * @return
	 * @throws Exception
	 */
	public static String getSoapResponse(String urlString, String SOAPAction,
			String xmlPath, Map<String, String> params) throws Exception {
		InputStreamReader isr = getSoapInputStream(urlString, SOAPAction,
				xmlPath, params);
		StringBuffer result = new StringBuffer();
		int b = -1;
		while ((b = isr.read()) != -1) {
			result.append((char) b);
		}
		isr.close();
		return result.toString();
	}

	/**
	 * xml文件中是一个soap协议形式的内容
	 * 
	 * @param xmlPath
	 * @return
	 */
	public static String getDemoResponse(String xmlPath) {
		try {
			InputStreamReader isr = new InputStreamReader(new FileInputStream(
					new File(xmlPath)), "UTF-8");
			BufferedReader reader = new BufferedReader(isr);
			String soap = "";
			String tmp;
			while ((tmp = reader.readLine()) != null) {
				soap += tmp;
			}
			reader.close();
			isr.close();

			return soap;
		} catch (Exception ex) {
			ex.printStackTrace();
			return null;
		}
	}
}

  在上述类中,getSoapInputStream方法中,请求参数(即传入的xml文件以及内容)需要指定编码格式(要与服务器要求的编码一致)。由于有时候作为访问客户端的机器默认编码有可能和接口服务器机器上的指定编码不一致,而导致结果文件或者结果IO都是默认采用客户端访问机的编码,从而产生乱码,所以返回xml结果的时候,最好也指定编码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值