编写GO的WEB开发框架 (十六): 增加自动的RESTful支持
2017-02-26 00:00
316 查看
摘要: 自动RESTful的实现思路和方法
今天在家呆着,重拾好久不碰的代码,完善一下,就增加自动的RESTful支持吧
GET /:Resource/[:Id] 获取资源
POST /:Resource 创建资源
PUT /:Resource/:Id 修改资源
DELETE /:Resource/:Id 删除资源
当需要更复杂的处理,框架的自动化无法满足时,使用者也可以自由定制。
先判断是否有自定义的控制器实现,如有,则使用用户自定义的控制器方法来替换自动的实现。
无自定义进入系统自动实现: 根椐Method对Resource(与数据库的一个表关联)进行相关处理
以上代码以mysql为存储,修改ResourceDao也可方便的替换为redis等。
在某些情况下,如果框架内部提供的自动实现无法满足需求(比如删除时,需要同时删除多张表的数据),也可以自由定制相关的控制器方法来实现(框架会根椐请求方法和资源名称先搜索是否存在该控制器方法)
比如: 用自定义的删除用户方法代替系统自动实现
注: 代码已更新至github的dev分支
今天在家呆着,重拾好久不碰的代码,完善一下,就增加自动的RESTful支持吧
目标
当配置RESTful=on时,使用者无需编写任何代码,框架会自动完成基本的RESTful API,包括:GET /:Resource/[:Id] 获取资源
POST /:Resource 创建资源
PUT /:Resource/:Id 修改资源
DELETE /:Resource/:Id 删除资源
当需要更复杂的处理,框架的自动化无法满足时,使用者也可以自由定制。
实现方式
修改Request的路径解释,得到Resource,Id 和Method先判断是否有自定义的控制器实现,如有,则使用用户自定义的控制器方法来替换自动的实现。
无自定义进入系统自动实现: 根椐Method对Resource(与数据库的一个表关联)进行相关处理
核心代码
ResourceDao, err := this.NewMySQLDao(this.Resource) if err != nil { this.ShowErr(500, fmt.Sprintf("%v", err)) return } switch this.Method { case "GET": if this.Pk == 0 { //get All if this.Get["limit"] != "" { ResourceDao.SetLimit(this.Get["limit"]) } if this.Get["order"] != "" { ResourceDao.SetOrder(this.Get["order"]) } if this.Get["field"] != "" { ResourceDao.SetField(this.Get["field"]) } if this.Get["where"] != "" { //add others where } result, daoErr = ResourceDao.Get(wh) } else { result, daoErr = ResourceDao.GetRow(wh) } case "POST": data := make(map[string]interface{}) for k, v := range this.Post { data[k] = v } result, daoErr = ResourceDao.Insert(data) case "PUT": data := make(map[string]interface{}) for k, v := range this.Post { data[k] = v } if this.Get["where"] != "" { //add others where } fmt.Printf("%s", this.Post) result, daoErr = ResourceDao.Update(data, wh) case "DELETE": result, daoErr = ResourceDao.Delete(wh) default: this.ShowErr(400, fmt.Sprintf("method %s not support", this.Method)) return }
以上代码以mysql为存储,修改ResourceDao也可方便的替换为redis等。
自由定制的实现
框架提供的自动实现,会假设要操作的资源只对应数据库中的一个表,且必须有名为id的自增id字段。在某些情况下,如果框架内部提供的自动实现无法满足需求(比如删除时,需要同时删除多张表的数据),也可以自由定制相关的控制器方法来实现(框架会根椐请求方法和资源名称先搜索是否存在该控制器方法)
比如: 用自定义的删除用户方法代替系统自动实现
func(this *Controller) DeleteUser(){ //删除处理 }
注: 代码已更新至github的dev分支
相关文章推荐
- 编写GO的WEB开发框架 (四): 支持RESTful
- 编写GO的WEB开发框架 (八): Session支持及自定义Session
- polaris: 一个用go实现的支持restful的web框架
- 编写GO的WEB开发框架 (十四): daemon和greaceful
- 编写GO的WEB开发框架 (十三): 配置文件读取
- 编写GO的WEB开发框架 (一): 我需要一个什么样的框架?
- 编写GO的WEB开发框架(二): 我期望怎么用框架来开发我的应用?
- 编写GO的WEB开发框架 (十二): 配置及模板的动态重载
- 编写GO的WEB开发框架 (十五): 目录结构及如何使用ecgo开发项目
- 编写GO的WEB开发框架 (十): Log和Access_Log
- 编写GO的WEB开发框架 (七): Response封装和模板渲染
- 编写GO的WEB开发框架 (九): Dao和Service
- 编写GO的WEB开发框架 (六): Validator数据校验
- 编写GO的WEB开发框架(三): 如何进行动态路由
- 编写GO的WEB开发框架 (五): 请求参数封装
- 编写GO的WEB开发框架 (十一): status页面和实时统计
- polaris: 一个用go实现的支持restful的web框架
- 有了 Docker,用 JavaScript 框架开发的 Web 站点也能很好地支持网络爬虫的内容抓取
- Tiny框架增加RESTful访问支持
- Go语言的几个Web开发框架