मुझे पता है कि http.ResponseWriter की WriteHeader विधि केवल प्रति HTTP प्रतिक्रिया में एक बार कॉल किया जाता है, केवल एक प्रतिक्रिया स्थिति कोड हो सकता है और केवल एक बार शीर्षलेख भेज सकता है। यह सब बिलकुल ठीक है।

प्रश्न यह है कि, 201 को ओवरराइड करने और http.ResponseWriter.Write त्रुटि लौटाने पर 500 को वापस करने के लिए मुझे अपने कोड को कैसे पुन: सक्रिय करना चाहिए? जैसा कि आप नीचे देख सकते हैं, मैं यह देखने के लिए घबराता हूं कि कैसे httprouter.Router. PanicHandler इसे संभालता है। जैसा कि अपेक्षित था, लॉग दिखाते हैं http: superfluous response.WriteHeader call from ... और प्रतिक्रिया 201 है क्योंकि ऊपर बताए अनुसार बहुत देर हो चुकी है।

package server

import (
    "github.com/julienschmidt/httprouter"
    "log"
    "net/http"
)

func Serve() {
    rtr := httprouter.New()
    rtr.GET("/", home.Welcome)

    handle500(rtr)

    err := http.ListenAndServe(":8080", rtr)
    if err != nil {
        log.Fatalf("server crash")
    }
}

func handle500(r *httprouter.Router) {
    r.PanicHandler = func(res http.ResponseWriter, req *http.Request, err interface{}) {
        res.WriteHeader(http.StatusInternalServerError)
        // http: superfluous response.WriteHeader call from line above
    }
}
package home

import (
    "github.com/julienschmidt/httprouter"
    "net/http"
)

func Welcome(res http.ResponseWriter, _ *http.Request, _ httprouter.Params) {
    // doing a few bits and building the body

    res.Header().Set("Content-Type", "application/json")
    res.WriteHeader(201)

    _, err := res.Write("body goes here")
    if err == nil {  // I am doing this deliberately to test 500
        panic("assume that something has gone wrong with res.Write and an error occurred")
    }
}
go
5
BentCoder 7 सितंबर 2019, 00:17

1 उत्तर

सबसे बढ़िया उत्तर

स्थिति कोड को "ओवरराइड" करने का कोई तरीका नहीं है क्योंकि यह तुरंत ब्राउज़र पर भेज दिया जाता है।

आप http.ResponseWriter.Write() के रिटर्न वैल्यू की जांच कर रहे हैं। मुझे यकीन नहीं है कि यह एक अच्छी रणनीति है। अगर प्रतिक्रिया लिखना विफल हो गया तो संभावना है कि अधिक लिखना शायद असफल हो जाएगा।

विफलता को लॉग करना अधिक उपयुक्त लगता है, लेकिन मुझे उम्मीद है कि अधिकांश विफलताओं को कनेक्शन और अन्य त्रुटियों को छोड़ दिया जाएगा जिनके लिए कार्रवाई की आवश्यकता नहीं होगी।

10
Martin Tournoij 6 सितंबर 2019, 21:53