小编典典

转到:如何使用中间件模式?

go

我有一个仅在特定条件下才能执行的函数(例如 role ==’Administrator’ )。现在,我使用 “ if”
语句。但是在某些情况下,情况可能会很多,而长定义的 “如果” 看起来并不那么美观。
Go(或与Go框架相关)中是否可用的机制允许实现中间件 概念 (动作过滤器)?

例如,ASP.NET MVC允许执行以下操作:

[MyFilter]
public ViewResult Index()
{
     // Filter will be applied to this specific action method
}

因此,在单独的类中实现的MyFilter()可以实现更好的代码组成和测试。

更新:
Revel(用于Go的Web框架)提供了与Interceptors类似的功能(由动作调用之前或之后由框架调用的功能):https
:
//revel.github.io/manual/interceptors.html


阅读 278

收藏
2020-07-02

共1个答案

小编典典

这种事情通常是用Go中的 中间件 完成的。最简单的例子是:

package main

import (
    "fmt"
    "html"
    "log"
    "net/http"
)

func main() {
    http.HandleFunc("/", handler)
    http.HandleFunc("/foo", middleware(handler))

    log.Fatal(http.ListenAndServe(":8080", nil))
}

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path))
}

func middleware(next http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        r.URL.Path = "/MODIFIED"

        // Run the next handler
        next.ServeHTTP(w, r)
    }
}

如您所见,中间件是具有以下功能的函数:

  1. 接受一个http.HandlerFunc参数
  2. 返回一个http.HandlerFunc;
  3. 调用http.handlerFunc传入的。

通过这种基本技术,您可以根据需要“链接”许多中间件:

http.HandleFunc("/foo", another(middleware(handler)))

这种模式有一些变体,大多数Go框架使用的语法略有不同,但是概念通常是相同的。

2020-07-02