0

由于我们希望使用的 openapi 包(opai-codegen),我想转移到我的 API 的 echo 框架但是我们当前的 API 是通过 gorilla mux 构建的。由于当前代码库的大小,我们需要同时运行它们。

所以我想弄清楚如何让 gorilla mux 和 echo 框架通过相同的方式一起工作http.Server

gorilla mux API 是通过以下方式创建的:

router := mux.NewRouter().StrictSlash(true)
router.Handle("/..",...)
//etc ...

然后我的 echo API 是通过以下方式创建的:

echo := echo.New()
echo.Get("/..", ...)
// etc ...

但是我不能让他们以同样的方式运行http.ListenAndServe

很想知道是否有任何东西可以让这两者一起工作?

谢谢

4

1 回答 1

1

这是我能想到的,虽然你需要移动中间件来回显

package main

import (
    "fmt"
    "net/http"

    "github.com/gorilla/mux"
    "github.com/labstack/echo/v4"
    "github.com/labstack/echo/v4/middleware"
)

func main() {
    // Echo instance
    e := echo.New()

    // Middleware
    e.Use(middleware.Logger())
    e.Use(middleware.Recover())

    r := mux.NewRouter()
    r.HandleFunc("/mux/", Hello).Methods("GET", "PUT").Name("mux")
    r.HandleFunc("/muxp/", HelloP).Methods("POST").Name("muxp")

    gorillaRouteNames := map[string]string{
        "mux":  "/mux/",
        "muxp": "/muxp/",
    }

    // Routes
    e.GET("/", hello)
    // ro := e.Any("/mux", ehandler)

    for name, url := range gorillaRouteNames {
        route := r.GetRoute(name)
        methods, _ := route.GetMethods()
        e.Match(methods, url, echo.WrapHandler(route.GetHandler()))
        fmt.Println(route.GetName())
    }

    // Start server
    e.Logger.Fatal(e.Start(":1323"))
}

// Handler
func hello(c echo.Context) error {
    return c.String(http.StatusOK, "Hello, World!")
}

func Hello(w http.ResponseWriter, req *http.Request) {
    fmt.Fprintln(w, "Hello world!")
}

func HelloP(w http.ResponseWriter, req *http.Request) {
    fmt.Fprintln(w, "Hello world By Post!")
}
于 2020-09-11T05:49:38.410 回答