最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

go-zero讀取請求體出現(xiàn)EOF錯誤的解決方法

 更新時間:2025年02月05日 08:32:54   作者:PandaMiner  
這篇文章主要為大家詳細(xì)介紹了go-zero讀取請求體出現(xiàn)EOF錯誤時如何解決,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

前言

最近自己在搭 go-zero 的腳手架,遇到一個問題,原先的一個 post 請求是執(zhí)行成功,當(dāng)我添加了一個過濾器之后執(zhí)行該請求就會報(bào)錯請求體讀取 EOF 錯誤,我感到有點(diǎn)奇怪,為什么過濾器中的邏輯會影響到后續(xù)的請求呢?在此記錄下這次的坑。

問題分析

先上結(jié)論,這是由于 go 中 http.Request.Body 請求體是一個流,它只能被讀取一次,假如你在過濾器已經(jīng)進(jìn)行過流的讀取,那么在后續(xù)的請求中就讀取不到了。

示例的請求邏輯是這樣,當(dāng)請求到達(dá)后臺時,先經(jīng)過過濾器檢查請求頭中是否攜帶 token,否則則請求失敗,成功則繼續(xù) post 請求邏輯,本次的 post 請求和過濾器只是做示例使用,邏輯很簡單,過濾器中的邏輯就是去獲取請求 header 中 token 字段,如果這個字段為空,則請求失敗,代碼示例如下:

func tokenFilter(next http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
       type Request struct {
          Token string `header:"token"`
       }
       var req Request
       err := httpx.Parse(r, &req)
       if err != nil || req.Token == "" {
          resp, _ := utils.ToJsonString(models.ErrorResponseWithCode(http.StatusUnauthorized, "token required"))
          routers.HttpError(w, http.StatusUnauthorized, resp)
          return
       }
       next(w, r)
    }
}

按照官方文檔推薦,在過濾器我使用了 httpx.Parse(r, &req) 獲取請求體數(shù)據(jù),導(dǎo)致后續(xù) post 請求邏輯讀取請求體失敗,也就是說,這個方法中會消耗掉請求體流的數(shù)據(jù),查看源碼可以發(fā)現(xiàn),這個方法是會讀取請求中的 path,form,header,body 數(shù)據(jù),賦值到我們的 struct 中:

func Parse(r *http.Request, v any) error {
    kind := mapping.Deref(reflect.TypeOf(v)).Kind()
    if kind != reflect.Array && kind != reflect.Slice {
       if err := ParsePath(r, v); err != nil {
          return err
       }

       if err := ParseForm(r, v); err != nil {
          return err
       }

       if err := ParseHeaders(r, v); err != nil {
          return err
       }
    }

    if err := ParseJsonBody(r, v); err != nil {
       return err
    }

    if valid, ok := v.(validation.Validator); ok {
       return valid.Validate()
    } else if val := validator.Load(); val != nil {
       return val.(Validator).Validate(r, v)
    }

    return nil
}

繼續(xù)往下查看源碼可以發(fā)現(xiàn),其中的 ParseForm 方法和 ParseJsonBody 方法就會消耗掉請求體流的數(shù)據(jù),ParsePath 方法 ParseHeaders 方法則不會,而在這個過濾器中,我們只需要獲取 header 的數(shù)據(jù),body 的數(shù)據(jù)需要由后續(xù)邏輯獲取,所以在這里需要修改過濾只獲取 header 數(shù)據(jù)的方法,如果需要的是 path 數(shù)據(jù)也是同樣的道理,修改后的過濾器:

func tokenFilter(next http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
       type Request struct {
          Token string `header:"token"`
       }
       var req Request
       err := httpx.ParseHeaders(r, &req)
       if err != nil || req.Token == "" {
          resp, _ := utils.ToJsonString(models.ErrorResponseWithCode(http.StatusUnauthorized, "token required"))
          routers.HttpError(w, http.StatusUnauthorized, resp)
          return
       }
       next(w, r)
    }
}

修改后后續(xù)節(jié)點(diǎn)即可正常獲取請求體數(shù)據(jù)。

完整示例代碼請參考:igolang

到此這篇關(guān)于go-zero讀取請求體出現(xiàn)EOF錯誤的解決方法的文章就介紹到這了,更多相關(guān)解決go-zero讀取請求體出現(xiàn)EOF錯誤內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • go帶緩沖chan實(shí)現(xiàn)消息隊(duì)列功能

    go帶緩沖chan實(shí)現(xiàn)消息隊(duì)列功能

    本文主要介紹了go帶緩沖chan實(shí)現(xiàn)消息隊(duì)列功能,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Golang繪制數(shù)列趨勢圖的操作步驟

    Golang繪制數(shù)列趨勢圖的操作步驟

    數(shù)列趨勢圖是用來表示數(shù)列中各項(xiàng)之間的變化趨勢的圖形,它可以幫助我們觀察和分析數(shù)列的規(guī)律和特點(diǎn),一般來說,數(shù)列趨勢圖可以分為兩種類型:折線圖和散點(diǎn)圖,本文給大家介紹了Golang繪制數(shù)列趨勢圖的操作步驟,文中有詳細(xì)的代碼示例,需要的朋友可以參考下
    2024-04-04
  • Go語言中init函數(shù)與匿名函數(shù)使用淺析

    Go語言中init函數(shù)與匿名函數(shù)使用淺析

    這篇文章主要介紹了Go語言中init函數(shù)與匿名函數(shù)使用淺析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-01-01
  • 從淺入深帶你掌握Golang數(shù)據(jù)結(jié)構(gòu)map

    從淺入深帶你掌握Golang數(shù)據(jù)結(jié)構(gòu)map

    在?Go?語言中,map?是一種非常常見的數(shù)據(jù)類型,它可以用于快速地檢索數(shù)據(jù)。本篇文章將介紹?Go?語言中的?map,包括?map?的定義、初始化、操作和優(yōu)化,需要的可以參考一下
    2023-04-04
  • Go 實(shí)現(xiàn)熱重啟的詳細(xì)介紹

    Go 實(shí)現(xiàn)熱重啟的詳細(xì)介紹

    這篇文章主要介紹了Go 實(shí)現(xiàn)熱重啟的詳細(xì)介紹,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Go語言中協(xié)程泄漏的問題排查與實(shí)戰(zhàn)指南

    Go語言中協(xié)程泄漏的問題排查與實(shí)戰(zhàn)指南

    這篇文章主要為大家詳細(xì)介紹了Go語言中協(xié)程泄漏的4?種常見泄漏模式的可運(yùn)行代碼以及修復(fù)方案,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下
    2026-04-04
  • 詳解Golang中單元測試的使用

    詳解Golang中單元測試的使用

    單元測試是檢測你寫的一個函數(shù)是否具備安全性的一次檢測,這篇文章主要為大家詳細(xì)介紹了Golang中單元測試的具體使用,希望對大家有所幫助
    2023-07-07
  • go mod 使用私有g(shù)itlab群組的解決方案

    go mod 使用私有g(shù)itlab群組的解決方案

    這篇文章主要介紹了go mod 使用私有g(shù)itlab群組的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • GO語言運(yùn)行環(huán)境下載、安裝、配置圖文教程

    GO語言運(yùn)行環(huán)境下載、安裝、配置圖文教程

    這篇文章主要介紹了GO語言運(yùn)行環(huán)境下載、安裝、配置圖文教程,需要的朋友可以參考下
    2017-02-02
  • Go中g(shù)in框架的*gin.Context參數(shù)常見實(shí)用方法

    Go中g(shù)in框架的*gin.Context參數(shù)常見實(shí)用方法

    *gin.Context是處理HTTP請求的核心,ctx代表"context"(上下文),它包含了處理請求所需的所有信息和方法,例如請求數(shù)據(jù)、響應(yīng)構(gòu)建器、路由參數(shù)等,這篇文章主要介紹了Go中g(shù)in框架的*gin.Context參數(shù)常見實(shí)用方法,需要的朋友可以參考下
    2024-07-07

最新評論

萝北县| 华池县| 铁岭县| 喀什市| 宜城市| 昌江| 东明县| 鄯善县| 泰来县| 广东省| 莱阳市| 句容市| 营山县| 湘西| 土默特右旗| 西乡县| 武川县| 建阳市| 南澳县| 江阴市| 长泰县| 固始县| 济源市| 图木舒克市| 牡丹江市| 双辽市| 青州市| 喀喇| 长治市| 双牌县| 河池市| 太康县| 台东县| 宁蒗| 鹤峰县| 南阳市| 铜鼓县| 奎屯市| 曲松县| 邵阳县| 大连市|