maven 项目(四) spring集成springMVC开发统一接入API(准备工作:第二部分)

第二部分:构建响应http的请求的统一接入API配置和接口提炼

以上的三个步骤:
1.搭建起了maven项目;
2.根据数据库生成了代码,别说你没有安装过和设计数据库;
3.构建代码和数据库之间的ORM关联管理;
4.通过Java反射,得到注解的接口

OK,可以写接口了:springMVC响应http请求的统一接入API:
第一步:配置springMVC
在项目启动文件web.xml中加入代码(web.xml的标签排序可以作为知识点看一下):

<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

知道为啥springMVC是servlet的变种了吧!
附:
<load-on-startup>1</load-on-startup>:当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个servlet;详解的话,自己度一下;
<url-pattern>/</url-pattern>:因为这个反斜杠“/”不能丢,其实为了过滤请求;


接口伪代码流程(为啥是伪代码,这里就是很一般的写法,给人参考吧):
/**
		@Controller:声明是springMVC的响应组件
		@RequestMapping(value = "/apicenter"):定义接口路径
		 */
		@Controller
		public class ApiDispatchController {
		private final Log loger = LogFactory.getLog(ApiDispatchController.class);//加载日志部分
		private static final String API_ID = "apiId";
		private static final String ACCESS_TOKEN = "token";
		private static final String FUNCTION_CODE = "functioncode";
	        @SuppressWarnings({ "rawtypes" })
	        @RequestMapping(value = "/apicenter")
	        public String apiDispatch(HttpServletRequest req, HttpServletResponse rsp) {
	        	ApiResponse apiRsp = null;
	        	try {
	        		ApiRequest apiReq = new ApiRequest();
	        		ApiRequest sysReq = new ApiRequest();
	        		Enumeration em = req.getParameterNames();//获取请求参数
	        		while (em.hasMoreElements()) {
	        			String name = (String) em.nextElement();
	        			if (API_ID.equals(name) || FUNCTION_CODE.equals(name) || ACCESS_TOKEN.equals(name)) {
	        				sysReq.put(name, req.getParameter(name));
	        			}
	        			String value = req.getParameter(name);
	        			apiReq.put(name, value);
	        		}
	        		apiRsp = this.checkParam(sysReq);//验证(一般是验证签名)
	        		if (apiRsp != null) {
	        			return this.outputApiResponse(req, rsp, apiRsp);
	        		}
	        		apiReq.setApiId(req.getParameter(API_ID));
	        		apiReq.setAccessToken(req.getParameter(ACCESS_TOKEN));
	        		apiReq.setFunctionCode(req.getParameter(FUNCTION_CODE));
	        		apiReq.setRequest(req);
	        		apiReq.setResponse(rsp);
	        		String functioncode = req.getParameter(FUNCTION_CODE);
	        		String[] tempArr = functioncode.split("\\.");// 目录暂时以这种方法反射
	        		if (tempArr != null && tempArr.length > 0) {
	        			String serviceFunctionCode = tempArr[0];
	        			Object bean = SpringBeanProxy.getBeanByFunctionCode(serviceFunctionCode);
	        			Method method = SpringBeanProxy.getMethodByFunctionCode(functioncode);
	        			try {
	        				Object rspObj = method.invoke(bean, new Object[] { apiReq });
	        				if (rspObj instanceof ApiResponse) {
	        					apiRsp = (ApiResponse) rspObj;
	        				}
	        			} catch (Exception e) {
	        				e.printStackTrace();//打印异常
	        				apiRsp = new ApiResponse(RestResultEnum.INVOKE_ERROR);
	        			}
	        		}
	        	} catch (Exception e) {
	        		e.printStackTrace();
	        	}
	        	if (apiRsp == null) {
	        		apiRsp = new ApiResponse(RestResultEnum.UNKNOW_ERROR);
	        	}
	        	return this.outputApiResponse(req, rsp, apiRsp);//构建返回
	        }
     这么一句代码:
    Object rspObj = method.invoke(bean, new Object[] { apiReq });

科普下:JAVA反射机制

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。

也就是说代码在任意个类中找到对应的对象和方法,然后返回的Object 是ApiResponse。处理掉ApiResponse就可以结束了。

优点(其实说的是第一步的接口):

1.极易拓展;

总结:

在四个步骤后,会发现只要配置完springmvc的配置信息和第一步中的读取自定义的注解接口,和这个响应http请求的API,就可以无限拓展接口地址了;

贴一段请求和返回报文:

请求参数:(form格式转化后的可视化数据)

{apiId=sanVersion, content=内容, functioncode=jpush.insertJpush, title=推送标题, appId=1, token=a6c799eaaa901055df2732d887499d7f, alert=推送标题描述}

返回值:(json格式化处理了)

{"code":"0000","functioncode":"jpush.insertJpush","isSuccess":true,"msg":"成功","version":"1.0"}

想知道token的目的性么 ?我以后来讲一段......

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值