当前位置: 首页 > 面试题库 >

覆盖ResponseWriter接口以捕获HTTP错误

许出野
2023-03-14
问题内容

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

一种建议是在ResponseWriter界面中重写WriteHeader方法并检查状态代码,但是我对如何实际写入感到困惑(在输出之前重写ResponseWriter方法)。从negroni包中可以找到一个可能的例子。

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

非常感谢David和elithrar的回复和代码。InterceptorDavid编码的结构可以在服务器多路复用器的包装器中使用,如elithrar在注释中所示。对于那些寻求进一步解释其原因和方式的人,astaxie的书中的这一节提供了有关net /
http包工作原理的一些很好的信息,以及从net /
http包中查看server.go源代码。


问题答案:

Mux库只有一种设置未找到的处理程序的方法,它为您提供了一种在Mux无法将URL解析为其已知映射的情况下拦截请求的方法。

例如,您这样做:

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

但是客户端访问/baz的多路复用器没有映射。

他们实际上并没有截取去往客户端的404,而只是在遇到此问题时调用未找到的处理程序。

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

如果您希望自定义页面用于来自映射URL的各种返回响应,只需使各种处理程序编写正确的响应即可。

如果您不控制该逻辑(即:框架正在写东西并且没有覆盖方法),则您可能希望拦截所有请求并使用响应代码检测逻辑覆盖http.ResposeWriter。

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

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


 类似资料:
  • 我试图在下面的代码中覆盖catch块,但我无法。我知道在读/写文件时需要引起IOException,但我不能这样做。而且,我不能使用PowerMockito来覆盖静态方法,因为我使用的是JUnit5。有人能帮忙吗? 这是我编写的一个测试用例,但它返回了这个错误-org.mockito.exceptions.Misusing.MissingMethodInvocationException:when

  • 在这个特定的示例中,我扩展了

  • 在eclipse中,当为实现接口的类使用@Override注释时,我会遇到编译错误。 JDK合规级别设置为1.7。 我使用的是最新版本的jdk7。 错误:“{类名}类型的方法{方法名}必须覆盖超类方法”

  • 我已经为以下函数编写了Junit测试用例。当检查JACOCO测试覆盖率时。它显示测试用例只覆盖了try块。我是编写测试用例的新手。如何在测试用例中覆盖异常和catch块 这里有一个方法 和测试方法

  • 在junit5和Mockito中如何覆盖返回void的方法的catch块。 下面提到的dump方法返回void并抛出RepositoryException和JSONException。 TidyJosnitemWrite.dump(节点,stringWriter,-1);

  • 问题内容: 我是新手。但是我正在玩REST Api。我无法从json.marshal中获得与json.Encoder相同的行为,我有两个函数 我想使用此功能gzip我的答复: 但是此函数返回以下内容: 这是go函数: 但是当我取消评论时: 它工作正常。 问题答案: 您需要先刷新或关闭gzip编写器,然后再访问基础字节,例如 否则,不会收集gzip编写器中已缓冲但尚未写到最终流中的内容。