本文是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实现简单的路由的更多相关文章

  1. 一步一步重写 CodeIgniter 框架 (2) —— 实现简单的路由功能

    在上一课中,我们实现了简单的根据 URI 执行某个类的某个方法.但是这种映射没有扩展性,对于一个成熟易用的框架肯定是行不通的.那么,我们可以让 框架的用户 通过自定义这种转换来控制,用 CI 的术语就 ...

  2. flask简单的路由分发

    flask简单的路由分发 from flask import Flask, request app = Flask(__name__) @app.route('/hello') def index() ...

  3. 手把手教你用vue-cli构建一个简单的路由应用

    上一章说道:十分钟上手-搭建vue开发环境(新手教程)https://www.jianshu.com/p/0c6678671635 开发环境搭建好之后,那么开始新添加一些页面,构建最基本的vue项目, ...

  4. mininet(二)简单的路由实验

    mininet(一)实验环境搭建 mininet(二)简单的路由实验 mininet(三)简单的NAT实验 在网上找了 好几个代码都是不能直接复现成功,这里把自己实现成功的代码给大家演示一下. 实验的 ...

  5. 一个简单的路由,用javascript实现

    前端路由在很多开源的js类库框架中都得到支持,如angularJS,Backbone,Reactjs等等.前端路由和后端路由原理一样,是让所有的交互和展现在一个页面运行以达到减少服务器请求,提高客户体 ...

  6. PHP实现一个简单url路由功能

    如果一个页面的内容呈现,需要根据url上传递的参数来进行渲染.很多时候可能是这样子写:xxx.com/xx?c=x&m=x& t=..,而我们看到的url往往是这样子的(以新浪微游戏的 ...

  7. Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数

    上一篇:Angular2入门系列教程-服务 上一篇文章我们将Angular2的数据服务分离出来,学习了Angular2的依赖注入,这篇文章我们将要学习Angualr2的路由 为了编写样式方便,我们这篇 ...

  8. ASP.NET MVC 及 Areas 简单控制路由

    ASP.NET MVC中怎么去控制路由,这个想关的文章很多,我在这里就是自我总结一下,仅供参考. 1.我们新建一个项目,查看RouteConfig.cs,代码如下: public static voi ...

  9. vue入门--简单嵌套路由的一个路径小问题

    假设现在有一个项目,刚进去要显示main页面下的contorl页面,那么路由里面的初级路由应该是{main和err},这两个是同一级,然后{control和set}是main下的子路由,foot是这两 ...

  10. js web简单的路由管理器

    灵感来自此博客和此库 index.html <!DOCTYPE html> <html lang="en"> <head> <meta c ...

随机推荐

  1. postman——预处理和断言

    一.预处理 Pre-request Scrip 1.Pre-request Script是集合中请求发送之前需要执行的代码片段 2.请求参数中包含一个随机数或者请求header中包括一个时间戳,或者你 ...

  2. redis + AOP + 自定义注解实现接口限流

    限流介绍 限流(rate limiting) ​ 是指在一定时间内,对某些资源的访问次数进行限制,以避免资源被滥用或过度消耗.限流可以防止服务器崩溃.保证用户体验.提高系统可用性. 限流的方法有很多种 ...

  3. Elasticsearch对接MinIO存储Snapshot快照

    服务器配置 MinIO集群节点(4节点) IP 节点1 miniotest1.ip.tp-link.com 172.29.145.80 生产环境需要增加一个Nginx负载均衡前端用于ELK对接,此处直 ...

  4. wasm+pygbag让你在网页上也能运行Python代码:【贪吃蛇游戏】

    引言 最近小伙伴告诉我一种新的方法,可以使用wasm来使浏览器网页能够运行Python代码.这一下子激起了我的兴趣,因为这意味着用户无需安装Python环境就能直接运行我的demo,这真是太方便了.所 ...

  5. 设计模式Java实战,彻底学会

    ​ ​这是全网最强的Java设计模式实战教程.此教程用实际项目场景,结合SpringBoot,让你真正掌握设计模式. 网址是:Java设计模式实战专栏介绍 - 自学精灵(也可以百度搜索"自学 ...

  6. Vue源码学习(十九):router基本原理

    好家伙,   0.什么是路由? 路由就是匹配到对应路径显示对应的组件! 那么我们要如何去实现? 我们来回忆一下这router怎么用的 1. 声明式路由配置:在路由配置对象中,定义路径与组件的映射关系. ...

  7. 华夏天信携手华为云开天aPaaS,打造安全、高效、节能的主煤流运输系统

    摘要:基于开天aPaaS集成工作台,主煤流运输系统如何实现多源异构数据融合.皮带物料和人员违章的智能感知,以及皮带的智能控制.灵活架构.高效集成.快速开发! 本文分享自华为云社区<华夏天信携手华 ...

  8. 一文了解如何使用移动应用安全组件Soot和Flowdroid

    摘要:移动应用安全检测,soot.flowdroid分别作为静态分析.污点分析主要工具,能我们能够快速高效的进行检测分析.本文主要介绍两个工具的基本操作及相应的使用场景 本文分享自华为云社区<移 ...

  9. 华为AppCube入选Forrester《中国低代码平台市场分析报告》

    摘要:知名研究与分析机构Forrester于11月11日发布<中国低代码平台市场分析报告(The State Of Low-Code Platforms In China)>,AppCub ...

  10. DarkMode(2):深色模式解决方案——css颜色变量实现Dark Mode

    暗黑模式实现,最初的设计,就是参考之前的主题模式.所谓多套主题/配色/皮肤,就是我们很常见的换肤功能.换肤简单的实现就是更换 css实现不同样式呈现不同肤色. 之前做不同颜色的皮肤,暗黑模式可以单做其 ...