Go打造REST Server【二】:用路由的三方库来实现

news2024/10/11 0:28:50

前言

在之前的文章中,我们用Go的标准库来实现了服务器,JSON渲染重构为辅助函数,使特定的路由处理程序相当简洁。
我们剩下的问题是路径路由逻辑,这是所有编写无依赖HTTP服务器的人都会遇到的问题,除非服务器只处理一到两个路由,否则组织路由器代码是冗长和困难的。

高级路由

首先的想法是抽象路由,可能使用一组函数或带有方法的数据类型,有许多有趣的临时方法可以做到这一点,Go生态系统中有许多功能强大且使用良好的三方路由包可以为做这件事。
我们再回顾一下设计的服务器路由:

POST   /page/              :  create a page, returns ID
GET    /page/<pageid>      :  returns a single page by ID
GET    /page/              :  returns all pages
DELETE /page/<pageid>      :  delete a page by ID
PUT    /page/<pageid>      :  update a page by ID
GET    /tag/<tagname>      :  returns list of pages with this tag
GET    /due/<yy>/<mm>/<dd> :  returns list of pages due by this date

我们可以做几件事来使路由更符合观感:

  • 添加一种方法来为同一路由上的不同方法设置单独的处理程序。例如,/page/的POST应该转到一个处理程序,GET /page/到另一个处理程序,等等。
  • 添加一种“更深”匹配的方法;例如,我们应该可以说/page/进入一个处理程序,而 /page/使用数字ID进入另一个处理程序。
  • 当我们这样做时,匹配器应该只从/page/中提取数字ID并以某种方便的方式将其传递给处理程序。

由于HTTP处理程序的可组合性,在Go中编写自定义路由器非常简单,例如最流行的第三方方路由包之一:gorilla/mux。

gorilla/mux实现的服务器

gorilla/mux是最久的流行Go HTTP路由器之一,根据文档,名称mux代表“HTTP请求多路复用器”(与标准库中的含义相同)。
因为它是一个目标明确的包,所以它的使用相当简单,以下是路由的定义方式:

router := mux.NewRouter()
router.StrictSlash(true)
server := NewPageServer()

router.HandleFunc("/page/", server.createPageHandler).Methods("POST")
router.HandleFunc("/page/", server.getAllPagesHandler).Methods("GET")
router.HandleFunc("/page/", server.deleteAllPagesHandler).Methods("DELETE")
router.HandleFunc("/page/", server.updatePageHandler).Methods("PUT")
router.HandleFunc("/page/{id:[0-9]+}/", server.getPageHandler).Methods("GET")
router.HandleFunc("/page/{id:[0-9]+}/", server.deletePageHandler).Methods("DELETE")
router.HandleFunc("/tag/", server.tagHandler).Methods("GET")
router.HandleFunc("/due/", server.dueHandler).Methods("GET")

通过将方法调用附加到路由上,我们可以轻松地将同一路径上的不同方法定向到不同的处理程序。路径中的模式匹配(使用正则表达式语法)让我们可以轻松地区分顶级路由定义中的/page/和/page/。

我们来看看getPageHandler:

func (p *PageServer) getPageHandler(w http.ResponseWriter, r *http.Request) {
   log.Printf("handling get page at %s\n", r.URL.Path)
   // Here and elsewhere, not checking error of Atoi because the router only
   // matches the [0-9]+ regex.
   id, _ := strconv.Atoi(mux.Vars(r)["id"])
   ret, err := p.store.GetPage(id)

   if err != nil {
      http.Error(w, err.Error(), http.StatusNotFound)
      return
   }

   renderJSON(w, ret)
}

在路由定义中,路由/page/{id:[0-9]+}/定义了解析路径的正则表达式,但也将标识符部分分配给“id”。这个“变量”可以通过在请求上调用mux.Vars来访问。

方法对比

为了理解GET /page/路由在我们的原始服务器中是如何处理的,必须采用以下代码阅读路径:
在这里插入图片描述
而这是使用gorilla/mux时的路径:
在这里插入图片描述
除了可以跳过的步骤更少之外,要阅读的代码也大大减少了,从代码可读性的角度来看,使用gorilla/mux的路径定义简短明了,阅读者很清楚这是如何工作的。另一个优势是,我们现在可以在一个地方一目了然地轻松查看所有路由。事实上,路由配置代码现在看起来与我们非正式的REST API定义非常相似。
像gorilla/mux这样的包,因为它们是一个精密工具,他们只做一件事,而且做得很好,而且他们不会“感染”整个程序,使他们以后难以删除或替换。如果我们检查这部分的服务器代码,我们会注意到使用gorilla/mux的部分仅限于相对较少的代码行。如果我们在项目生命周期的后期发现这个包有一个致命的限制,用另一个路由包(或手动版本)替换它应该是相当简单的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1554103.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用xshell或ftp连接本地虚拟机linux系统,centos7修改动态ip地址

如果不知道怎么下载vm本地虚拟机软件或者不知道怎么安装可以参考我上一篇博客 vmWare虚拟机下载安装详细教程,手把手一步一步教学-CSDN博客 安装好虚拟机软件我们想要通过xshell和ftp工具来管理,小黑框不太舒服哈哈哈 一.准备工作 输入命令来查看当前的ip地址 ip addr 可以…

unity学习(76)--窗口化和后台运行

1.通过如下方式将编译的游戏设置为窗口模式。 成功&#xff1a; 2.现在只有鼠标点击的窗体游戏运动&#xff0c;其他窗体游戏都会卡住。 2.1build setting中 2.2unity内部Project Settings 也被同步修改了

VBA技术资料MF135:多值匹配查找

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

unity 数据的可视化

【Unity 实用插件篇】| 可视化图表插件XCharts (折线图、柱状图、饼图等)详细教学-腾讯云开发者社区-腾讯云 Package https://github.com/XCharts-Team/XCharts/releases 官方文档案例 入门教程&#xff1a;5分钟上手 XCharts 3.0 | XCharts (xcharts-team.github.io)

idea2023+jdk1.8+Maven3.6.3+Testng6.10+junit4.13搭建测试

idea2023jdk1.8Maven3.6.3Testng6.10junit4.13搭建测试 首先创建maven工程 导入依赖 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/…

文心一言 VS 讯飞星火 VS chatgpt (225)-- 算法导论16.3 7题

七、推广赫夫曼算法&#xff0c;使之能生成三进制的码字(即码字由符号0、1、2组成)&#xff0c;并证明你的算法能生成最优三进制码。如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; 推广赫夫曼算法以生成三进制码字需要对算法进行一定的修改&#xff0c;确保在每…

前端学习<二>CSS基础——08-CSS属性:定位属性

CSS的定位属性有三种&#xff0c;分别是绝对定位、相对定位、固定定位。 position: absolute; <!-- 绝对定位 -->​position: relative; <!-- 相对定位 -->​position: fixed; <!-- 固定定位 -->​ 下面逐一介绍。 相对定位 相对定位&#xff1a;让…

用DataGrip连接hive时报错:User: root is not allowed to impersonate plck5,解决方法

你可以尝试关闭主机校验 修改hive安装目录下conf/hive-site.xml,将hive.server2.enable.doAs设置成false <property><name>hive.server2.enable.doAs</name><value>false</value><description>Setting this property to true will have H…

常用类(日期时间)

目录 一、JDK 8之前的日期时间API1.1、System类中获取时间戳的方法1.2、Java中两个Date类的使用1.3、SimpleDateFormat的使用1.4、Calendar日历类的使用 二、JDK8中日期时间API的介绍2.1、LocalDate、LocalTime、LocalDateTime的使用2.2、Instant类的使用2.3、DateTimeFormatte…

OKCC的API资源管理平台怎么用?

API资源管理平台&#xff0c;重点是“资源”管理平台&#xff0c;不是API接口管理平台。 天天讯通推出的API资源管理平台&#xff0c;类似昆石的VOS系统&#xff0c;区别是VOS是SIP资源管理系统&#xff0c;我们的API资源管理平台是API资源管理系统&#xff08;AXB、AX、回拨AP…

Spring Boot 统一数据返回格式 分析 和 处理

目录 实现统一数据格式 测试 原因分析 解决方案 &#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f4d5;格言&#xff1a;吾愚多不敏&#xff0c;而愿加学欢迎大家&#x1f44d;点赞✍评论⭐收藏 实现统一数据格式 统⼀的数据返回格式使⽤ ControllerAdvice 和 Response…

达梦数据库新手上路排坑

数据库安装 这个没啥说的&#xff0c;按照官网教程操作&#xff0c;我使用的是docker进行安装 下载文件docker文件 官方下载地址- load -i dm8****.tar (注意修改为当前下载的文件)达梦官方文档注意修改为当前版本 docker run -d -p 5236:5236 --name dm8 --privilegedtrue -…

京东云4核16G服务器优惠价格26元1个月、658元1年、三年3098元

京东云4核16G服务器优惠价格26元1个月、80元3个月、658元1年、3098元三年&#xff0c;配置为&#xff1a;轻量云主机4C16G-220G SSD系统盘-5M带宽-500G月流量&#xff0c;京东云优惠活动 atengyun.com/go/jd 可以查看京东云服务器详细配置和精准报价单&#xff0c;活动打开如下…

电子显微镜——相机

相机种类 相机种类繁多,下面根据相机接口和图像传感器类型进行分类。 根据数据接口分类 1. USB相机 USB相机通常可以指代多种不同类型的USB接口相机,其中包括UVC(USB Video Class)相机和U3V(USB3 Vision)相机等,它们通常使用SOC进行开发。以下是它们的区别和特点: …

香港服务器与SEO的关系(香港服务器对SEO影响大吗?)

香港服务器与 SEO 的关系是一个备受关注的话题&#xff0c;不少站长在选择了香港服务器后&#xff0c;便会疑问&#xff1a;香港服务器对SEO的影响是否显著?那么&#xff0c;在这里就跟大家聊聊两者的关系以及影响大小。 其实&#xff0c;不少站长对 SEO 的这种担忧和想法是片…

测开——测试用例设计题

1.测试手机的短信功能需要考虑哪些测试点&#xff1f; 考测试思维 是否能正常打开或进入短信界面短信可以正常编辑、修改、删除短信可以正常发送、接收短信页面的字体、颜色显示是否正常【UI界面 手机设置了字体颜色 大小是否同步】短信的字体是否能够调整同时给多个人发短信…

JVM(一)——内存结构

一. 前言 1、什么是 JVM? 1&#xff09;定义&#xff1a; Java Virtual Machine - java 程序的运行环境&#xff08;java 二进制字节码的运行环境&#xff09; 2&#xff09;好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收功能数组下标越…

二十九 超级数据查看器 讲解稿 查询复用

二十九 超级数据查看器 讲解稿 查询复用 ​点击此处 以新页面 打开B站 播放当前教学视频 点击访问app下载页面 百度手机助手 下载地址 大家好&#xff0c;今天我们讲一下超级数据查看器的查询复用功能&#xff0c;这是新版本要增加的功能&#xff0c;这讲是预告。 先介绍…

【面试那些事儿】浏览器键入网址到网页显示,期间发生了什么

当用户在浏览器中键入网址并按下回车键后&#xff0c;直到最终显示出完整的网页内容&#xff0c;这一过程中经历了哪些步骤呢&#xff1f; 这是一道经典的面试题&#xff0c;我们来看看具体有哪些阶段。 1. 解析URL 浏览器首先解析用户输入的URL&#xff0c;判断它的语法和协…

这本JCR一区期刊被On Hold,投稿需谨慎!

ENVIRONMENTAL SCIENCE AND POLLUTION RESEARCH 《环境科学与污染研究》 期刊官网&#xff1a;https://link.springer.com/journal/11356 【基础信息】 ISSN&#xff1a;0944-1344 eISSN&#xff1a;1614-7499 Index&#xff1a;SCIE IF(2022)&#xff1a;5.8 出版社&am…