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

前言

在之前的文章中,我们用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.rhkb.cn/news/290749.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构进阶篇 之 【二叉树链序存储】的整体实现讲解

封建迷信我嗤之以鼻&#xff0c;财神殿前我长跪不起 一、二叉树链式结构的实现 1.二叉树的创建 1.1 手动创建 1.2 前序递归创建 2.二叉树的遍历 2.1 前序&#xff0c;中序以及后序遍历概念 2.2 层序遍历概念 2.3 前序打印实现 2.4 中序打印实现 2.4 后序打印实现 2.…

HTTP(1)

目录 一、认识HTTP协议 理解 应用层协议 二、fiddler的安装以及介绍 1、fiddler的安装 2、fiddler的介绍 三、HTTP 报文格式 1、http的请求 2、http的响应 五、认识URL 六、关于URL encode 一、认识HTTP协议 HTTP 全称为&#xff1a;“超文本传输协议”&#xff0c;是…

鸿蒙开发之了解ArkTS

鸿蒙开发者官网 &#xff1a; https://developer.huawei.com/consumer/cn/ 开发鸿蒙要用的软件是 DevEco Studio ArkTS建立在JS和TS的基础之上&#xff0c;扩展了声明式UI开发范式和状态管理&#xff0c;提供更简洁和自然的开发方式。 ArkTS引入了渲染引擎的增强&#xff0c…

【机器学习300问】56、什么是自编码器?

一、什么是自编码器&#xff1f; 自编码器&#xff08;Autoencoder&#xff0c;AE&#xff09;本质是一种特殊的神经网络架构。主要用于无监督学习和特征学习任务。它的目标是通过编码然后解码的过程&#xff0c;学会重构其输入数据&#xff0c;试图还原其原始输入的。 当时我学…

信息安全之网络安全防护

先来看看计算机网络通信面临的威胁&#xff1a; 截获——从网络上窃听他人的通信内容中断——有意中断他人在网络上的通信篡改——故意篡改网络上传送的报文伪造——伪造信息在网络上传送 截获信息的攻击称为被动攻击&#xff0c;而更改信息和拒绝用户使用资源的攻击称为主动…

AI智能分析网关智慧食安监管系统方案

3.15晚会刚过不久&#xff0c;淀粉肠的“屈辱”终于得以洗清&#xff0c;但某些品牌奶茶、梅菜扣肉、预制菜等等&#xff0c;生产过程仍是触目惊心。如何提升食品安全管理水平&#xff0c;保障食品从生产到消费环节的质量和安全&#xff1f;TSINGSEE青犀智利用智能分析网关V4Ea…

旺店通·旗舰奇门与金蝶云星空对接集成销售出库单查询连通销售出库新增(WDT 线下销售出库单对接(关联)-ok-不适用)

旺店通旗舰奇门与金蝶云星空对接集成销售出库单查询连通销售出库新增(WDT 线下销售出库单对接&#xff08;关联&#xff09;-ok-不适用) 源系统:旺店通旗舰奇门 慧策最先以旺店通ERP切入商家核心管理痛点——订单管理&#xff0c;之后围绕电商经营管理中的核心管理诉求&#xf…

Nginx(Docker 安装的nginx)配置域名SSL证书

1.首先确保Linux环境上已经安装了docker&#xff08;可参考Linux安装Docker-CSDN博客&#xff09; 2.通过docker 安装nginx&#xff08;可参考Linux 环境安装Nginx—源码和Dokcer两种安装方式-CSDN博客&#xff09; 3.安装SSL证书 3.1 在宿主机中创建证书目录并上传证书&…

使用Docker Compose一键部署前后端分离项目(图文保姆级教程)

一、安装Docker和docker Compose 1.Docker安装 //下载containerd.io包 yum install https://download.docker.com/linux/fedora/30/x86_64/stable/Packages/containerd.io-1.2.6-3.3.fc30.x86_64.rpm //安装依赖项 yum install -y yum-utils device-mapper-persistent-data l…

OpenGL的MVP矩阵理解

OpenGL的MVP矩阵理解 右手坐标系 右手坐标系与左手坐标系都是三维笛卡尔坐标系&#xff0c;他们唯一的不同在于z轴的方向&#xff0c;如下图&#xff0c;左边是左手坐标系&#xff0c;右边是右手坐标系 OpenGL中一般用的是右手坐标系 1.模型坐标系&#xff08;Local Space&…

软件设计师:10-面向对象

一、面向对象 二、对象和消息 属性&#xff1a;也叫成员变量、状态 消息&#xff1a;对象名.方法名&#xff08;传入你想要传递的参数&#xff09; 三、方法重载 方法名相同&#xff08;同名&#xff09;&#xff0c;但是参数个数或者参数类型不同叫方法重载 四、封装…

SpringBoot+Prometheus+Grafana实现应用监控和报警

一、背景 SpringBoot的应用监控方案比较多&#xff0c;SpringBootPrometheusGrafana是目前比较常用的方案之一。它们三者之间的关系大概如下图&#xff1a; 关系图 二、开发SpringBoot应用 首先&#xff0c;创建一个SpringBoot项目&#xff0c;pom文件如下&#xff1a; <…

分布式数据库技术的演进和发展方向

前言 这些年大家都在谈分布式数据库&#xff0c;各大企业也纷纷开始做数据库的分布式改造。那么&#xff0c;所谓的分布式数据库到底是什么&#xff1f;采用什么架构&#xff1f;优势在哪&#xff1f;为什么越来越多企业选择它&#xff1f;分布式数据库技术会向什么方向发展&a…

C/C++ 内存管理

1、C/C内存分布 首先我们来了解在一个程序中&#xff0c;代码主要存储在哪些地方&#xff1b; 1.栈&#xff1a;又叫堆栈&#xff0c;其中一般存储非静态局部变量、函数参数、返回值等&#xff0c;栈的增长是向下的。 2.内存映射段&#xff1a;是高效的 I/O 映射方式&#xff0…

华为2023年年度报告启示:技术工程师应该如何成长?

华为2023年年度报告显示了公司在面对复杂环境与挑战时的稳健发展&#xff0c;以及在技术创新、生态构建、社会责任等方面取得的显著成就。对于技术工程师而言&#xff0c;这份报告不仅是华为战略与成果的全景展示&#xff0c;更是蕴含了对未来技术趋势的洞见以及对工程师职业发…

前端性能优化:掌握解决方案

课程介绍 我们常说性能永远是第一需求&#xff0c;作为一个前端工程师&#xff0c;不管使用什么框架&#xff0c;不管从事什么类型的网站或应用开发&#xff0c;只要是项目被用户使用&#xff0c;性能优化就永远是你需要关注的问题。通常情况下&#xff0c;工程师们在深入了解…

云原生(七)、Kubernetes初学 + 裸机搭建k8s集群

Kubernetes简介 Kubernetes&#xff08;通常简称为K8s&#xff09;是一个开源的容器编排平台&#xff0c;最初由Google设计和开发&#xff0c;现在由Cloud Native Computing Foundation&#xff08;CNCF&#xff09;维护。它旨在简化容器化应用程序的部署、扩展和管理。 Kube…

Unity类银河恶魔城学习记录11-7 p109 Aplly item modifiers源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili ItemData_Equipment.cs using System.Collections; using System.Collecti…

如何检查电脑的最近历史记录?这里提供详细步骤

如果你怀疑有人在使用你的计算机,并且你想查看他们在做什么,下面是如何查看是否有访问内容的痕迹。 如何检查我的计算机的最近历史记录 要检查计算机的最近历史记录,应该从web浏览器历史记录开始,然后移动到文件。但是,可以修改或删除浏览器历史记录,也可以隐藏Windows…

牛角工具箱源码 轻松打造个性化在线工具箱,附带系统搭建教程

这是一款在线工具箱程序&#xff0c;您可以通过安装扩展增强她的功能 通过插件模板的功能&#xff0c;您也可以把她当做网页导航来使用~ &#x1f38a; 环境要求 PHP > 7.2.5 MySQL > 5.7 fileinfo扩展 使用Redis缓存需安装Redis扩展 去除禁用函数proc_open、putenv、s…