JavaWeb 如何调用接口
CreateTime--2018年4月2日19:04:29
Author:Marydon
1.所需jar包

2.代码设计
WebUtils.java
1import java.io.ByteArrayOutputStream; 2import java.net.URL; 3 4import javax.xml.transform.Transformer; 5import javax.xml.transform.TransformerFactory; 6import javax.xml.transform.dom.DOMSource; 7import javax.xml.transform.stream.StreamResult; 8 9import org.codehaus.xfire.client.Client; 10 11/** 12 * 13 * @author Marydon 14 * @createTime 2018年3月9日上午10:40:01 15 * @updateTime 16 * @Email:Marydon20170307@163.com 17 * @version:1.0.0 18 */ 19public class WebUtils { 20 21 22 /** 23 * 接口调用方法 内部使用xfire 调用 24 * @param param1 25 * 接口传参 26 * @param methodName 27 * 调用接口方法名 28 * @param url 29 * 调用接口地址 30 * @return String 返回结果 31 */ 32 public static String call(Object[] param1, String methodName, String url) { 33 // 调用接口 34 if (null == url) { 35 throw new RuntimeException("接口地址不能为空!"); 36 } 37 if (!url.endsWith("?wsdl")) { 38 url += "?wsdl"; 39 } 40 // 接口名称 41 String intefaceName = methodName; 42 // 客户端 43 Client client; 44 Object[] results; 45 try { 46 client = new Client(new URL(url)); 47 results = client.invoke(intefaceName, param1); 48 if (results != null && results.length > 0) { 49 if (results[0] instanceof String) { 50 return (String) results[0]; 51 } else if (results[0] instanceof org.w3c.dom.Document) { 52 org.w3c.dom.Document doc = (org.w3c.dom.Document) results[0]; 53 return WebUtils.w3cDocument2String(doc); 54 } else { 55 if (results.length > 1) { 56 System.err.println("返回结果长度:" + results.length); 57 } 58 return String.valueOf(results[0]); 59 } 60 } 61 } catch (Exception e) { 62 // log.error("调用接口失败"+url+":"+methodname,e); 63 } 64 return null; 65 } 66 67 /** 68 * 将w3c定义的Document对象转换为String字符串 69 * 70 * @param doc 71 * @return 72 * @throws Exception 73 */ 74 public static String w3cDocument2String(org.w3c.dom.Document doc) { 75 // 设置源和目标 76 DOMSource src = new DOMSource(doc); 77 StreamResult sos; 78 ByteArrayOutputStream bos = new ByteArrayOutputStream(); 79 try { 80 sos = new StreamResult(bos); 81 // 转换器 82 Transformer t = TransformerFactory.newInstance().newTransformer(); 83 t.transform(src, sos); 84 return bos.toString("UTF-8"); 85 } catch (Exception e) { 86 e.printStackTrace(); 87 } 88 return null; 89 90 } 91 92}
3.测试
1import org.dom4j.Document; 2import org.dom4j.DocumentException; 3import org.dom4j.DocumentHelper; 4import org.dom4j.Element; 5 6/** 7 * 发送webservice请求测试类 8 * @author Marydon 9 * @createTime 2018年3月9日上午10:51:07 10 * @updateTime 11 * @Email:Marydon20170307@163.com 12 * @version:1.0.0 13 */ 14public class Test { 15 16 /** 17 * @param args 18 */ 19 public static void main(String[] args) { 20 String url = "http://127.0.0.1:8070/demo/services/IServiceTest?wsdl"; 21 // 必须指定方法名 22 String methodName = "getUserInfo"; 23 24 StringBuilder sb = new StringBuilder(); 25 sb.append("<Request><userId>2</userId></Request>"); 26 27 Document document = DocumentHelper.createDocument(); // 创建Document document 以xml的格式存放返回参数 28 Element request = document.addElement("Request"); // 在 document中 新建一个Request节点 29 // (具体节点请参考接口文档) 30 request.addElement("userId").setText("1"); 31 // TODO 发送空id 32 // request.addElement("id").setText(""); 33 String data = document.asXML().toString();// 以xml格式进行传输 34 35 String res = WebUtils.call(new Object[] { data }, methodName, url); 36 System.out.println(res); 37 Document dhead; 38 try { 39 dhead = DocumentHelper.parseText(res); 40 String userName = dhead.selectSingleNode("//Response/userName").getText().trim(); 41 System.out.println(userName); 42 } catch (DocumentException e) { 43 e.printStackTrace(); 44 } 45 46 } 47 48}
4.说明
以接口的形式进行传输时,"&"是特殊符号,不能直接传,必须转义成"&",否则报错。