go web framework gin group api 设计

假如让你来设计group api, 你该怎么设计呢?

group api 和普通api的区别在于前缀不同,如果group api的版本为v1.0 那么相对应的url为/v1.0/xxx, 如果是普通api的话那么api相对应的版本为/xxx

在gin web framework 中设计的原则也是以相对路径来区分。

// RouterGroup is used internally to configure router, a RouterGroup is associated with
// a prefix and an array of handlers (middleware).
type RouterGroup struct {
	Handlers HandlersChain #处理函数
	basePath string  #相对路径
	engine   *Engine #存在哪个engine上
	root     bool  #基于基树判断是否为root
}

先看gin中group 的添加规则:

	router := gin.New()
	users := router.Group("/users")

先看gin.New()默认的basePath是什么。

// New returns a new blank Engine instance without any middleware attached.
// By default the configuration is:
// - RedirectTrailingSlash:  true
// - RedirectFixedPath:      false
// - HandleMethodNotAllowed: false
// - ForwardedByClientIP:    true
// - UseRawPath:             false
// - UnescapePathValues:     true
func New() *Engine {
	debugPrintWARNINGNew()
	engine := &Engine{
		RouterGroup: RouterGroup{
			Handlers: nil,
			basePath: "/",  #默认为“/”
			root:     true,
		},
		FuncMap:                template.FuncMap{},
		RedirectTrailingSlash:  true,
		RedirectFixedPath:      false,
		HandleMethodNotAllowed: false,
		ForwardedByClientIP:    true,
		AppEngine:              defaultAppEngine,
		UseRawPath:             false,
		UnescapePathValues:     true,
		MaxMultipartMemory:     defaultMultipartMemory,
		trees:                  make(methodTrees, 0, 9),
		delims:                 render.Delims{Left: "{{", Right: "}}"},
		secureJsonPrefix:       "while(1);",
	}
	engine.RouterGroup.engine = engine
	engine.pool.New = func() interface{} {
		return engine.allocateContext()
	}
	return engine
}

  

查看router.Group("/users") 的调用

// Group creates a new router group. You should add all the routes that have common middlewares or the same path prefix.
// For example, all the routes that use a common middleware for authorization could be grouped.
func (group *RouterGroup) Group(relativePath string, handlers ...HandlerFunc) *RouterGroup {
	return &RouterGroup{
		Handlers: group.combineHandlers(handlers),
		basePath: group.calculateAbsolutePath(relativePath), #根据relativePath这个参数,计算basePath
		engine:   group.engine,
	}
}

 查看group.calculateAbsolutePath(relativePath) 的调用

func (group *RouterGroup) calculateAbsolutePath(relativePath string) string {
	return joinPaths(group.basePath, relativePath)
}

 再查看joinPaths的实现

func joinPaths(absolutePath, relativePath string) string {
	if relativePath == "" { #如果没有relativePath 直接返回absolutePath,默认为“/”
		return absolutePath
	}
        #处理最后的“/”
	finalPath := path.Join(absolutePath, relativePath)
	appendSlash := lastChar(relativePath) == ‘/‘ && lastChar(finalPath) != ‘/‘
	if appendSlash {
		return finalPath + "/"
	}
	return finalPath
}

  

原文地址:https://www.cnblogs.com/Spider-spiders/p/10235516.html

时间: 2024-09-28 20:52:44

go web framework gin group api 设计的相关文章

Web API设计方法论--比较完整的web api 开发过程

为Web设计.实现和维护API不仅仅是一项挑战:对很多公司来说,这是一项势在必行的任务.本系列将带领读者走过一段旅程,从为API确定业务用例到设计方法论,解决实现难题,并从长远的角度看待在Web上维护公共API.沿途将会有对有影响力的人物的访谈,甚至还有API及相关主题的推荐阅读清单. 这篇 InfoQ文章是 Web API从开始到结束系列文章中的一篇.你可以在这里进行订阅,以便能在有新文章发布时收到通知. 设计Web API不止是URL.HTTP状态码.头信息和有效负载.设计的过程--基本上是

Web API 设计摘要

近期读了一本微电子书 Brian Mulloy 所著<Web API Design>感觉颇多收获,特对其内容做了个整理摘要以便回想其观点精华以指导日常工作中的设计思路. 本文主要讲述 Web API 设计,追求一种更务实的 REST 风格. 正如作者所说 REST 是一种架构风格,而非严格的标准,不是必需在形式定义上去做过多真论,究竟什么才是真正的 REST? 设计的目的是为了表达某样东西是怎样使用的,那么 API 设计的成功与否是由开发者是否可以高速上手并用的愉快. 以下讲述了 Web AP

Web API设计经验与总结

在移动互联网的时代, Web服务已经成为了异构系统之间的互联与集成的主要手段,各种 Web服务几乎都采用REST风格的Web Api来构建. 通过Http协议的形式来. 以Get/Post方式发送请求, 返回json格式(数据更小巧且自描述能力强)的数据.这里就不在介绍REST API 的好处和不足.这些网上一大堆资料.今天就说说,如何构建优秀的REST API ? 目前,各大互联网公司, 对自身的REST Api设计有各自的标准,他们的Api 的设计也非常成熟. 那么,我们应该如何更好的设计我

RESTFUL如何指导WEB API设计?

博主刚刚接触web开发的时候,写了一个接口 /get_article_info/1 获取id为1的这篇文章的内容,被前辈们看见了,前辈给我说我这个接口设计的不太好啊,不符合RESTFUL规范,当前辈们说出这些话的时候,我很迷惑,我写的接口不能够好好工作吗?能够正常返回内容啊,对于不存在的文章也能够在返回的内容体中提示不存在,而且接口的意思很明确,一看就能明白,这还有什么不好的地方吗? 一.RESTFUL是什么? RESTFUL是英文单词Representational State Transfe

Asp.net Web Api 设计

目录 Asp.net Web Api 设计[持续更新] 第一部分 基础知识 第一章 因特网.万维网和HTTP协议 1.1 Web体系结构 第二章 Web Api 2.1 什么是Web Api 2.6 Web Api 指南 第三章 Asp.Net Web Api Asp.net Web Api 设计[持续更新] 第一部分 基础知识 第一章 因特网.万维网和HTTP协议 1.1 Web体系结构 Web体系有三个核心概念:资源 .URL和表示.一个资源由一个URI进行标识,而HTTP客户端使用URI就

RESTful API 设计最佳实践

1. 背景 REST(英文:Representational State Transfer,表述性状态转移)描述了一个架构样式的网络系统,比如 web 应用程序. 目前互联网上充斥着大量的关于RESTful API(为方便,下文中"RESTful API "简写为"API")如何设计的文章,然而却没有一个"万能"的设计标准:如何鉴权?API 格式如何?你的API是否应该加入版本信息?当你开始写一个app的时候,特别是后端模型部分已经写完的时候,你

HTML5项目笔记4:使用Audio API设计绚丽的HTML5音乐播放器

HTML5 有两个很炫的元素,就是Audio和 Video,可以用他们在页面上创建音频播放器和视频播放器,制作一些效果很不错的应用. 无论是视屏还是音频,都是一个容器文件,包含了一些音频轨道,视频轨道和一些元数据,这些是和你的视频或者音频控件绑定到一块的,这样才形成了一个完整的播放组件. 浏览器支持情况: 浏览器 支持情况 编解码器 Chrome 3.0 Theora . Vorbis .Ogg H.264 . AAC .MPEG4 FireFox 3.5 Theora . Vorbis .Og

RESTful API 设计最佳实践(转)

摘要:目前互联网上充斥着大量的关于RESTful API(为了方便,以后API和RESTful API 一个意思)如何设计的文章,然而却没有一个”万能“的设计标准:如何鉴权?API格式如何?你的API是否应该加入版本信息? 背景 目前互联网上充斥着大量的关于RESTful API(为了方便,以后API和RESTful API 一个意思)如何设计的文章,然而却没有一个”万能“的设计标准:如何鉴权?API格式如何?你的API是否应该加入版本信息?当你开始写一个app的时候,特别是后端模型部分已经写完

Web开发之RSET API

REST介绍 如果要说什么是REST的话,那最好先从Web(万维网)说起. 什么是Web呢?读者可以查看维基百科的词条(http://zh.wikipedia.org/zh-cn/Web),具体的我就不多说了.总之,Web是我们在互联网上最常用的服务,甚至在某些人的心中,互联网就是Web.当然,Web只是互联网的一部分而已,只是大家用的最多而已,我们访问的所有网站都是基于Web. 那么,Web和REST之间究竟有什么关系呢?我们接下来将聊聊组成Web的几大基础技术,URI(统一资源标识符,用来标