标签: mux

如何在相同包的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
查看次数

使用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
查看次数

默认服务器多路复用器如何匹配 url 模式

我已经看到使用以下代码从请求路径中提取 url 参数的简单路由器实现。

handler := http.NewServerMux()
handler.HandleFunc('/user/', func(w http.ResponseWriter, r *http.Request) {
     name := strings.Replace(r.URL.Path, '/user/', "", 1)// this code

    io.WriteString(w, fmt.Sprintf("Hello %s\n",name)
})
Run Code Online (Sandbox Code Playgroud)

然后他们将是另一条路线/user(注意缺少尾部斜线)。

handler.HandleFunc('/user', handleUser)
Run Code Online (Sandbox Code Playgroud)

让我们说例如r.URL.Path/user/name。第一条路线将匹配,而第二条较短的路径将不匹配。从技术上讲,请求路径不应该匹配任何路由,因为一个路由太长而另一个太短。

这就提出了一个问题,即 Golangmux在将请求与路由匹配时遵循什么规则。乍一看似乎它采用了路径的最长匹配,但是如果在程序源中首先定义了最短路径呢?

有人可以就ServerMux行为方式给出简单的解释。

go mux

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

如何检查URL参数是否存在

在进行某种类型的验证之前,我必须检查URL参数是否存在。我怎样才能做到这一点?

如果参数是空的,例如:http : //myurl.com?myparam=,则myParam ==“”为true,但是,如果URL以这种方式出现,则http://myurl.com(不带参数),则myParam ==“ “也是如此...所以我需要一些方法来验证参数是否出现在网址中

# example
# http://myurl.com?myparam=johndoe

// validate if param exists, here i dont know how to do
#
#


// then do some validation
func validateMyParamIsNotNumber(r *http.Request, resultMessage *string) {
    myParam := r.FormValue("myparam")

    if myParam != ""  && isNotNumber(product) {
        *resultMessage = "The myparam filter must be a number"
        return
    }
}
Run Code Online (Sandbox Code Playgroud)

go mux gorilla

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

REST API仅可通过我的React客户端访问

我正在构建一个React.js应用程序,该应用程序将与我在Go中构建的REST API进行交互。

React将使用Javascript Fetch API将请求发送到我的API。

问题是我想保护我的API免受其他地方的要求。没有人应该可以直接通过URL或任何其他客户端(如Postman)直接访问我的API。

我知道JWT是什么,但这不能解决我的问题,因为任何人都可以通过浏览器访问令牌,然后继续使用令牌在React客户端之外请求API。

我已经进行了广泛的研究,但没有任何内容真正符合我的描述。

非常感谢您的帮助。

security api rest go mux

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

http.FileServer 只提供 index.html

我的简单文件服务器代码:

package main

import (
    "net/http"
    "os"

    "github.com/gorilla/handlers"
    "github.com/gorilla/mux"
)

func main() {
    r := mux.NewRouter()

    // default file handler
    r.Handle("/", http.FileServer(http.Dir("web")))

    // run on port 8080
    if err := http.ListenAndServe(":8080", handlers.LoggingHandler(os.Stdout, r)); err != nil {
        panic(err)
    }
}
Run Code Online (Sandbox Code Playgroud)

我的目录结构是:

cmd/server/main.go
web/index.html
web/favicon.ico
web/favicon.png
web/css/main.css
Run Code Online (Sandbox Code Playgroud)

index.html要求main.css. 所以当我运行时,go run cmd/server/main.go我得到以下输出:

127.0.0.1 - - [24/Dec/2019:22:45:26 -0X00] "GET / HTTP/1.1" 304 0
127.0.0.1 - - [24/Dec/2019:22:45:26 -0X00] "GET /css/main.css HTTP/1.1" 404 19
Run Code Online (Sandbox Code Playgroud)

我可以看到index.html页面,但没有 CSS。当我请求任何其他文件(例如favicon.ico …

http go mux

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

如何访问GO中的另一个文件

我正在尝试访问控制器main.go但是我收到以下错误:

./main.go:34:28: cannot refer to unexported name controllers.getUserDetails
./main.go:34:28: undefined: controllers.getUserDetails
Run Code Online (Sandbox Code Playgroud)

这是我的一小段main.go,我删除了一些额外的代码

package main

import (
  "net/http"
  "os"
  "log"
  "github.com/urfave/negroni"
  "github.com/gorilla/mux"
  "github.com/joho/godotenv"
  "Go-Social/controllers"
 )

 func main() {
   router := mux.NewRouter()
   UserRouter := router.PathPrefix("/api/user").Subrouter()
   UserRouter.HandleFunc("", controllers.getUserDetails).Methods("GET")

   env := os.Getenv("GO_ENV")
   if "" == env {
    env = "Development"
   }

   // appending middlewares
   server := negroni.Classic()

   // router handler with negroni
   server.UseHandler(router)

   // starting server
   server.Run(":" + os.Getenv(env + "_PORT"))

 }
Run Code Online (Sandbox Code Playgroud)

我的controller.go档案

package controllers

import (
  "net/http" …
Run Code Online (Sandbox Code Playgroud)

go mux

-3
推荐指数
1
解决办法
104
查看次数

标签 统计

go ×7

mux ×7

gorilla ×3

api ×1

http ×1

rest ×1

routes ×1

security ×1