Gin封裝了一些構建回應的方法,比如方法*Context.JSON(code int, obj interface{})和*Context.String(code int, format string, values ... interface{})。這些方法都呼叫了*Context.Render(code int, r render.Render)。
//Render寫出回應頭并呼叫render.Render來渲染資料。
func (c *Context) Render(code int, r render. Render){
c.Status(code)
if !bodyAllowedForStatus(code) {
r.WriteContentType(c.Writer)
c.Writer.WriteHeaderNow()
回傳。
}
if err := r.Render(c.Writer); err != nil {
panic(err)
}
我想知道為什么Render方法會呼叫Status方法,該方法將通過呼叫ResponseWriter.WriterHeader(statusCode int)首先設定HTTP回應代碼。
r.Render(c.Writer)將在回應中寫入對應的Content-Type。顯然,它發生在設定狀態代碼之后(呼叫方法WriterHeader之后)。根據方法ResponseWriter.Header()的注釋,在呼叫WriteHeader(或Write)后改變頭檔案映射沒有任何效果,除非修改的頭檔案是拖車。但是設定Content-Type在Gin中是有效的。
func writeContentType(w http. ResponseWriter, value []string) {
header := w.Header()
if val := header["Content-Type"]; len(val) == 0{
header["Content-Type"] = value
}
}
uj5u.com熱心網友回復:
c.Writer是一個gin.ResponseWriter(可能是具體型別gin.ResponseWriter),而不是http.ResponseWriter。雖然它實作了相同的介面,但它沒有以相同的方式進行。Gin的WriteHeader 不立即發送頭資訊;它只是在寫入器內部存盤了代碼,并且WriteHeaderNow用存盤的代碼從net/http呼叫 "真正 "的WriteHeader。
WriteHeaderNow在沒有主體的情況下被你參考的函式直接呼叫;如果有一個主體,那么WriteHeaderNow在第一次Write到主體時被呼叫。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/313782.html
標籤:
上一篇:如何處理函式之間的介面型別?
