【问题标题】:Is there a built-in way to respond with a HTTP message 200 and empty body?是否有内置的方式来响应 HTTP 消息 200 和空正文?
【发布时间】:2021-12-14 12:29:16
【问题描述】:

我需要一个“检查”HTTP 端点,它只会回复 200 代码和空正文。我的解决方案需要一个单独的函数:

package main

import (
    "net/http"

    "github.com/gorilla/mux"
    "github.com/rs/zerolog/log"
)

func main() {
    r := mux.NewRouter()
    r.Use(mux.CORSMethodMiddleware(r))
    r.HandleFunc("/check", send200).Methods(http.MethodGet)
    err := http.ListenAndServe("0.0.0.0:9991", r)
    if err != nil {
        log.Panic().Msgf("cannot start web server: %v", err)
    }
}

func send200(w http.ResponseWriter, r *http.Request) {
    w.WriteHeader(http.StatusOK)
    _, err := w.Write([]byte{})
    if err != nil {
        log.Error().Msgf("cannot send 200 answer → %v", err)
    }
}

它按预期工作:

curl -v http://localhost:9991/check
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 9991 (#0)
> GET /check HTTP/1.1
> Host: localhost:9991
> User-Agent: curl/7.55.1
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Fri, 29 Oct 2021 12:11:06 GMT
< Content-Length: 0

有没有一种更简单、可能更 Golangic 的方式来直接在路由代码处将/check 作为单线处理?

【问题讨论】:

  • 当然,跳过WriteWriteHeader 将发送 200 响应。

标签: http go


【解决方案1】:

Go 不提供以 200 状态和空响应正文进行响应的处理程序,但是当处理程序不调用任何 response writer 方法时会发生这种情况。

如果处理程序没有调用WriteHeader,则服务器会以 200 状态码进行响应。显式调用 WriteHeader 主要用于发送错误代码。

响应正文是响应的处理程序writes。如果处理程序不写入响应,则响应为空。

使用空函数发送带有空正文的 200 响应:

send200 := func(http.ResponseWriter, *http.Request) {}
r.HandleFunc("/check", send200).Methods(http.MethodGet)

【讨论】:

    【解决方案2】:

    使用空处理程序(主体为空的处理程序函数:{})。如果你什么都不写给响应作者并且没有设置状态码,默认会返回 HTTP 200 OK。

    你也可以使用匿名函数(函数字面量):

    r.HandleFunc("/check", func(http.ResponseWriter, *http.Request){}).
        Methods(http.MethodGet)
    

    【讨论】:

    • 比你。您答案的第二部分很清楚,但我对第一部分感到困惑:在这种情况下什么是空处理程序?
    • @WoJ 答案显示了一个带有 empty 主体的匿名函数文字,即{}。你也可以把你的命名函数写成func send200(http.ResponseWriter, *http.Request) {},然后像原来一样注册它,你会得到同样的结果。
    • @mkopriva:嗯,好的,清楚。我认为这是一个特定的处理程序,由 Go 提供,并且恰好是空的。感谢您的澄清。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    • 2021-04-06
    • 2016-05-03
    • 1970-01-01
    • 2020-11-29
    • 1970-01-01
    相关资源
    最近更新 更多