JavaWeb 如何调用接口
CreateTime--2018年4月2日19:04:29
Author:Marydon
1.所需jar包
2.代码设计
WebUtils.java
import java.io.ByteArrayOutputStream; import java.net.URL; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.codehaus.xfire.client.Client; /** * * @author Marydon * @createTime 2018年3月9日上午10:40:01 * @updateTime * @Email:Marydon20170307@163.com * @version:1.0.0 */ public class WebUtils { /** * 接口调用方法 内部使用xfire 调用 * @param param1 * 接口传参 * @param methodName * 调用接口方法名 * @param url * 调用接口地址 * @return String 返回结果 */ public static String call(Object[] param1, String methodName, String url) { // 调用接口 if (null == url) { throw new RuntimeException("接口地址不能为空!"); } if (!url.endsWith("?wsdl")) { url += "?wsdl"; } // 接口名称 String intefaceName = methodName; // 客户端 Client client; Object[] results; try { client = new Client(new URL(url)); results = client.invoke(intefaceName, param1); if (results != null && results.length > 0) { if (results[0] instanceof String) { return (String) results[0]; } else if (results[0] instanceof org.w3c.dom.Document) { org.w3c.dom.Document doc = (org.w3c.dom.Document) results[0]; return WebUtils.w3cDocument2String(doc); } else { if (results.length > 1) { System.err.println("返回结果长度:" + results.length); } return String.valueOf(results[0]); } } } catch (Exception e) { // log.error("调用接口失败"+url+":"+methodname,e); } return null; } /** * 将w3c定义的Document对象转换为String字符串 * * @param doc * @return * @throws Exception */ public static String w3cDocument2String(org.w3c.dom.Document doc) { // 设置源和目标 DOMSource src = new DOMSource(doc); StreamResult sos; ByteArrayOutputStream bos = new ByteArrayOutputStream(); try { sos = new StreamResult(bos); // 转换器 Transformer t = TransformerFactory.newInstance().newTransformer(); t.transform(src, sos); return bos.toString("UTF-8"); } catch (Exception e) { e.printStackTrace(); } return null; } }
3.测试
import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.Element; /** * 发送webservice请求测试类 * @author Marydon * @createTime 2018年3月9日上午10:51:07 * @updateTime * @Email:Marydon20170307@163.com * @version:1.0.0 */ public class Test { /** * @param args */ public static void main(String[] args) { String url = "http://127.0.0.1:8070/demo/services/IServiceTest?wsdl"; // 必须指定方法名 String methodName = "getUserInfo"; StringBuilder sb = new StringBuilder(); sb.append("<Request><userId>2</userId></Request>"); Document document = DocumentHelper.createDocument(); // 创建Document document 以xml的格式存放返回参数 Element request = document.addElement("Request"); // 在 document中 新建一个Request节点 // (具体节点请参考接口文档) request.addElement("userId").setText("1"); // TODO 发送空id // request.addElement("id").setText(""); String data = document.asXML().toString();// 以xml格式进行传输 String res = WebUtils.call(new Object[] { data }, methodName, url); System.out.println(res); Document dhead; try { dhead = DocumentHelper.parseText(res); String userName = dhead.selectSingleNode("//Response/userName").getText().trim(); System.out.println(userName); } catch (DocumentException e) { e.printStackTrace(); } } }
4.说明
以接口的形式进行传输时,"&"是特殊符号,不能直接传,必须转义成"&",否则报错。