mux 库只有一种设置未找到处理程序的方法,作为一种方法来拦截 mux 无法将 URL 解析为其已知映射的请求。
例如,您这样做:
mux.Handle("/foo",fooFunc)
mux.Handle("/bar",barFunc)
但客户端访问/baz
多路复用器没有映射到该位置。
他们实际上并没有拦截发送给客户端的 404 错误,只是在遇到此问题时调用未找到的处理程序。
另外,如果您的 /foo 处理程序发送 404 响应,则不会调用 not find 。
如果您想要从映射的 URL 获取各种返回响应的自定义页面,只需让各种处理程序编写正确的响应即可。
如果您不控制该逻辑(即:框架正在编写某些内容并且无法覆盖),那么您可能希望拦截所有请求并使用响应代码检测逻辑覆盖 http.ResposeWriter 。
这是一个示例拦截器,基本上可以完成您想要的操作。在Play http://play.golang.org/p/kKmMBDjMq8
package main
import (
"fmt"
"log"
)
import "net/http"
type Interceptor struct {
origWriter http.ResponseWriter
overridden bool
}
func (i *Interceptor) WriteHeader(rc int) {
switch rc {
case 500:
http.Error(i.origWriter, "Custom 500 message / content", 500)
case 404:
http.Error(i.origWriter, "Custom 404 message", 404)
case 403:
i.origWriter.WriteHeader(403)
fmt.Fprintln(i.origWriter, "Custom 403 message")
default:
i.origWriter.WriteHeader(rc)
return
}
// if the default case didn't execute (and return) we must have overridden the output
i.overridden = true
log.Println(i.overridden)
}
func (i *Interceptor) Write(b []byte) (int, error) {
if !i.overridden {
return i.origWriter.Write(b)
}
// Return nothing if we've overriden the response.
return 0, nil
}
func (i *Interceptor) Header() http.Header {
return i.origWriter.Header()
}