基于 gorilla/mux 实现路由匹配和请求分发:服务单页面应用

由 学院君 创建于1年前, 最后更新于 1年前

版本号 #1

1279 views

0 likes

0 collects

随着前后端分离的大势所趋,后端应用为前端单页面应用(SPA,通常由 Vue、React 等前端框架构建)提供包含数据的 API 接口,然后由前端代码负责路由跳转和渲染变得越来越流行,gorilla/mux 包也对此功能特性提供了开箱支持。

要演示完整的前后端分离单页面应用,需要先初始化前端应用,以基于 Vue.js 构建前端应用为例,使用 Vue CLI 初始化一个名为 gospa 的 Vue 应用,可以在任意目录下创建(需要安装过 Vue CLI 才能执行以下初始化命令):

vue create gospa

cd gospa

yarn serve

启动应用后,可以按照提示在浏览器通过 http://localhost:8080/ 访问应用首页:

接下来,我们通过后端实现 HTTP 服务器来托管前端应用和资源访问。

对于单页面应用,只需在首次访问时请求后端入口路由初始化前端资源,后续交互都是通过前端代码调用后端 API 接口完成数据渲染,从用户角度来说,页面不会刷新,所以看起来就像只有一个单页面。因此,我们只需要在后端入口处定义一个返回初始化前端资源的 HTML 模板视图即可(这个 HTML 文档中引入了前端应用入口 JavaScript 文件以及必要的 CSS 文件),在 gospa 应用根目录下新建一个 server.go,并编写后端实现代码如下:

package main

import (

"github.com/gorilla/mux"

"log"

"net/http"

"os"

"path/filepath"

"time"

)

// spaHandler 实现了 http.Handler 接口,所以可以用来处理 HTTP 请求

// 其中 staticPath 用于定义前端静态资源目录(包含js、css 文件)

// indexPath 用于定义入口视图模板文件,通常是 index.html

type spaHandler struct {

staticPath string

indexPath string

}

// 处理 SPA 应用请求(主要是首次访问时入口 HTML 文档和相关静态资源文件,暂不涉及 API 接口)

func (h spaHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {

// 获取 URL 路径的绝对路径

path, err := filepath.Abs(r.URL.Path)

if err != nil {

// 如果获取失败,返回 400 响应

http.Error(w, err.Error(), http.StatusBadRequest)

return

}

// 在 URL 路径前加上静态资源根目录

path = filepath.Join(h.staticPath, path)

// 检查对应资源文件是否存在

_, err = os.Stat(path)

if os.IsNotExist(err) {

// 文件不存在返回入口 HTML 文档内容作为响应

http.ServeFile(w, r, filepath.Join(h.staticPath, h.indexPath))

return

} else if err != nil {

// 如果期间报错,返回 500 响应

http.Error(w, err.Error(), http.StatusInternalServerError)

return

}

// 一切顺利,则使用 http.FileServer 处理静态资源请求

http.FileServer(http.Dir(h.staticPath)).ServeHTTP(w, r)

}

func main() {

router := mux.NewRouter()

spa := spaHandler{staticPath: "dist", indexPath: "index.html"}

router.PathPrefix("/").Handler(spa)

srv := &http.Server{

Handler: router,

Addr: "127.0.0.1:8000",

// 最佳实践:为服务器读写设置超时时间

WriteTimeout: 15 * time.Second,

ReadTimeout: 15 * time.Second,

}

log.Fatal(srv.ListenAndServe())

}

具体的业务逻辑都已经写在注释里了。

接下来,我们通过 Go Module 管理 Go 依赖:

go mod init gospa

go mod tidy

然后启动这个基于 Go 实现的 HTTP 服务器:

go run server.go

修改 gospa/src/App.Vue 中传入 HelloWorld 组件的 msg 属性如下:

在 gospa 根目录下运行 yarn build,将前端资源编译到 dist 目录下,至此我们的项目目录结构如下所示:

第一个红框区域对应的目录就是编译后的前端静态资源和 HTML 视图模板所在目录。

然后在浏览器中访问 http://127.0.0.1:8000,即可看到如下效果:

之前对 msg 变量值的修改生效,并且基于 Go 实现的 HTTP 服务器可以成功服务 SPA 应用。

mysql的请求分发,基于 gorilla/mux 实现路由匹配和请求分发:服务单页面应用相关推荐

  1. 基于vue2 + vue-router + vuex 构建的一个新闻类大型单页面应用 —— 今日头条

    vue2-news 前言 该项目UI模仿今日头条,但我尽可能地做了许多修改,我不是做UI设计的,如何还看得过去,右上角点个 "star" 支持一下吧? 该项目包括移动端和nativ ...

  2. addeventlistener监听ajax请求_基于h5的history改善ajax列表请求体验

    信息比较丰富的网站通常会以分页显示,在点"下一页"时,很多网站都采用了动态请求的方式,避免页面刷新.虽然大家都是ajax,但是从一些小的细节还是 可以区分优劣.一个小的细节是能否支 ...

  3. MVC简单实现插件Demo-从底层理解MVC路由匹配浏览器请求的URL

    今天实现了在mvc平台下自定义插件,虽然功能比较简单,但是通过对反射的运用,更加明白了为什么我们在浏览器上输入友好的url时,mvc会智能的帮我们找到我们想要查找的页面呢?mvc在底层又是怎样实现的呢 ...

  4. 【Golang源码分析】Go Web常用程序包gorilla/mux的使用与源码简析

    目录[阅读时间:约10分钟] 一.概述 二.对比: gorilla/mux与net/http DefaultServeMux 三.简单使用 四.源码简析 1.NewRouter函数 2.HandleF ...

  5. gorilla/mux类库解析

    简介 gorilla/mux实现了一个请求路由和分发的Go框架."mux"的意思是"HTTP request multiplexer",和标准包http.Ser ...

  6. gorilla/mux 翻译

    mux https://github.com/gorilla/mux gorilla / mux实现了一个请求路由器和分发器,用于将传入的请求与其各自的处理程序进行匹配. 名称mux代表" ...

  7. MySQL高可用之基于Galera复制跨地域节点分布的滥用

    mysql使用教程 MySQL高可用之基于Galera复制跨地域节点分布的滥用 2018-11-22 02:15 8335 85 让我们再一次讨论MySQL高可用性(HA)和同步复制. 它是地理上分布 ...

  8. php ajax mysql 分页查询_基于PHP_MySql_Ajax的分页技术方案

    一.引言 Ajax的全称是AsynchronousJavaScriptAndXML(异步JavaScript和XML),它不是一项新技术,而是很多成熟的技术的集合. 和Applet,Flash相比,A ...

  9. 路由复用器--gorilla/mux

    简介 gorilla/mux是 gorilla Web 开发工具包中的路由管理库.gorilla Web 开发包是 Go 语言中辅助开发 Web 服务器的工具包.它包括 Web 服务器开发的各个方面, ...

最新文章

  1. 后端开发之libcurl库编译与安装
  2. php thrift 报错,thrift安装遇到的问题以及解决方法(必看篇)
  3. resnet50 自定义
  4. git 提交代码命令_Git命令可视化展示,代码管理再也不愁了,建议收藏!
  5. 32 | 答疑(四):阻塞、非阻塞 I/O 与同步、异步 I/O 的区别和联系
  6. vue.js项目中,关于element-ui完整引入、按需引入的介绍
  7. pyQt显示系统文件目录
  8. macOS 使用手册
  9. php foreach 不等于_你不知道的接口测试之简单的开始
  10. word2vec的应用场景
  11. Redis set集合结构及命令详解
  12. Atitit 防伪防篡改方法总结关键数据的防篡改检验方法
  13. Linux服务器时间校准
  14. #1.生活小妙招-联想小新潮7000电脑摄像头打不开
  15. 转载 SpringMVC详解(一)------入门实例
  16. 09.mtk背光流程
  17. python数据分析002—python基础语法
  18. 视频字幕添加软件有哪些?这有视频字幕添加的软件
  19. 让声音更清晰,用PR去掉视频中的噪音
  20. 爆款的抖音账号都是如何进行产品定位的

热门文章

  1. 玩转spring boot——开篇
  2. 优步杭州推出顺路接单功能,不久将向全国开放!
  3. HttpContext.Current.Session.SessionID相关问题及备忘
  4. (转)初识suse——linux
  5. Sublime+ZenCoding的使用
  6. 四步破解大亚DP607超级密码,别的光猫可能也适用!
  7. MVC添加控制器时提示无法检索“MyContosoUniversity.Models.Student”的元数据
  8. 算法导论 CLRS 23.3 解答 (未完成)
  9. H3C进入目录---用户视图
  10. luogu2680 运输计划