首页 > 其他分享 >Mygin实现简单的路由

Mygin实现简单的路由

时间:2024-01-16 17:02:41浏览次数:27  
标签:Engine http Mygin func 简单 path method 路由

本文是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!

标签:Engine,http,Mygin,func,简单,path,method,路由
From: https://www.cnblogs.com/pengb/p/17967717

相关文章

  • Mygin 实现简单Http
    本篇是完全参考gin的功能,自己手动实现一个类似的功能,帮助自己理解和学习gin框架目的简单介绍net/http库以及http.Handler接口实现简单的功能标准库启动Web服务import"net/http"funchelloHandler(whttp.ResponseWriter,r*http.Request){ w.Write([]byte("hellowor......
  • 全局路由守卫
    需求:1.有一个登录页面和主页面2.没有登录无法访问主页面,并重定向到登录页面3.登录后可正常访问主页面 实现方式:router/index.js下书写:router.beforeEach((to,from,next)=>{//访问的是登录页面或sessionStorage内有值if(to.name=='login'||sessionSto......
  • redis 发布订阅 的简单用法
    背景目前所使用的爬虫管理平台在自动获取git代码时会有拉不下来代码的情况,导致服务器上运行的不是最新的代码解决方案代码合并到master分支上之后,通过webhook触发消息发布接口,服务器在收到监听到消息开始从git的master分支上拉去代码因为拉取的代码存放在宿主机中,dock......
  • 简单再回顾一下前后端分离的历程,以及他的优点(有的内容是粘贴的别人的,我只用来自己学习
    我的大作业要用到python写后端代码,但是python写前端页面太够吧丑了,所以还是得学习学习Vue,在系统学习vue之前,我先回顾回顾之前学习过一小段时间的vue,以及了解一下前后端分离的好处在5年前,前后端还是几乎是不分离的,web开发中的代码尤其混杂,PHP中有JS,JSP中有JS,ASP中有JS,JS......
  • 《路由篇》路由
    路由参考链接:https://www.cnblogs.com/chengqiang521/p/15512719.htmlrouter是什么路由,一个router就是一组key-value对,只不过这里的key是路径,就是path,value是组件。基本使用1安装vue-routernpmivue-router2应用插件Vue.use(VueRouter)3编写router配置项点击查看代......
  • nodeJS搭建简单socket测试
    背景:有个小伙伴使用vue连不上公司的socket,但又要想做连接测试。网上搜索,安装node环境,其实就是下载个安装包:https://nodejs.org/en/download,安装成功后,配置一下环境变量,配置后win+R,输入cmd打开命令框,输入node-v,可以正常输出node的版本号,说明node安装完成。然后就是如何创建一个n......
  • 还不敢写多线程程序?看看Go如何让并发控制简单有趣
    还不敢写多线程程序?看看Go如何让并发控制简单有趣原创 萤火架构 萤火架构 2024-01-1219:50 发表于北京 听全文所谓并发控制,就是同一程序进程内不同线程间访问相同资源时的冲突处理,有时也称为进程内同步。比如一个简单的内存累加计数操作,如果不进行同步,不同的线程可......
  • 简单的链式存储节点
    本文简述了两个实现了链式存储的节点类。第一个是单向链表的节点类Node<>,支持泛型支持访问后续节点实现如下,template<class_T>structNode{_Titem;Node*next=nullptr;};第二个是双向链表的节点类Biway_Node<>,支持泛......
  • Day50 简单小结:类与对象
    简单小结:类与对象1.类与对象类是一个模板:抽象对象是一个具体的实例2.方法定义,调用!3.对象的引用引用类型:基本类型(8)对象是通过引用来操作的:栈---->堆4.属性:字段Filed成员变量默认初始化:数字:00.0c......
  • 简单的顺序存储容器
    本文简述了一个实现了顺序存储的容器类(Array),并对其进行了验证。此Array类具有如下能力:支持泛型指定存储容量可用列表(initializer_list)初始化支持拷贝和移动语义可按值或引用传递此类的对象,也可作为值返回可用下标运算符访问元素支持基于范围的循环◆实现使用类模板......