标签: gorilla

在 Go 中注册到中心对象的路由

我正在使用 Mux 开发一个简单的 Go REST API。我发现的大多数教程都建议按如下方式创建路由器:

  • 一个routes.go包含所有路线和所有的路由处理程序的全局数组文件。
  • 一个router.go创建路由器对象并循环遍历全局数组并将所有内容注册到路由器的文件。

我宁愿使用不同的模型:

  • 一个router.go文件实例化一个路由器对象并具有一个RegisterRoute功能
  • 每个文件,代表 API 的不同对象或组件,可以调用RegisterRoute和添加额外的路由到路由器。

我不知道如何做到这一点,因为它似乎需要为每个文件创建一个初始化函数并从中调用它main()(这违背了目的)。有没有可以接受的方法来做到这一点?

rest go gorilla

1
推荐指数
1
解决办法
956
查看次数

当我的通配符参数中有双斜杠时,为什么 Gorilla mux 会重定向?

这是我的处理程序:

router.HandleFunc("/g/{gparam:.*}", MyHandler)
Run Code Online (Sandbox Code Playgroud)

但是当我传递类似“123://abc”之类的东西作为参数时,它会重定向并将url中的参数修改为“123:/abc”。

他们是一种避免这种情况的方法吗?

slash named-parameters go gorilla

1
推荐指数
1
解决办法
860
查看次数

在 Gorilla Mux 中配置 CORS:POST 请求出现 403 错误

我有一个 API,目前正在尝试使用其端点之一。端点用于 POST 请求,端点按预期工作。API 在云中运行,我对其进行了测试,curl结果非常完美,然后我试图从我的 React 应用程序中使用它,但我得到了403 status code.

在浏览器的控制台中观看时,我看到我在 OPTIONS 请求中收到该错误,并且 POST 从未完成。这是控制台中显示的结果的屏幕截图:

在此处输入图片说明

然后,我用一个表单制作了一个简单的 HTML 文件,在那里我放置了所需的输入,以及指向这个端点的动作,它工作得很好。然后,我不知道错误在哪里?我在 API 中启用了 CORS

在 API 中,我使用 Gorilla/mux,我有这样的东西:

// Set up a router and some routes
    r := mux.NewRouter()
    r.HandleFunc("/", handleHome)
    //some other routes

    headersOk := handlers.AllowedHeaders([]string{"*"})
    originsOk := handlers.AllowedOrigins([]string{"*"})
    methodsOk := handlers.AllowedMethods([]string{"GET", "HEAD", "POST", "PUT", "OPTIONS"})

    // Start http server
    port := fmt.Sprintf(":%d", SomePort)
    http.ListenAndServe(port, handlers.CORS(originsOk, headersOk, methodsOk)(r))
Run Code Online (Sandbox Code Playgroud)

使用:

"github.com/gorilla/mux"
"github.com/gorilla/handlers"
Run Code Online (Sandbox Code Playgroud)

我在浏览器中收到的消息是(西班牙语):

Solicitud desde otro origen bloqueada:la politica de …

post http-post go reactjs gorilla

1
推荐指数
1
解决办法
4182
查看次数

如何在相同包的2个单独文件中拆分GO Gorilla Mux路由

我有单独的文件routes.go(包路由),我存储我的所有路由和处理程序.但我想将此文件拆分为2个文件.我想将我的routes.go重命名为main.go并创建新的附加文件moduleX.go(包路由).我怎样才能做到这一点?我想将所有路由存储在相同"包路由"的多个文件中.

package routes

import (
	"github.com/gorilla/mux"
	"net/http"
	"github.com/---/001/models"
	"github.com/---/001/sessions"
	"github.com/---/001/utils"
	"github.com/---/001/middleware"
)

func NewRouter() *mux.Router {
	r := mux.NewRouter()
	r.HandleFunc("/", middleware.AuthRequired(indexGetHandler)).Methods("GET")
	r.HandleFunc("/", middleware.AuthRequired(indexPostHandler)).Methods("POST")
	r.HandleFunc("/signup", signupGetHandler).Methods("GET")
	r.HandleFunc("/signup", signupPostHandler).Methods("POST")
	r.HandleFunc("/signin", signinGetHandler).Methods("GET")
	r.HandleFunc("/signin", signinPostHandler).Methods("POST")
	r.HandleFunc("/signout", signoutGetHandler).Methods("GET")
	r.HandleFunc("/services", middleware.AuthRequired(servicesHandler)).Methods("GET")
	fs := http.FileServer(http.Dir("./static/"))
	r.PathPrefix("/static/").Handler(http.StripPrefix("/static/", fs))
	return r
}
Run Code Online (Sandbox Code Playgroud)

我想在此主文件之外移动所有"/ signup"和"/ signin"路由和处理程序.然后以某种方式将它们传递回NewRouter函数.你可以给我一本书或一些在线的例子.

routes go mux gorilla

1
推荐指数
1
解决办法
2037
查看次数

Go Gorilla mux subrouter with static files

问题

您好,我想创建一个使用路由器和子路由器显示 2 个页面和 2 个静态目录的 Web 服务器。

我不明白为什么在子路由器处理的静态服务器不工作时显示路由器提供的静态目录。

代码、文件系统方案和网页:显示和想要的如下所示。

文件系统方案

ProjectFolder/
    testFile
    test.go
Run Code Online (Sandbox Code Playgroud)

代码

package main

import (
    "github.com/gorilla/mux"
    "net/http"
)

func index(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("Index"));
}

func main () {
    r := mux.NewRouter()
    sub := r.PathPrefix("/sub").Subrouter()
    r.HandleFunc("/", index)
    r.Handle("/static", http.StripPrefix("/static", http.FileServer(http.Dir("./"))))
    sub.Handle("/static", http.StripPrefix("/static", http.FileServer(http.Dir("./"))))
    sub.HandleFunc("/", index)

    http.ListenAndServe(":8080", r)
}
Run Code Online (Sandbox Code Playgroud)

我想要在 Web 服务器中的页面

http://localhost:8080/ ----> (index)
http://localhost:8080/static ---> (presentation of the file systemfolder)
http://localhost:8080/sub/ ---> (index)
http://localhost:8080/sub/static ---> (presentation of the file system folder)
Run Code Online (Sandbox Code Playgroud)

我在 Web 服务器中的页面 …

http go gorilla

1
推荐指数
1
解决办法
1198
查看次数

Go 的会话中间件?

func indexHandler(w http.ResponseWriter, req *http.Request) {
    session, err := store.Get(req, sessionName)
    if err != nil {
        log.WithError(err).Error("bad session")
        http.SetCookie(w, &http.Cookie{Name: sessionName, MaxAge: -1, Path: "/"})
    }
    err = views.ExecuteTemplate(w, "index.html", session.Values)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
}
Run Code Online (Sandbox Code Playgroud)

我所有的处理程序都使用Gorilla 会话。如何避免store.Get在我的每个处理程序中调用会话,即代码重复?

另一个问题是,是否有更好的方法来为模板提供会话值,而不是一种明确的方式,例如:

err = views.ExecuteTemplate(w, "index.html",
    struct {
        Session map[interface{}]interface{},
        ...other handler specific data for the template
    }{
        session.Values,
        ...
    })
Run Code Online (Sandbox Code Playgroud)

代码示例源自https://github.com/kaihendry/internal-google-login

session go gorilla

1
推荐指数
1
解决办法
1228
查看次数

为什么我将 DELETE 路由器放在 GET 之后,DELETE 端点没有被触发

我正在使用 Golang 创建 Restful API,并按索引将删除路由器放在 getOne 路由器之后,并且删除路由器从未被触发?我不知道为什么?当我反转它们时,它起作用了!有人可以知道原因吗??

这是为了使用 Golang 构建 Restful API。

不起作用:

myRouter.HandleFunc("/article", createNewArticle).Methods("POST")

myRouter.HandleFunc("/article/{id}", getOneArticle)

myRouter.HandleFunc("/article/{id}", deleteArticle).Methods("DELETE")
Run Code Online (Sandbox Code Playgroud)

作品!

myRouter.HandleFunc("/article", createNewArticle).Methods("POST")
myRouter.HandleFunc("/article/{id}", deleteArticle).Methods("DELETE")
myRouter.HandleFunc("/article/{id}", getOneArticle)
Run Code Online (Sandbox Code Playgroud)

当我使用具有 DELETE 方法的 postman 测试 api 时,它总是触发 getOneArticle 并响应删除项,但实际上并未在数据库中删除!

go gorilla

1
推荐指数
1
解决办法
761
查看次数

为什么 http.HandlerFunc 总是返回相同的随机数

来自新手地鼠的问候!

我有以下多路复用路由器设置:

s.router.HandleFunc("/test", s.TestHandler())

s.TestHandler:

func (s *server) TestHandler() http.HandlerFunc {
    rnd := rand.Intn(100)
    response := struct {
        RND int `json:"rnd"`
    }{
        rnd,
    }
    return func(w http.ResponseWriter, r *http.Request) {
        s.respond(w, r, 200, response)
        return
    }
}
Run Code Online (Sandbox Code Playgroud)

辅助方法 s.respond:

func (s *server) respond(w http.ResponseWriter, r *http.Request, code int, data interface{}) {
    w.WriteHeader(code)
    if data != nil {
        json.NewEncoder(w).Encode(data)
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是当我发出 GET /test 时,除非重新启动应用程序,否则我会看到相同的数字。

我确定我做错了什么,如果有人指出我的错,我将不胜感激。

go gorilla

1
推荐指数
1
解决办法
54
查看次数

是否不可能在带有 Gorilla Mux 的路径中间添加路径参数?

我有以下创建端点的 API 服务器片段,我想将“clusterID”抽象为处理程序中的路径参数。这是路由器部分

func main() {
    router := mux.NewRouter().StrictSlash(true)
    sub := router.PathPrefix("/api/v1").Subrouter()
    sub.Methods("GET").Path("/device/{clusterID}/job").HandlerFunc(authDev(getJob))
    ... 
Run Code Online (Sandbox Code Playgroud)

下面是处理程序的片段。我像往常一样使用mux.Vars(). 如果我向 发送请求localshost/api/v1/device/cluster123/job,处理程序将按预期被调用,但mux.Vars(r)返回一个空映射,而不是按预期返回带有 的映射clusterID=cluster123。Mux 不支持路径中间的变量吗?我知道我可以手动解析路径,但我希望 Mux 为我做这件事。

func getJob(w http.ResponseWriter, r *http.Request) {
    params := mux.Vars(r)
    log.Println(params["clusterID"]) // outputs an empty string
    log.Println(params) // outputs an empty map
    ...
Run Code Online (Sandbox Code Playgroud)

go mux gorilla

1
推荐指数
1
解决办法
6573
查看次数

使用golang和mux制作自定义404

这是我的代码,关于golang和mux的一个小例子webserver:

package main

import (
"fmt"
"net/http"
    "github.com/gorilla/mux"
)

func handler(w http.ResponseWriter, r *http.Request) {
    vars := mux.Vars(r)
fmt.Fprintf(w, "Hi there, I love %s!", vars["username"])
}

func homeHandler(w http.ResponseWriter, r *http.Request) {
    if r.URL.Path != "/" {
        errorHandler(w, r, http.StatusNotFound)
        return
    }
    vars := mux.Vars(r)
    fmt.Fprintf(w, "Hi there, I love %s!", vars["username"])
}

func main() {
    r := mux.NewRouter()
    r.HandleFunc("/help/{username}/", handler)
    http.Handle("/", r)
    http.ListenAndServe(":8080", nil)
}
Run Code Online (Sandbox Code Playgroud)

但我没有找到如何做自定义404页面的方法,我想做一个自定义404.

但我不能制作一个r.HandleFunc("/",...),但它太贪心了.

如果有人有任何想法.

go mux gorilla

0
推荐指数
2
解决办法
3309
查看次数

标签 统计

go ×10

gorilla ×10

mux ×3

http ×1

http-post ×1

named-parameters ×1

post ×1

reactjs ×1

rest ×1

routes ×1

session ×1

slash ×1