Apache-XMLRpc客户端DEBUG测试

         在进行XMLRpc测试不是很方便,于是写了一个测试页面,具体使用方式为:在应用的web.xml中多加入一个Servlet:

<servlet>
		<servlet-name>XmlrpcUtilServlet</servlet-name>
		<servlet-class>com.suntek.vms.app.vvmagent.xmlrpc.XmlrpcUtilServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>XmlrpcUtilServlet</servlet-name>
		<url-pattern>/rpcservices</url-pattern>
	</servlet-mapping>

           对应的XmlrpcUtilServlet类如下:

/**
 * XML-Rpc测试类
 * 
 * @author Administrator<br/>
 * @version <br/>
 * @email: zcg@suntektech.com<br/>
 * @datetime: 2012-8-24 <br/>
 */
@SuppressWarnings("rawtypes")
public class XmlrpcUtilServlet extends HttpServlet implements
		XmlRpcMessageListener {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private static LogProxy logger = LogHandler.getLogger();

	private static ConcurrentHashMap<String, String> messageStore = new ConcurrentHashMap<String, String>();

	private static Method[] methods = null;
	private static int flag = 0;

	private static final String URL = "http://127.0.0.1:"
			+ System.getProperty(BootConstants.APP_RPC_PORT) + "/"
			+ System.getProperty(BootConstants.APP_TYPE) + "/xmlrpc";

	protected void service(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		String type = request.getParameter("type");
		if (type == null) {
			index(request, response);
			return;
		} else {
			rpcHandle(request, response);
		}

		response.setContentType("text/html");
		PrintWriter writer = response.getWriter();
		String reqString = messageStore.get("REQUEST");
		flag = 0;
		String respString = messageStore.get("RESPONSE");
		reqString = format(reqString);
		respString = format(respString);

		StringBuilder builder = new StringBuilder();

		
		builder.append("<body style='font-family:Arial;'>");
		builder.append("<div style='font-size:16px;font-weight:bold;'>Request</div>");
		builder.append(
				"<div style='width:80%'><textarea style='font-size:14px;width:800px;height:280px;'>")
				.append(reqString).append("</textarea></div><br/>");
		builder.append("<div style='font-size:16px;font-weight:bold;'>Response</div>");
		builder.append(
				"<div style='width:80%'><textarea style='font-size:14px;width:800px;height:280px;'>")
				.append(respString).append("</textarea></div>");
		builder.append("</body>");

		writer.write(builder.toString());
		writer.flush();
	}

	private void index(HttpServletRequest request, HttpServletResponse response)
			throws IOException {
		try {
			StringBuilder builder = new StringBuilder();
			builder.append("<body style='font-family:Arial;'>");
			builder.append("<div style='padding:10px;'>");
			for (Method m : getMethods()) {
				String name = m.getName();

				if (name.charAt(0) <= 90 && name.charAt(0) >= 65) {
					Class[] pTypes = m.getParameterTypes();
					String returnType = m.getReturnType().getSimpleName();
					String[] typeArr = new String[pTypes.length];
					for (int i = 0; i < pTypes.length; i++) {
						typeArr[i] = pTypes[i].getSimpleName();
					}

					String action = "http://" + request.getLocalAddr() + ":"
							+ request.getLocalPort() + "/"
							+ System.getProperty(BootConstants.APP_TYPE)
							+ "/rpcservices?type=" + name;
					builder.append("<form style='margin:0;padding:0;' action='")
							.append(action).append("' method='post'>");
					builder.append("<div style='border:1px solid #ccc;margin:5px; width:350px; height:200px; float:left;'>");
					builder.append(returnType).append(" ").append(name);
					builder.append("<input type='submit' value='invoke'/><br/>");

					builder.append("<div style='margin-left:35px;'>");
					builder.append("<table>");
					for (int i = 0; i < pTypes.length; i++) {
						String pType = typeArr[i];
						builder.append("<tr>");
						builder.append("<td>").append(pType).append("</td>");
						builder.append("<td>")
								.append("<input type='text' name='param_")
								.append(i)
								.append("' style='border:1px solid #ccc;width:200px; height:20px;'/>")
								.append("</td>");
						builder.append("</tr>");
					}
					builder.append("</table>");
					builder.append("</div>");
					builder.append("</div>");
					builder.append("</form>");
				}
			}
			builder.append("</div>");
			builder.append("</body>");
			response.setContentType("text/html");
			PrintWriter writer = response.getWriter();
			writer.write(builder.toString());
			writer.flush();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private void rpcHandle(HttpServletRequest request,
			HttpServletResponse response) {
		try {
			String method = request.getParameter("type");
			Enumeration<String> enums = request.getParameterNames();
			List<String> valList = new ArrayList<String>();
			while (enums.hasMoreElements()) {
				String key = enums.nextElement();
				if (!key.equals("type")) {
					String value = request.getParameter(key);
					valList.add(value);
				}
			}
			int length = valList.size();
			String[] objects = new String[length];

			for (Method m : getMethods()) {
				String name = m.getName();
				if (name.equals(method)) {
					Class[] classes = m.getParameterTypes();
					for (int i = 0; i < length; i++) {
						objects[i] = classes[i].getSimpleName();
					}
				}
			}
			List<Object> params = new ArrayList<Object>();
			for (int i = 0; i < length; i++) {
				if (objects[i].equals("Integer") || objects[i].equals("int")) {
					params.add(Integer.parseInt(valList.get(i)));
				} else if (objects[i].equals("Long")
						|| objects[i].equals("long")) {
					params.add(Long.parseLong(valList.get(i)));
				} else {
					params.add(valList.get(i));
				}
			}
			getClient().execute("SwVvmg." + method, params);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private XmlRpcClient getClient() throws Exception {
		XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
		config.setServerURL(new URL(URL));
		config.setEnabledForExtensions(true);
		XmlRpcClient client = new XmlRpcClient();
		client.setConfig(config);
		client.setListener(this);
		return client;
	}

	public void onMessage(String xmlContent) {
		flag++;
		if (flag == 1) {
			messageStore.put("REQUEST", xmlContent);
		}
		if (logger.isTraceEnabled()) {
			logger.trace("[XmlrpcUtilServlet.onMessage] Request: "
					+ format(xmlContent));
		}
	}

	private Method[] getMethods() throws Exception {
		if (methods == null) {
			InputStream input = XmlrpcUtilServlet.class
					.getResourceAsStream("/resources/xmlrpc-config.properties");
			Properties properties = new Properties();
			properties.load(input);
			String c = properties.getProperty("SwVvmg");
			Class cla = Class.forName(c);
			methods = cla.getMethods();
		}
		return methods;
	}

	public static ConcurrentHashMap<String, String> getMessageStore() {
		return messageStore;
	}

	public static String format(String str) {
		try {
			SAXReader reader = new SAXReader();
			// 注释:创建一个串的字符输入流
			StringReader in = new StringReader(str);
			Document doc = reader.read(in);
			// 注释:创建输出格式
			OutputFormat formater = OutputFormat.createPrettyPrint();
			// 注释:设置xml的输出编码
			formater.setEncoding("utf-8");
			// 注释:创建输出(目标)
			StringWriter out = new StringWriter();
			// 注释:创建输出流
			XMLWriter writer = new XMLWriter(out, formater);
			// 注释:输出格式化的串到目标中,执行后。格式化后的串保存在out中。
			writer.write(doc);
			writer.close();
			// 注释:返回我们格式化后的结果
			return out.toString();
		} catch (Exception e) {
			e.printStackTrace();
			return "";
		}
	}

}

           页面效果如下,在xmlrpc-config.properties配置中公布的类中的方法都可以在页面中展现出来,这样就可以很方便的对每个XMLRpc的方法进行单元测试了。


            测试的效果如下:






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值