gpt4 book ai didi

go - 覆盖 ResponseWriter 接口(interface)以捕获 HTTP 错误

转载 作者:IT王子 更新时间:2023-10-29 01:02:19 27 4
gpt4 key购买 nike

我正在用 Go 编写 Web 应用程序,虽然各种 mux 库提供了一种设置自定义 404 错误处理程序的方法,但没有其他 4xx 和 5xx 错误代码。

一个建议是覆盖 ResponseWriter 接口(interface)中的 WriteHeader 方法并检查状态代码,但我对实际如何编写感到困惑(在输出之前覆盖 ResponseWriter 方法)。一个可能的例子可以从 negroni package 中找到。 .

这是为 4xx 和 5xx 错误提供自定义模板的正确方法吗?谁能举例说明如何实现?

更新

非常感谢 David 和 elithrar 的回复和代码。 David 编码的 Interceptor 结构可用于服务器 mux 的包装器,如 elithrar 在评论中所示。对于那些寻求进一步解释为什么以及如何工作的人,this section from astaxie's book提供了一些关于 net/http 包工作的非常好的信息,以及查看 server.go source code来自 net/http 包。

最佳答案

mux 库只有一种方法可以设置未找到的处理程序,作为一种方法来拦截 mux 无法将 URL 解析为已知映射的请求。

例如,你这样做:

mux.Handle("/foo",fooFunc)
mux.Handle("/bar",barFunc)

但是客户端访问/baz,mux 没有映射。

他们实际上并没有拦截发送给客户端的 404,他们只是在遇到这个问题时调用未找到的处理程序。

此外,如果您的/foo 处理程序发送 404 响应,则不会调用未找到。

如果您想要为来自映射 URL 的各种返回响应自定义页面,只需让各种处理程序编写正确的响应即可。

如果您不控制该逻辑(即:框架正在编写一些东西并且无法覆盖),那么您可能想要拦截所有请求并使用响应代码检测逻辑覆盖 http.ResposeWriter。

这是一个示例拦截器,基本上可以满足您的需求。在 Play

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()
}

关于go - 覆盖 ResponseWriter 接口(interface)以捕获 HTTP 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35528330/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com