我有单独的文件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
}我想在此主文件之外移动所有"/ signup"和"/ signin"路由和处理程序.然后以某种方式将它们传递回NewRouter函数.你可以给我一本书或一些在线的例子.
这是我的代码,关于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)
}
但我没有找到如何做自定义404页面的方法,我想做一个自定义404.
但我不能制作一个r.HandleFunc("/",...),但它太贪心了.
如果有人有任何想法.
我已经看到使用以下代码从请求路径中提取 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)
})
然后他们将是另一条路线/user(注意缺少尾部斜线)。
handler.HandleFunc('/user', handleUser)
让我们说例如r.URL.Path是/user/name。第一条路线将匹配,而第二条较短的路径将不匹配。从技术上讲,请求路径不应该匹配任何路由,因为一个路由太长而另一个太短。
这就提出了一个问题,即 Golangmux在将请求与路由匹配时遵循什么规则。乍一看似乎它采用了路径的最长匹配,但是如果在程序源中首先定义了最短路径呢?
有人可以就ServerMux行为方式给出简单的解释。
在进行某种类型的验证之前,我必须检查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
    }
}
我正在构建一个React.js应用程序,该应用程序将与我在Go中构建的REST API进行交互。
React将使用Javascript Fetch API将请求发送到我的API。
问题是我想保护我的API免受其他地方的要求。没有人应该可以直接通过URL或任何其他客户端(如Postman)直接访问我的API。
我知道JWT是什么,但这不能解决我的问题,因为任何人都可以通过浏览器访问令牌,然后继续使用令牌在React客户端之外请求API。
我已经进行了广泛的研究,但没有任何内容真正符合我的描述。
非常感谢您的帮助。
我的简单文件服务器代码:
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)
    }
}
我的目录结构是:
cmd/server/main.go
web/index.html
web/favicon.ico
web/favicon.png
web/css/main.css
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
我可以看到index.html页面,但没有 CSS。当我请求任何其他文件(例如favicon.ico …
我正在尝试访问控制器main.go但是我收到以下错误:
./main.go:34:28: cannot refer to unexported name controllers.getUserDetails
./main.go:34:28: undefined: controllers.getUserDetails
这是我的一小段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"))
 }
我的controller.go档案
package controllers
import (
  "net/http" …