亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

修改網址。響應作為函數參數傳遞時的編寫器

修改網址。響應作為函數參數傳遞時的編寫器

Go
www說 2022-10-04 19:25:24
我有一個處理應用程序身份驗證的身份驗證中間件,有幾個檢查案例,每個檢查都有相同的邏輯,以防出現錯誤:res, err := doSomeCheck()if err != nil {    log.Println("Authentication failed: %v", err)    json.NewEncoder(w).Encode(struct {Error string}{Error: "something is broke!"})    w.Header().Set("Content-Type", "application/json")    w.WriteHeader(http.StatusForbidden)    return}我想用一些這樣的函數編寫這個邏輯(每種情況之間的唯一區別是錯誤和客戶端消息):func authError(w http.ResponseWriter, err error, clientMsg string) {    log.Println("Authentication failed: %v", err)    json.NewEncoder(w).Encode(struct {        Error string    }{Error: clientMsg})    w.Header().Set("Content-Type", "application/json")    w.WriteHeader(http.StatusForbidden)    return}但不是指針(我沒有將其作為中間件處理程序的指針獲?。虼宋覠o法從函數中更改它,也不會更改實際響應。我怎樣才能優雅地完成這項工作?wauthError()
查看完整描述

1 回答

?
慕斯王

TA貢獻1864條經驗 獲得超2個贊

w不是指針,但它是接口類型,它將指針包裝在引擎蓋下。因此,您可以按原樣傳遞它,當您調用其方法時,它將反映在調用方中。

只是不要忘記,如果之前有任何東西寫到響應,你不能(再次)寫標題。同樣,如果您向輸出寫入某些內容,則調用方無法將其取回。如果生成響應,則在這種情況下,調用方應返回。authError()authError()

另請注意,必須首先設置標頭,然后調用 ,然后才能寫入響應正文。ResponseWriter.WriteHeader()

如果調用 ,則將寫入響應狀態(如果尚未寫入)(假設 )。ResponseWriter.Write()HTTP 200 OK

引用自回復作家.write()

// If WriteHeader has not yet been called, Write calls

// WriteHeader(http.StatusOK) before writing the data. If the Header

// does not contain a Content-Type line, Write adds a Content-Type set

// to the result of passing the initial 512 bytes of written data to

// DetectContentType. Additionally, if the total size of all written

// data is under a few KB and there are no Flush calls, the

// Content-Length header is added automatically.

Write([]byte) (int, error)

所以你應該是這樣的:authError()


func authError(w http.ResponseWriter, err error, clientMsg string) {

    log.Println("Authentication failed: %v", err)

    w.Header().Set("Content-Type", "application/json")

    w.WriteHeader(http.StatusForbidden)


    err = json.NewEncoder(w).Encode(struct {

        Error string

    }{Error: clientMsg})

    if err != nil {

        log.Println("Failed to write response: %v", err)

    }


    return

}


查看完整回答
反對 回復 2022-10-04
  • 1 回答
  • 0 關注
  • 101 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號