文档章节

Restful架构下处理各种操作的解决方法

晴雨夜
 晴雨夜
发布于 2017/12/01 10:41
字数 559
阅读 7
收藏 0

在一般开发模式用类似于用户解锁,更改密码等操作一般单独开发请求路径。类似于 /user/unlock?*** ,/user/modifyPassword?***

但在如果采用Restful架构这样的请求路径就不太合理,所以想着统一将各种操作封装在类似 /**/action 中

Controller

@RestController
public class WorkOrderController extends BaseController implements Action{

	@Resource
	private FlowService flowService;
	@Resource
	private WorkOrderService workOrderService;
	
	/**
	 * 保存工单
	 * 2017-08-14 15:27:37
	 * @param isTemporary 暂存标志
	 * @return
	 */
	@RequestMapping(value="/workOrder",method=RequestMethod.POST)
	public HttpResponseMessage addWorkOrder(WorkOrder workOrder,Boolean isTemporary){
		return null;
	}
	

	@Override
        @RequestMapping(value="/workOrder/action")
	public Object action(String autoId, String action, HttpServletRequest req, HttpServletResponse resp) {
		return workOrderService.userAction(autoId,action,req,resp);
	}

}

BaseService 业务抽象类

/**
 * 业务抽象类
 * @author lijie
 * @create 2017-06-15
 *
 */
public abstract class BaseService {
	protected Logger logger = Logger.getLogger(this.getClass());
	
	/**
	 * 
	 * 用户操作
	 * <P>通过反射执行方法</p>
	 * @param auto_id 主键
	 * @param action 执行动作
	 * @param req 请求
	 * @param resp
	 * @return
	 */
	public Object userAction(String auto_id, String action, HttpServletRequest req,HttpServletResponse resp) {
		Object returnValue = null;
		HttpResponseMessage rpm = null;
		try {
			if (action == null) {
				rpm = new HttpResponseMessage();
				rpm.setCode(HttpStatus.INTERNAL_SERVER_ERROR.value());
				rpm.setDescribe(ErrorMsg.NONEACTION);
				returnValue = rpm;
			}
			Method[] methods = this.getClass().getMethods();
			for (Method method : methods) {
				// 名字一样并且有Action的动作注解,没有注解不会执行,可控
				if (method.getName().equals(action) && method.getAnnotation(UserAction.class) != null) {
					Annotation[][] anotations = method.getParameterAnnotations();
					Class<? extends Object>[] clazzs = method.getParameterTypes();// 方法需要的对象
					List<Object> parameters = new ArrayList<Object>();
					for (int i = 0; i < clazzs.length; i++) {
						Class<? extends Object> param = clazzs[i];
						Object obj = null;
						UserActionParam paramName = (UserActionParam) ObjectUtils.findAnnotation(anotations[i],
								UserActionParam.class);
						if (paramName != null && paramName.name().equalsIgnoreCase(Constant.IDENTIFY_KEY)) {//auto_id特殊处理
							obj = auto_id;
							parameters.add(obj);
							continue;
						} else if (paramName != null) {// 基本類型沒有注解參數会报错
							obj = ObjectUtils.dataTypeConvent(param, paramName.name(), req);
						} else {
							obj = ObjectUtils.setPoperties(param, req,resp);
						}
						parameters.add(obj);
					}
					returnValue = method.invoke(this, parameters.toArray());
					break;
				}
			}
			if (returnValue == null) {
				rpm = new HttpResponseMessage();
				rpm.setCode(HttpStatus.NOT_FOUND.value());
				rpm.setDescribe(ErrorMsg.NOT_FOUND_ACTION);
				returnValue = rpm;
			}
		} catch (Exception e) {
			logger.error(e);
			if (rpm == null){
				rpm = new HttpResponseMessage();
			}
			rpm.setCode(HttpStatus.INTERNAL_SERVER_ERROR.value());
			rpm.setDescribe(e.getMessage());
			returnValue = rpm;
		}

		return returnValue;
	}
}

Action接口

public interface Action {
	
	/**
	 * 用户操作
	 * @param auto_id
	 * @param action
	 * @param req
	 * @return
	 */
	Object action(String autoId,String action,HttpServletRequest req,HttpServletResponse resp);

}

这样各种操作可以如下调用

      重置密码:/user/action?action=resetPassword&auto_id=000000001

      解锁用户:/user/action?action=unLock&auto_id=000000001

     /**
	 * 重置密码
	 * @param auto_id 用户ID
	 * @return
	 */
	@UserAction
	public HttpResponseMessage resetPassword(@UserActionParam(name=Constant.IDENTIFY_KEY) String auto_id) {
		HttpResponseMessage rpm = new HttpResponseMessage();
		try {
			String password = desEncrypt.getDefaultPassword();
			userDao.resetPassword(auto_id, password);
			rpm.setCode(HttpStatus.OK.value());
			rpm.setDescribe(Constant.PASSWORD_RESET_OK);
		} catch (Exception e) {
			rpm.setCode(HttpStatus.OK.value());
			rpm.setDescribe(Constant.PASSWORD_RESETED_FAIL + e);
		}
		return rpm;
	}

 

感觉写的不是很好,但是满足了现有要求。后续看如何继续改进

© 著作权归作者所有

共有 人打赏支持
上一篇: 数据请求设计
下一篇: JSONP跨域实现
晴雨夜
粉丝 0
博文 5
码字总数 3562
作品 0
杨浦
程序员
私信 提问
RESTful协议【软件架构】

概述 REST(英文:Representational State Transfer,简称REST)描述了一个架构样式的网络系统,比如 web 应用程序。它首次出现在 2000 年 Roy Fielding 的博士论文中,他是 HTTP 规范的主要...

木云凌
2016/01/08
63
0
什么是REST?以及RESTful的实现

什么是REST? REST (REpresentation State Transfer) 描述了一个架构样式的网络系统,比如 web 应用程序。它首次出现在 2000 年 Roy Fielding 的博士论文中,他是 HTTP 规范的主要编写者之一...

Kerry_Han
2014/04/10
0
0
REST及RESTful的实现

什么是REST? REST (REpresentation State Transfer) 描述了一个架构样式的网络系统,比如 web 应用程序。它首次出现在 2000 年 Roy Fielding 的博士论文中,他是 HTTP 规范的主要编写者之一...

benbenming
2009/09/11
1K
0
什么是REST?以及RESTful

Web 应用程序最重要的 REST 原则是,客户端和服务器之间的交互在请求之间是无状态的。从客户端到服务器的每个请求都必须包含理解请求所必需的信息。如果服务器在请求之间的任何时间点重启,客...

Barudisshu
2014/08/22
0
0
REST风格的原则

一个好的RESTful API,应该具备以下特征: 这个API应该是对浏览器友好的,能够很好地融入Web,而不是与Web格格不入。 浏览器是最常见和最通用的REST客户端。好的RESTful API应该能够使用浏览...

吞吞吐吐的
2017/09/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Kylin2.5.0环境搭建及操作记录

Apache Kylin是一个开源的分布式分析引擎,提供Hadoop/Spark之上的SQL查询接口及多维分析(OLAP)能力以支持超大规模数据,最初由eBay Inc. 开发并贡献至开源社区。它能在亚秒内查询巨大的H...

PeakFang-BOK
6分钟前
0
0
SpringBoot整合es

文档对像 @Document(indexName = "bigdata",type = "tag")public class User { @Idprivate String openid; private List<String> tags;public String getOpenid() ......

魔法王者安琪拉
10分钟前
0
0
windows下让 jar 在后台运行的办法

windows下 运行 java jar 不出现 命令行 窗口 新建一个披处理 run.bat,内容如下 @echo off start javaw -jar xx.jar exit 双击运行即可。...

glen_xu
19分钟前
1
0
jdk1.8 lambda stream 指定的对象属性进行去重

原因:因为Stream提供的distinct()方法只能去除重复的对象,无法根据指定的对象属性进行去重,可以应付简单场景。 解决方案: //去重,共同信息保存到bizPledgeSupplierVOs里bizPledgeSupp...

INSISTQIAO
21分钟前
0
0
vue nextTick深入理解---vue性能优化、DOM更新时机、事件循环机制

定义[nextTick、事件循环] nextTick的由来: 由于vue的数据驱动视图更新是异步的,即修改数据的当下,视图不会立即更新,而是等同一事件循环中的所有数据变化完成之后再统一进行视图更新。...

JamesView
29分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部