解決Golang中ResponseWriter的一個坑
在使用Context.ResponseWriter中的Set/WriteHeader/Write這三個方法時,使用順序必須如下所示,否則會出現(xiàn)某一設(shè)置不生效的情況。
ctx.ResponseWriter.Header().Set("Content-type", "application/text") ctx.ResponseWriter.WriteHeader(403) ctx.ResponseWriter.Write([]byte(resp))
如1:
ctx.ResponseWriter.Header().Set("Content-type", "application/text") ctx.ResponseWriter.Write([]byte(resp)) ctx.ResponseWriter.WriteHeader(403)
會導(dǎo)致返回碼一直是200
補充:Go里w http.ResponseWriter,調(diào)用w.Write()方法報錯
Go里w http.ResponseWriter寫入報錯
http: request method or response status code does not allow
1. 下面是報錯截圖
2. 點進去Write方法
它首先是一個接口;
由于它是在HTTP web服務(wù)器的應(yīng)用場景,所以它具體的實現(xiàn)方法在net/http/server.go里:
func (w *response) Write(data []byte) (n int, err error) { return w.write(len(data), data, "") }
再點進去,函數(shù)里你會發(fā)現(xiàn)有一個關(guān)鍵的判斷
// 其中ErrBodyNotAllowed的 // 代碼內(nèi)容 // ErrBodyNotAllowed = errors.New("http: request method or response status code does not allow body") if !w.bodyAllowed() { return 0, ErrBodyNotAllowed }
點進去,發(fā)現(xiàn)它在沒有設(shè)置Header時會panic,當然這跟我們當前要討論的問題關(guān)系不大,關(guān)鍵在bodyAllowedForStatus()方法
func (w *response) bodyAllowed() bool { if !w.wroteHeader { panic("") } return bodyAllowedForStatus(w.status) }
再點,終于看到了,當設(shè)置狀態(tài)碼為【100,199】、204、304就會報這個錯,而我剛好設(shè)置的狀態(tài)碼就是204,我把它改成200重新試下,問題解決。
func bodyAllowedForStatus(status int) bool { switch { case status >= 100 && status <= 199: return false case status == 204: return false case status == 304: return false } return true }
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
Go框架三件套Gorm?Kitex?Hertz基本用法與常見API講解
這篇文章主要為大家介紹了Go框架三件套Gorm?Kitex?Hertz的基本用法與常見API講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪<BR>2023-02-02