mysql的请求分发,基于 gorilla/mux 实现路由匹配和请求分发:服务单页面应用
基于 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 实现路由匹配和请求分发:服务单页面应用相关推荐
- 基于vue2 + vue-router + vuex 构建的一个新闻类大型单页面应用 —— 今日头条
vue2-news 前言 该项目UI模仿今日头条,但我尽可能地做了许多修改,我不是做UI设计的,如何还看得过去,右上角点个 "star" 支持一下吧? 该项目包括移动端和nativ ...
- addeventlistener监听ajax请求_基于h5的history改善ajax列表请求体验
信息比较丰富的网站通常会以分页显示,在点"下一页"时,很多网站都采用了动态请求的方式,避免页面刷新.虽然大家都是ajax,但是从一些小的细节还是 可以区分优劣.一个小的细节是能否支 ...
- MVC简单实现插件Demo-从底层理解MVC路由匹配浏览器请求的URL
今天实现了在mvc平台下自定义插件,虽然功能比较简单,但是通过对反射的运用,更加明白了为什么我们在浏览器上输入友好的url时,mvc会智能的帮我们找到我们想要查找的页面呢?mvc在底层又是怎样实现的呢 ...
- 【Golang源码分析】Go Web常用程序包gorilla/mux的使用与源码简析
目录[阅读时间:约10分钟] 一.概述 二.对比: gorilla/mux与net/http DefaultServeMux 三.简单使用 四.源码简析 1.NewRouter函数 2.HandleF ...
- gorilla/mux类库解析
简介 gorilla/mux实现了一个请求路由和分发的Go框架."mux"的意思是"HTTP request multiplexer",和标准包http.Ser ...
- gorilla/mux 翻译
mux https://github.com/gorilla/mux gorilla / mux实现了一个请求路由器和分发器,用于将传入的请求与其各自的处理程序进行匹配. 名称mux代表" ...
- MySQL高可用之基于Galera复制跨地域节点分布的滥用
mysql使用教程 MySQL高可用之基于Galera复制跨地域节点分布的滥用 2018-11-22 02:15 8335 85 让我们再一次讨论MySQL高可用性(HA)和同步复制. 它是地理上分布 ...
- php ajax mysql 分页查询_基于PHP_MySql_Ajax的分页技术方案
一.引言 Ajax的全称是AsynchronousJavaScriptAndXML(异步JavaScript和XML),它不是一项新技术,而是很多成熟的技术的集合. 和Applet,Flash相比,A ...
- 路由复用器--gorilla/mux
简介 gorilla/mux是 gorilla Web 开发工具包中的路由管理库.gorilla Web 开发包是 Go 语言中辅助开发 Web 服务器的工具包.它包括 Web 服务器开发的各个方面, ...
最新文章
- 后端开发之libcurl库编译与安装
- php thrift 报错,thrift安装遇到的问题以及解决方法(必看篇)
- resnet50 自定义
- git 提交代码命令_Git命令可视化展示,代码管理再也不愁了,建议收藏!
- 32 | 答疑(四):阻塞、非阻塞 I/O 与同步、异步 I/O 的区别和联系
- vue.js项目中,关于element-ui完整引入、按需引入的介绍
- pyQt显示系统文件目录
- macOS 使用手册
- php foreach 不等于_你不知道的接口测试之简单的开始
- word2vec的应用场景
- Redis set集合结构及命令详解
- Atitit 防伪防篡改方法总结关键数据的防篡改检验方法
- Linux服务器时间校准
- #1.生活小妙招-联想小新潮7000电脑摄像头打不开
- 转载 SpringMVC详解(一)------入门实例
- 09.mtk背光流程
- python数据分析002—python基础语法
- 视频字幕添加软件有哪些?这有视频字幕添加的软件
- 让声音更清晰,用PR去掉视频中的噪音
- 爆款的抖音账号都是如何进行产品定位的
热门文章
- 玩转spring boot——开篇
- 优步杭州推出顺路接单功能,不久将向全国开放!
- HttpContext.Current.Session.SessionID相关问题及备忘
- (转)初识suse——linux
- Sublime+ZenCoding的使用
- 四步破解大亚DP607超级密码,别的光猫可能也适用!
- MVC添加控制器时提示无法检索“MyContosoUniversity.Models.Student”的元数据
- 算法导论 CLRS 23.3 解答 (未完成)
- H3C进入目录---用户视图
- luogu2680 运输计划