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

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

hot3.png

虽然我个人不太喜欢RESTful的接口命名风格,但无可否认,RESTful已成为一种逐渐为大众所接受并使用的方式,下面来说下怎么在动态路由的情况下支持RESTful

要支持RESTful,其实就是根椐请求的方法(GET,POST,PUT,DELETE等)和path,自动路由至相应的controller方法,例如:

  • GET /User/xxx -> func(this *App) GETUser(){}
  • POST /User/xxx/Task -> func(this *App) POSTUserTask(){}

由此可以看出,实际上就是对METHOD和PATH进行分拆合并生成方法名和相关参数,然后用反射方式调用相应的方法,如果方法不存在,报404(或者更友好的提示页)

dispatch

path := strings.Split(r.URL.Path, "/")if path[1] == "" {	//welcome page	return} else {	var name []byte	var params []string	for l, i := len(path), 1; i < l; i++ { //path的格式是 /object/id/object/id...		if i%2 != 0 {			name = append(name, []byte(strings.Title(path[i]))...)		} else {			params = append(params, path[i])		}	}	app.pathParams = params  //将参数放到controler的reciver的属性中	controlName := r.Method + string(name) //根椐method和path中object部分,串接出controlName	//调用方法	method, exist := rType.MethodByName(controlName)	if exist {		args := []reflect.Value{rValue}		method.Func.Call(args)	} else {		//404 not found	}}

controller

// GET /User/xxx  时调用func (this *App) GETUser() {	fmt.Fprintf(this.w, "Get /User/xx: params=%s", this.pathParams)}// GET /User/xxx/Task/xxx 时调用func (this *App) GETUserTask() {	fmt.Fprintf(this.w, "Get /User/xxx/Task/xxx :params=%s", this.pathParams)}

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

你可能感兴趣的文章
算法学习之路|二分图的最大匹配—匈牙利算法(Dfs实现)
查看>>
iOS UIView高级动画 关键帧动画
查看>>
java版spring cloud+spring boot+redis多租户社交电子商务平台 (六)分布式配置中心(Spring Cloud Config)...
查看>>
一个初学者是如何制作移动端B站画友社区的
查看>>
互联网分布式微服务云平台规划分析--平台整体规划
查看>>
Swift对象转为C指针
查看>>
Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)
查看>>
ThinkSNS系统升级,版本多样化
查看>>
ecshop使用smtp发送邮件
查看>>
RubyInstaller
查看>>
21. SQL -- TSQL架构,系统数据库,文件,SQL 认证,TSQL语句
查看>>
CentOS6.0添加163和epel源
查看>>
使用组策略与脚本发布Office 2010
查看>>
Open××× 分配固定IP
查看>>
elk+redis centos6.6安装与配置
查看>>
linux下svn命令大全
查看>>
windows server 2008 在vm上安装
查看>>
我的友情链接
查看>>
谷果等手机刷机build.prop解析
查看>>
Vbox虚拟机下 Linux网络配置
查看>>