首页 > 其他分享 >Web 开发:自定义路由器

Web 开发:自定义路由器

时间:2024-11-01 11:00:18浏览次数:1  
标签:Web http 自定义 mainMux 域名 路由 路由器

在 Web 开发中,自定义路由器(即自定义 ServeMux 实例)可以带来更大的灵活性和控制。

1. 需要不同的路由策略

默认的 DefaultServeMux 适合简单的 URL 路由需求,但在一些更复杂的场景下(例如需要动态路由、参数化路径等),自定义路由器或第三方路由库(如 gorilla/mux)通常更灵活。

2. 多域名或子域支持

当需要一个服务器支持多个域名或子域名时,每个域名的路由规则可能不同。这种情况下,可以为每个域名或子域自定义一个 ServeMux,然后在主程序中分配到各自的路由器上。

mainMux := http.NewServeMux()  // 主域名路由
subMux := http.NewServeMux()   // 子域名路由
subMux.HandleFunc("/special", specialHandler)

http.ListenAndServe(":8080", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    if strings.HasPrefix(r.Host, "sub.example.com") {
        subMux.ServeHTTP(w, r)
    } else {
        mainMux.ServeHTTP(w, r)
    }
}))

3. 分离业务逻辑

在较大的应用程序中,可以为不同模块创建自定义路由器,方便管理不同功能模块的路由。例如,为管理后台、用户模块、API 模块等创建各自的路由器,便于模块化管理,代码更清晰。

apiMux := http.NewServeMux()
apiMux.HandleFunc("/users", userHandler)
apiMux.HandleFunc("/products", productHandler)

mainMux := http.NewServeMux()
mainMux.Handle("/api/", http.StripPrefix("/api", apiMux)) // 将 /api 路由交给 apiMux

http.ListenAndServe(":8080", mainMux)

4. 基于中间件的请求拦截和处理

有时候需要在请求到达特定的处理函数之前进行一些额外处理,例如身份验证、日志记录、跨域处理等。自定义路由器可以在某一组路由上挂载中间件,增强路由器的功能。

func loggingMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        log.Printf("Request: %s %s", r.Method, r.URL.Path)
        next.ServeHTTP(w, r)
    })
}

customMux := http.NewServeMux()
customMux.HandleFunc("/", handler)

loggedMux := loggingMiddleware(customMux)
http.ListenAndServe(":8080", loggedMux)

5. 多路由器组合

自定义路由器允许在同一服务器中使用不同的路由器并组合。例如,可以用不同的路由器处理 API 请求和静态文件请求,便于路由管理和请求分流。
自定义路由器通常用于更复杂的场景,例如多域名支持、模块化路由管理、请求中间件处理等。通过自定义,可以实现更精细的控制,避免 DefaultServeMux 的限制,使路由管理更加灵活。

标签:Web,http,自定义,mainMux,域名,路由,路由器
From: https://www.cnblogs.com/niumachen/p/18519732

相关文章

  • python使用魔法函数__getitem__实现字典和列表式访问自定义类型
    起因想起C++可以实现运算符重载,以实现以数组的方式([])访问我们的类.我想要实现一个类,可以同时用类似于字典和就想到python能不能实现这个效果,而且显然是可以的,不然numpy是怎么实现属于自己的数组的?#期望实现效果classmyclass: passc=myclass()#像这样使用[]访......
  • Webview
    importandroidx.appcompat.app.AppCompatActivity;importandroidx.browser.customtabs.CustomTabsClient;importandroidx.browser.customtabs.CustomTabsIntent;importandroidx.browser.customtabs.CustomTabsServiceConnection;importandroidx.browser.customtabs.C......
  • 猿人学web端爬虫攻防大赛赛题第3题——访问逻辑 - 推心置腹
    题目网址:https://match.yuanrenxue.cn/match/3解题步骤看触发的流量包。再看当前流量包中有没有什么特殊的字段。没看到有特殊的字段,直接写代码访问。importrequestsurl="https://match.yuanrenxue.cn/api/match/3?page=1"headers={ 'User-Agent':'Mozilla/5.0(......
  • 自己怎么修改网站的版面,如何自定义网站布局与设计
    选择编辑工具:如果你使用的是网站构建平台(如WordPress、Wix等),可以直接使用平台提供的可视化编辑器。如果是自建网站,需要使用代码编辑器(如VSCode、SublimeText等)。备份现有文件:在修改之前,务必备份现有的文件,以防万一出现问题可以恢复。学习基础设计:了解网页设计的基本原则,......
  • Java 自定义异常
    注:建议先阅读Java异常分类Java中使用自定义异常类,一般是继承Exception或者它的某个子类。如果父类是RuntimeException或它的某个子类,则自定义异常也是未受检异常;如果是Exception或Exception的其他子类,则自定义异常是受检异常。Java中的一些异常类(比如NullPointer......
  • 树莓派5安装ollama+open-webui
    新购置了个PI5,就想着折腾些什么。除了给它装codesys之外,想到(尤其是看到官配的冷却风扇)是不是能跑个AI什么的。捜了一下,除了TensorFlowLite、PyTorchMobile还有做视觉的OPENCV和YOLO。除此之外,一个熟悉的词汇又冒了出来。ollama。记得有段时间看到很多短视频推送,想着就找下资料看......
  • clickhouse 20.1之web UI工具使用
    背景:盘古开天,晴天霹雳,甲方不允许直连数据库了。但是发现了可以使用web页面来使用clickhous数据库。数据库版本:20.1。2018年的古老版本;那时候clickhous还没有自带的好用的webUI。然后我找了官方文档里面所说的【第三方开发的可视化界面】:https://clickhouse.com/docs/zh/interf......
  • 前端之移动web(一)
    1.平面转换transform⚫作用:为元素添加动态效果,一般与过渡配合使用⚫概念:改变盒子在平面内的形态(位移、旋转、缩放、倾斜)平面转换又叫2D转换 一:平面转换–平移⚫属性transform:translate(X轴移动距离,Y轴移动距离......
  • (开题报告)django+vuejavaweb学生宿舍管理系统论文+源码
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于学生宿舍管理系统的研究,现有研究多集中于传统管理模式或单一功能模块的实现。在国内外,传统的学生宿舍管理方式主要依赖人工操作,效......
  • A股\美股\港股 WebSocket实时行情接口接入
    Websocket行情接入请按照下面的步骤完成沪深、港股或美股的行情接入。原文地址:https://jvquant.com/wiki.html#websocket-分配服务器为实现更好的用户体验,系统将自动为您分配合适的服务器。注意:每次分配的服务器地址会发生变化,连接服务前,请务必调用该接口获取最新的服务器地......