博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
编写GO的WEB开发框架 (十六): 增加自动的RESTful支持
阅读量:5901 次
发布时间:2019-06-19

本文共 1776 字,大约阅读时间需要 5 分钟。

hot3.png

今天在家呆着,重拾好久不碰的代码,完善一下,就增加自动的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分支

转载于:https://my.oschina.net/tim8670/blog/846598

你可能感兴趣的文章
我就是一个救火员(DBA救援)
查看>>
Centos7安装Gitlab10.0
查看>>
Windows Server 笔记(六):Active Directory域服务:域控制器安装
查看>>
discuz X3登录流程分析
查看>>
上传图片预览
查看>>
程序设计的一些原理
查看>>
lagp,lacp详解
查看>>
LVS之DR模式原理与实践
查看>>
struts2+extjs
查看>>
Apache2.4.33安装无systemctl/service status/state显示
查看>>
Docker的系统资源限制及验证
查看>>
在大公司呆5年,你就废了
查看>>
mac mamp mysql no start servel
查看>>
Docker简易版:使用更少击键运行Redis,MongoDB
查看>>
laravel框架快速入门(一)
查看>>
c++ ios_base register_callback方法使用
查看>>
Java中为什么需要Object类,Object类为什么是所有类的父类
查看>>
angularjs-paste-upload
查看>>
RXjs相关
查看>>
linux基础命令 head
查看>>