- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
如果我要使用 DefaultServeMux(我通过将 nil
作为第二个参数传递给 ListenAndServe 来指定),那么我可以访问 http.HandleFunc
,您请参阅 Go wiki 中此示例中使用的以下内容:
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:])
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}
在我当前的代码中,我无法使用 DefaultServeMux,即我将自定义处理程序传递给 ListenAndServe
h := &mypackage.Handler{
Database: mydb
}
http.ListenAndServe(":8080", h)
所以我没有得到内置的http.HandleFunc
。但是,我必须使一些授权代码适应我的代码库,它需要像http.HandleFunc
这样的东西.例如,如果我一直在使用 DefaultServeMux,当我点击 "/protected"
路由时,我想转到 Protected
处理程序,但只有在通过h.AuthorizationHandlerFunc
像这样
h.AuthorizationHandlerFunc(Protected)
但是,由于我没有使用 DefaultServeMux,它无法正常工作,即我无法将 Protected
函数(并调用它)传递给 AuthorizationHandlerFunc
.这是下面 AuthorizationHandlerFunc 的实现。您可以在下面看到 Protected
永远不会被调用。
问题:如何在这种情况下实现HandlerFunc
(不使用DefaultServeMux)?
func (h *Handler) AuthorizationHandlerFunc(next http.HandlerFunc) http.Handler{
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request){
h.AuthorizationMiddleWare(w, r, next)
})
}
func (h *Handler) AuthorizationMiddleWare(w http.ResponseWriter, r *http.Request, next http.HandlerFunc){
//other stuff happens
log.Println("this is never getting called")
next(w,r)
}
func (h *Handler)Protected(w http.ResponseWriter, r *http.Request){
log.Println("this is never getting called")
}
更新ServeHTTP 在 mypackage.Handler 上实现。为什么 Protected 函数没有被调用,或者就此而言,AuthorizationMiddleWare 中的相关代码?
最佳答案
将您的授权中间件重新实现为 http.Handler
:
type auth struct {
DB *sql.DB
UnauthorizedHandler http.Handler
}
func NewAuth(db *sql.DB, unauthorized http.Handler) *auth {
return auth{db, unauthorized}
}
func (a *auth) Protected(h http.Handler) http.Handler {
fn := func(w http.ResponseWriter, r *http.Request) {
// Check whether the request is valid
// If it's invalid, call your error func and make sure to *return* early!
if !valid {
a.UnauthorizedHandler.ServeHTTP(w, r)
return
}
// Call the next handler on success
h.ServeHTTP(w, r)
return
}
return http.HandlerFunc(fn)
}
func someHandler(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "Hello!\n")
}
func main() {
auth := NewAuth(db, errorHandler)
r := http.NewServeMux()
// We have a http.Handler implementation that wraps a http.HandlerFunc
// ... so we call r.Handle on our ServeMux and type-cast the wrapped func
r.Handle("/protected", auth.Protected(http.HandlerFunc(someHandler)))
// Just a simple http.HandlerFunc here
r.HandleFunc("/public", someOtherHandler)
log.Fatal(http.ListenAndServe(":8000", r))
}
看看 httpauth lib I wrote对于使用 ServeHTTP
方法的不同示例。上述方法和在您的类型上显式创建 ServeHTTP
方法都是有效的方法。
关于go - 如何在不使用 DefaultServeMux 的情况下实现 HandlerFunc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32330744/
我正在尝试使用 svgo package在 svg 文件上绘制点并使用网络浏览器显示。通过查看 net/http 文档,我不知道如何将参数传递到我的 svgWeb 函数中。 下面的示例在我的网络浏览器
我已经定义了一个CustomHandler(实现ServerHTTP的结构,并且有一个返回错误的HandlerFunc) type CustomHandler struct{ HandlerFun
我正在学习来自 PHP/JS 背景的 Go。我遇到了一个我不太确定发生了什么的例子。怎么样timeHandler接收 http.ResponseWriter 和 http.Request 如果它们没有
给定: package main import ( "github.com/gin-gonic/gin" ) func main() { r := gin.Default()
我正在使用 Go 的内置 http 服务器和 pat响应某些 URL: mux.Get("/products", http.HandlerFunc(index)) func index(w http.
在链接处理程序时,该函数的返回类型为 Handler,但它实际上返回一个 HandlerFunc。这不会引发任何错误。 如何接受 HandlerFunc 代替 Handler,前者是函数类型,后者是接
现在我有这个: type AppError struct{ Status int Message string } func (h NearbyHandler) makeUpdate(v
如果我要使用 DefaultServeMux(我通过将 nil 作为第二个参数传递给 ListenAndServe 来指定),那么我可以访问 http.HandleFunc,您请参阅 Go wiki
下面的功能是如何实现的? func handle(pattern string, handler interface{}) { // ... what goes here? ... h
我正在编写一个服务来学习 Go。我的主要功能可以在下面找到。它首先读取一个 XML 文件并将它们存储在一个 slice 中。我有一个 /rss 端点,它从存储在“数据库”中的项目输出 RSS 提要。这
我将 rest API 定义为 apis.GET(/home, validatationHandler , dashboardHandler) 我想将一些数据从 validatationHan
检查以下代码时,对从函数到接口(interface)的类型转换有疑问。 代码 http_hello.go: package main import ( "fmt" "log"
所以我最近遇到了一些麻烦......这是我的代码: https://gist.github.com/anonymous/af1e6d922ce22597099521a4b2cfa16f 我的问题:我正
这是我的代码 package main import "encoding/json" import "net/http" import "time" import "fmt"
这个问题困扰我好久了。我正在使用 gin-gonic,每次我尝试使用 go run main.go 时,总是会出现此编译错误: cannot use properties.Pong (type fun
我对 this bit of code from the HTTP package 感到困惑: type HandlerFunc func(ResponseWriter, *Request) func
我看到一个 article written by Mat Ryer关于如何使用作为 func(http.ResponseWriter, *http.Request) 包装器类型的服务器类型和 http
我有这个辅助函数,可以正常编译: func Middleware(adapters ...interface{}) http.HandlerFunc { log.Info("length of
我正在寻找编写一小块限速中间件: 允许我为每个远程 IP 设置合理的速率(例如 10 个请求/秒) 可能(但不是必须)允许爆发 丢弃(关闭?)超出速率的连接并返回 HTTP 429 然后我可以将它包裹
我是一名优秀的程序员,十分优秀!