Mygin实现简单的路由
本文是Mygin第二篇
目的:
- 实现路由映射
- 提供了用户注册静态路由方法(GET、POST方法)
基于上一篇 Mygin 实现简单Http 且参照Gin
- 我使用了map数组实现简单路由的映射关系
- 不同的method对应一个组,Gin框架初始化时map时初始化9个,因为支持的http.method刚好为9个
package http
//Gin 中对应的9个方法
const (
MethodGet = "GET"
MethodHead = "HEAD"
MethodPost = "POST"
MethodPut = "PUT"
MethodPatch = "PATCH" // RFC 5789
MethodDelete = "DELETE"
MethodConnect = "CONNECT"
MethodOptions = "OPTIONS"
MethodTrace = "TRACE"
)
mygin路由功能实现
package mygin
import (
"log"
"net/http"
)
type Engine struct {
trees methodTrees
}
// 路由树
type methodTrees map[string]methodTree
// 路由节点
type methodTree struct {
method string
paths map[string]http.HandlerFunc
}
// 获取路由root根
func (e *Engine) getRoot(method string) methodTree {
if root, ok := e.trees[method]; ok {
return root
}
e.trees[method] = methodTree{method: method, paths: make(map[string]http.HandlerFunc)}
return e.trees[method]
}
// 添加路由方法
func (e *Engine) addRoute(method, path string, handler http.HandlerFunc) {
root := e.getRoot(method)
//是否已经在路由数上绑定,如果已经绑定就不在继续绑定
if _, ok := root.paths[path]; ok {
log.Default().Println(path, "is exist")
return
}
//将path与处理方法关系绑定
root.method = method
root.paths[path] = handler
}
func (e *Engine) ServeHTTP(w http.ResponseWriter, r *http.Request) {
//对应method中的路由树
if tree, ok := e.trees[r.Method]; ok {
//路由数中path映射
if handler, ok := tree.paths[r.URL.Path]; ok {
handler(w, r)
return
}
}
//在路由数中没有找到对应的路由
w.Write([]byte("404 Not found!\n"))
}
// Get Get方法
func (e *Engine) Get(path string, handler http.HandlerFunc) {
e.addRoute(http.MethodGet, path, handler)
}
// Post Post方法
func (e *Engine) Post(path string, handler http.HandlerFunc) {
e.addRoute(http.MethodPost, path, handler)
}
// Default returns an Engine
func Default() *Engine {
return &Engine{trees: make(methodTrees, 2)}
}
// Run 启动方法start a http server
func (e *Engine) Run(addr string) {
err := http.ListenAndServe(addr, e)
if err != nil {
return
}
}
main方法调用
package main
import (
"gophp/mygin"
"net/http"
)
func main() {
engine := mygin.Default()
engine.Get("/hello", func(writer http.ResponseWriter, request *http.Request) {
writer.Write([]byte("Mygin Get hello method"))
})
engine.Post("/hello", func(writer http.ResponseWriter, request *http.Request) {
writer.Write([]byte("Mygin Post hello method"))
})
engine.Run(":8088")
}
curl请求测试
~ curl 127.0.0.1:8088/hello
Mygin Get hello method#
~ curl -X POST http://127.0.0.1:8088/hello
Mygin Post hello method#
~ curl -X POST http://127.0.0.1:8088/hello2
404 Not found!
Mygin实现简单的路由的更多相关文章
- 一步一步重写 CodeIgniter 框架 (2) —— 实现简单的路由功能
在上一课中,我们实现了简单的根据 URI 执行某个类的某个方法.但是这种映射没有扩展性,对于一个成熟易用的框架肯定是行不通的.那么,我们可以让 框架的用户 通过自定义这种转换来控制,用 CI 的术语就 ...
- flask简单的路由分发
flask简单的路由分发 from flask import Flask, request app = Flask(__name__) @app.route('/hello') def index() ...
- 手把手教你用vue-cli构建一个简单的路由应用
上一章说道:十分钟上手-搭建vue开发环境(新手教程)https://www.jianshu.com/p/0c6678671635 开发环境搭建好之后,那么开始新添加一些页面,构建最基本的vue项目, ...
- mininet(二)简单的路由实验
mininet(一)实验环境搭建 mininet(二)简单的路由实验 mininet(三)简单的NAT实验 在网上找了 好几个代码都是不能直接复现成功,这里把自己实现成功的代码给大家演示一下. 实验的 ...
- 一个简单的路由,用javascript实现
前端路由在很多开源的js类库框架中都得到支持,如angularJS,Backbone,Reactjs等等.前端路由和后端路由原理一样,是让所有的交互和展现在一个页面运行以达到减少服务器请求,提高客户体 ...
- PHP实现一个简单url路由功能
如果一个页面的内容呈现,需要根据url上传递的参数来进行渲染.很多时候可能是这样子写:xxx.com/xx?c=x&m=x& t=..,而我们看到的url往往是这样子的(以新浪微游戏的 ...
- Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数
上一篇:Angular2入门系列教程-服务 上一篇文章我们将Angular2的数据服务分离出来,学习了Angular2的依赖注入,这篇文章我们将要学习Angualr2的路由 为了编写样式方便,我们这篇 ...
- ASP.NET MVC 及 Areas 简单控制路由
ASP.NET MVC中怎么去控制路由,这个想关的文章很多,我在这里就是自我总结一下,仅供参考. 1.我们新建一个项目,查看RouteConfig.cs,代码如下: public static voi ...
- vue入门--简单嵌套路由的一个路径小问题
假设现在有一个项目,刚进去要显示main页面下的contorl页面,那么路由里面的初级路由应该是{main和err},这两个是同一级,然后{control和set}是main下的子路由,foot是这两 ...
- js web简单的路由管理器
灵感来自此博客和此库 index.html <!DOCTYPE html> <html lang="en"> <head> <meta c ...
随机推荐
- 从零玩转人脸识别验证-face
title: 从零玩转人脸识别验证 date: 2022-05-15 21:05:52.974 updated: 2023-05-16 00:00:11.594 url: https://www.yb ...
- uniapp-welive仿微信/抖音直播带货|uni-app+vue3+pinia短视频直播商城
基于uniapp+vue3+uv-ui跨端H5+小程序+App短视频+直播带货商城Uniapp-WeLive. uni-welive一款全新基于uniapp+vue3+pinia+vk-uview等技 ...
- Python——第五章:hashlib模块
hashlib 模块(hash)算法 hashlib 模块是 Python 中用于加密散列(hash)算法的模块.它提供了对常见的哈希算法(如MD5.SHA-1.SHA-256等)的支持,使得开发者可 ...
- C语言之小明的加减法
1.题目内容: 叛逆期的小明什么都喜欢反着做,连看数字也是如此(负号除外),比如: 小明会把1234它看成4321:把-1234看成-4321:把230看成032 (032=32):把-230看成-0 ...
- Luogu P1298 最接近的分数 做题记录
算是水紫,不过也学到一些有用的东西. 题意 给定正小数 \(N\).求分子不大于 \(n\),分母不大于 \(m\) 的分数 \(\dfrac{n}{m}\),使得 \(\dfrac{n}{m}\) ...
- mysql 数据库 定时 备份到阿里云盘
仓库地址: gitee:db_backup_script: mysql 数据库 定时/实时 备份数据库到阿里云盘,备份成功后消息可通知到钉钉群.企业微信群.wxpusher (gitee.com gi ...
- bazel test 编译失败:googletest、gtest 报错
问题描述 bazel test 遇到很多奇怪的编译错误,报错位置位于"googletest"目录,而且没有修改过 googletest 源码: ERROR: /bazel_cach ...
- [Python急救站]学生管理系统链接数据库
相信很多人在初学Python的时候,经常最后作业就是完成一个学生管理系统,但是我们来做一个完美的学生管理系统,并且将数据储存到数据库里. 我们先看看我们的数据库怎么设置. 首先呢,我选择用的是SQL ...
- 华为云GaussDB支撑华为MetaERP系统全面替换
摘要:目前MetaERP已经覆盖了华为公司100%的业务场景和80%的业务量. 本文分享自华为云社区<强渡大渡河!华为云GaussDB支撑华为MetaERP系统全面替换>,作者: 华为云头 ...
- 独家下载!突破开源Redis,华为云十年自研内核修炼之路《企业级Redis技术与应用解读》重磅发布
摘要:互联网业务神器最新揭秘:GaussDB(for Redis)如何以自研架构,突破开源版本限制,带来企业级稳定可靠?通过入门篇.性能篇.测评篇.应用篇四个章节,聚焦问题解决.场景应用和开发实战,分 ...