公司项目要求解析出RESTFull风格发布的WebService接口的所有请求方法,参数,参数类型,已经方法是返回类型,想来想去都不知道该怎么办,思来想去然后又研究RESTFull风格WebService的xml文件,发现其实对于Java简单类型的 方法是能在xml文件中体现的,但是对于复杂类型,比如参数是一个对象,或者返回值是一个对象或者List,Map等。这些返回类型在xml文件中的 response下representation这个节点的属性type会是一个"application/json"。对于这些返回类型或者参数我没法 知道是什么类型,所以我就默认给这些Object类型。对于void类型的方法,会在response的status属性等于204,所以我就笨笨的用HttpClient抓去整个xml文件,然后用dome4j解析这个xml,幸好的是我在项目只需要解析简单类型的方法,所以想想也能达到要求.
1 package xxx.xxx.common; 2 3 import java.util.List; 4 5 import org.apache.commons.httpclient.HttpClient; 6 import org.apache.commons.httpclient.HttpStatus; 7 import org.apache.commons.httpclient.methods.GetMethod; 8 import org.dom4j.Document; 9 import org.dom4j.DocumentException; 10 import org.dom4j.DocumentHelper; 11 import org.dom4j.Element; 12 13 import com.google.common.collect.Lists; 14 import com.qya.vo.transform.TransformParamVO; 15 import com.qya.vo.transform.TransformVO; 16 17 import com.qya.utils.string.StringUtil; 18 19 public class TransformWsUrlUtil { 20 21 protected final String DEFAULT_URL = "http://localhost:8080/bpms/services?_wadl"; 22 23 public static List<TransformVO> transform(String url) { 24 String xml = getTransformXml(url); 25 Document doc = null; 26 try { 27 doc = DocumentHelper.parseText(xml); 28 } catch (DocumentException e) { 29 e.printStackTrace(); 30 } 31 List<TransformVO> lst = Lists.newArrayList(); 32 String rootPath = ""; 33 Element resourcesEl = doc.getRootElement().element("resources"); 34 if (resourcesEl.hasContent()) { 35 List<Element> els = resourcesEl.elements(); 36 for (Element resEl : els) { 37 rootPath = resEl.attribute(0).getText(); 38 if (resEl.hasContent()) { 39 lst.addAll(getMethod(rootPath, resEl.elements())); 40 } 41 } 42 } 43 return lst; 44 } 45 46 // 所有方法列表 47 public static List<TransformVO> getMethod(String rootPath, List<Element> els) { 48 List<TransformVO> lst = Lists.newArrayList(); 49 String wsPath = ""; 50 String returnType = ""; 51 for (Element el : els) { 52 returnType = transform2JavaType(getReturnType(el)); 53 wsPath = el.attribute("path").getText(); 54 if(!"java.lang.Object".equals(returnType)){ //此处我做了判断,只需要简单类型和void类型的方法 55 TransformVO vo = new TransformVO(); 56 vo.setUrl(transform2JavaType(rootPath + wsPath)); 57 vo.setUrlMethodName(transform2JavaType(returnType + " " + replaceSeparatorLine(wsPath) + getParamters(el))); 58 vo.setMethodName(transform2JavaType(wsPath)); 59 vo.setReturnType(returnType); 60 List<TransformParamVO> paramLst = getParamterVO(el); 61 vo.setTransformParamLst(paramLst); 62 lst.add(vo); 63 } 64 } 65 return lst; 66 } 67 68 /** 69 * 获取方法的所有参数 70 * 71 * @param el 72 * @return 参数字符串 73 */ 74 public static String getParamters(Element el) { 75 StringBuffer buf = new StringBuffer("("); 76 Element requestEl = el.element("method").element("request"); 77 if (!StringUtil.isNullOrEmpty(requestEl)) { 78 if (requestEl.hasContent()) { 79 for (Element paramEl : (List<Element>) requestEl.elements()) { 80 if ("param".equals(paramEl.getName())) { 81 buf.append(paramEl.attributeValue("type") + " " + paramEl.attributeValue("name") + ", "); 82 } 83 if ("representation".equals(paramEl.getName())) { 84 if (paramEl.hasContent()) { 85 for (Element pEl : (List<Element>) paramEl.elements()) { 86 buf.append(pEl.attributeValue("type") + " " + pEl.attributeValue("name") + ", "); 87 } 88 } 89 } 90 } 91 } 92 } 93 buf.append(")"); 94 return buf.toString(); 95 } 96 97 public static List<TransformParamVO> getParamterVO(Element el) { 98 List<TransformParamVO> lst = Lists.newArrayList(); 99 Element requestEl = el.element("method").element("request"); 100 if (!StringUtil.isNullOrEmpty(requestEl)) { 101 if (requestEl.hasContent()) { 102 for (Element paramEl : (List<Element>) requestEl.elements()) { 103 if ("param".equals(paramEl.getName())) { 104 TransformParamVO vo = new TransformParamVO(); 105 vo.setName(paramEl.attributeValue("name")); 106 vo.setType(transform2JavaType(paramEl.attributeValue("type"))); 107 lst.add(vo); 108 } 109 if ("representation".equals(paramEl.getName())) { 110 if (paramEl.hasContent()) { 111 for (Element pEl : (List<Element>) paramEl.elements()) { 112 TransformParamVO vo = new TransformParamVO(); 113 vo.setName(pEl.attributeValue("name")); 114 vo.setType(transform2JavaType(pEl.attributeValue("type"))); 115 lst.add(vo); 116 } 117 } 118 } 119 } 120 } 121 } 122 return lst; 123 } 124 125 /* 126 * 获取返回类型 127 */ 128 public static String getReturnType(Element el) { 129 String returnType = ""; 130 List<Element> returnTypeEls = el.element("method").element("response").elements("representation"); 131 if (!StringUtil.isNullOrEmpty(returnTypeEls)) { 132 if (returnTypeEls.isEmpty()) { 133 if (!StringUtil.isNullOrEmpty(el.element("method").element("response").attribute("status"))) { 134 if ("204".equals(el.element("method").element("response").attribute("status").getText())) { 135 returnType = "void"; 136 } 137 } 138 } else { 139 for (Element returnTypeEl : returnTypeEls) { 140 if (returnTypeEl.hasContent()) { 141 for (Element pEl : (List<Element>) returnTypeEl.elements()) { 142 returnType = pEl.attributeValue("type"); 143 } 144 } else { 145 returnType = "java.lang.Object"; 146 } 147 } 148 } 149 } 150 return returnType; 151 } 152 153 private static String transform2JavaType(String str) { 154 if (!StringUtil.isNullOrEmpty(str)) { 155 if (str.contains("xs:int")) { 156 str = str.replaceAll("xs:int", "java.lang.Integer"); 157 } 158 if (str.contains("xs:string")) { 159 str = str.replaceAll("xs:string", "java.lang.String"); 160 } 161 if (str.contains("xs:boolean")) { 162 str = str.replaceAll("xs:boolean", "java.lang.Boolean"); 163 } 164 if (str.contains("xs:double")) { 165 str = str.replaceAll("xs:double", "java.lang.Double"); 166 } 167 if (str.contains("xs:dateTime")) { 168 str = str.replaceAll("xs:dateTime", "java.util.Date"); 169 } 170 if (str.lastIndexOf(",") > 0) { 171 str = str.substring(0, str.lastIndexOf(",")) + ")"; 172 } 173 } 174 return str; 175 } 176 private static String replaceSeparatorLine(String str) { 177 if (!StringUtil.isNullOrEmpty(str)) { 178 if (str.contains("/")) { 179 str = str.replaceAll("\\/", ""); 180 } 181 } 182 return str; 183 } 184 185 /** 186 * 后去需要转换的xml内容 187 * 188 * @param url 189 * 访问的webservice url 190 * @return xml内容 191 */ 192 private static String getTransformXml(String url) { 193 String xml = ""; 194 HttpClient httpClient = new HttpClient(); 195 GetMethod getMethod = new GetMethod(url); 196 try { 197 int statusCode = httpClient.executeMethod(getMethod); 198 if (statusCode != HttpStatus.SC_OK) { 199 System.err.println("Method failed: " + getMethod.getStatusLine()); 200 } 201 // 读取内容 202 byte[] responseBody = getMethod.getResponseBody(); 203 // 处理内容 204 xml = new String(responseBody); 205 } catch (Exception e) { 206 System.err.println("页面无法访问"); 207 } finally { 208 getMethod.releaseConnection(); 209 } 210 return xml; 211 } 212 213 }
TransformVO.java
1 package com.qya.vo.transform; 2 3 import java.io.Serializable; 4 import java.util.List; 5 6 import com.google.common.collect.Lists; 7 8 public class TransformVO implements Serializable { 9 10 private static final long serialVersionUID = -8192032660217273046L; 11 private String url; 12 private String urlMethodName; 13 private String methodName; 14 private String returnType; 15 private List<TransformParamVO> transformParamLst = Lists.newArrayList(); 16 public String getUrl() { 17 return url; 18 } 19 public void setUrl(String url) { 20 this.url = url; 21 } 22 public String getUrlMethodName() { 23 return urlMethodName; 24 } 25 public void setUrlMethodName(String urlMethodName) { 26 this.urlMethodName = urlMethodName; 27 } 28 public String getMethodName() { 29 return methodName; 30 } 31 public void setMethodName(String methodName) { 32 this.methodName = methodName; 33 } 34 public String getReturnType() { 35 return returnType; 36 } 37 public void setReturnType(String returnType) { 38 this.returnType = returnType; 39 } 40 public List<TransformParamVO> getTransformParamLst() { 41 return transformParamLst; 42 } 43 public void setTransformParamLst(List<TransformParamVO> transformParamLst) { 44 this.transformParamLst = transformParamLst; 45 } 46 }
TransformParamVO.java
1 package com.qya.vo.transform; 2 3 import java.io.Serializable; 4 5 public class TransformParamVO implements Serializable { 6 7 private static final long serialVersionUID = 2728404017781534263L; 8 private String type; 9 private String name; 10 public String getType() { 11 return type; 12 } 13 public void setType(String type) { 14 this.type = type; 15 } 16 public String getName() { 17 return name; 18 } 19 public void setName(String name) { 20 this.name = name; 21 } 22 23 }
StringUtil.java
1 package com.qya.utils.string.StringUtil 2 3 public class StringUtil { 4 5 /** 6 * 判断是否为空后null 7 * 8 * @param obj 9 * 对象 10 * @return boolean 11 * @since 1.0 12 */ 13 public static boolean isNullOrEmpty(Object obj) { 14 return obj == null || "".equals(obj.toString()); 15 } 16 }
相关推荐
java restFull及示例和Maven.rar java restFull及示例和Maven.rar
这个是cxf+spring发布webservice和restservice的服务端项目
This specification defines a set of Java APIs for the development of Web services built according to the Representational State Transfer[1] (REST) architectural style. Readers are assumed to be ...
近年来越来越多的企业或者网站支持Restfull方式的WebService,比如当当网开源Dubbox,扩展Dubbo服务框架支持REST风格远程调用,这个是Java版本的,在.NET中ServiceStack天生支持Restfull风格的WebService。...
只是一个整合了spring,springMVC,hibernate的基础框架java纯后台工程,使用的是RESTfull风格的Springmvc作为controller层。编译后可能好几十mb,我网慢,只有源代码,可能比较小,需要的话可以自己编译。
RESTfull_webService 在这里,我们是宝贝;c)
WCFRestFull 空框架 详见我的相关博客
非常好用的例子,大家多看看。去非常好用的例子,大家多看看。去
这是一个利用java中的定时任务和jdbc去同步数据库中的数据一个工具类。 1、在配置文件中synnum同步的数量必须要大于接口查询出来的数量。 2、在解析json数据的时候,如果同步记录数只有一条会同步不到,需要将其中...
SpringMVC HelloWorld Restfull结构项目。
项目需要要和别人对接,对方用的是RestFul接口,Java平台的,我们是.NET平台的,需要编写RestFul调用客户端,为了测试也要相应的服务端,虽然我也会Java语言,但是不熟啊,搞个环境都要一两天。还是用c#模拟一下就好...
Spring Boot基础教程 RESTfull API简单项目的快速搭建
Qt http同步请求测试(restfull中常用的get/post/put/delete、文件上传/下载) 示例源码 https://blog.csdn.net/aggs1990/article/details/124104548 CSDN审核可能较慢,如无法下载,可以过段时间再回来看下
Springboot restfull形式文件单文件上传代码
安装指南克隆$ git clone https://github.com/erkobridee/restful-bookmarks-jerseyspring.git$ cd restful-bookmarks-jerseyspring/设置本地环境以使用此项目github上提供的项目没有任何引用Eclipse的项目文件。...
压缩包中包含:jersey RESTfull最新版全部jar和官方demo
api-restfull-SpringBoot