一开始想到使用soa的形式,使用rest对外发布接口地址,想一想挺好的,但由于不熟,时间比较紧,出什么篓子压力就打了,java
仍是先使用spring-mvc吧,作好工做的第一件工做,哈哈spring
具体开发的时候仍是挺烦的,曲折。json
首先规定了移动端掉服务端数据的格式是这样子的 http://ip:port/V20?{json}数组
好吧,和我一开始想的根据url直接映射到方法执行泡汤了。spring-mvc
而后先写个路由controller,用@RequestMapping(value="V20")去接受全部的请求,从json中获取到方法名再转发到具体方法, “forward:/method?json=json” 嗯,这样子也不错。mvc
可是移动端传给个人是base64的数组字符串,但我把这串字符串转发给具体执行方法的时候,oh,no不行了,参数中一些特殊字符通过转发后变了,若是“+”号,那我直接替换那些不能识别的字符成代码 如“+”换成 %25B。按理说确定应该能够了,可是传过去后仍是不对,也不知道为何,没深究。还想,先把图片的base64字符串转成byte[]传过去,我只能说我太天真了,byte[]数组一经转发就不同了,更况且多张图片多个byte[],那不成byte[][]。app
最后弄得有点烦,好像用spring-mvc原先的转发映射搞不定(确定是我本身哪一个地方没处理好)ui
那最后的解决方法是本身写一个路由,根据methodname找到某个action中的方法。url
在RouteController中写了rest
private static Map<String, Object> objectMap = new HashMap<String, Object>(); private static Map<String, Method> methodMap = new HashMap<String, Method>(); static{ //找到action下的全部类 List<Class> list= ClassSearcher.findClasses(); if(list!=null&&list.isEmpty()==false){ for(Class clz:list){ Method[] ms = clz.getDeclaredMethods(); for(Method m : ms){ Object o = null; try { //从spring中获取对象 o = SpringContextHolder.getBean(clz); } catch (Exception e) { log.error("srping容器中没有:"+clz+"对象",e); } objectMap.put(m.getName(), o); methodMap.put(m.getName(), m); } } } log.info("初始化执行方法对象map================"+objectMap); log.info("初始化执行方法map================"+methodMap); }
而后根据json中的方法名
Object o = objectMap.get(accept.getMethod()); Method m = methodMap.get(accept.getMethod()); if(o!=null && m!=null){ Object result = m.invoke(o, new String[]{uid,source,accept.getArguments()}); return result.toString(); }else{ log.info("未找到请求的对应方法=========方法名:"+accept.getMethod()); reverse.setStatus(2); reverse.setMsg("未找到请求方法的对应方法"); return JSON.toJSONString(reverse); }
感受好简陋,但一时间想不出好的方法,也但愿大神们能指点一下。根据methodName找到controller的方法,不使用@RequestMapping(value = "/V20") 转发映射关系