精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

兩種方法實現 Http Request Body 多次讀取

開發 前端
在 gin 中, 在讀取了 request body 后, 通過 c.Set(BodyBytesKey, body) 放到了 gin.Context 中的 Keys。這是一個 map, 上面說到了。

大家好, 我是 老麥, 一個運維老兵, 現在專注于 Golang,DevOps,云原生基礎設施建設。

原文鏈接: https://typonotes.com/posts/2024/01/02/http-request-multiple-times-read/

最近在使用 gin 的時候, 踩了一個重復讀取的 Request.Body 的坑。

起因是 gin 的 gin.Context{} 提供了 c.Copy() 方法創建副本。這個方法一直在用, 但不知道從什么時候開始, 一直認為這個方法是 深拷貝, 但 并不完全是 (T_T)

// Copy returns a copy of the current context that can be safely used outside the request's scope.
// This has to be used when the context has to be passed to a goroutine.
func (c *Context) Copy() *Context {
 cp := Context{
  writermem: c.writermem,
  Request:   c.Request, // 指針, 也算引用類型。 沒有實現完全復制
  Params:    c.Params,
  engine:    c.engine,
 }
 cp.writermem.ResponseWriter = nil
 cp.Writer = &cp.writermem
 cp.index = abortIndex
 cp.handlers = nil
 cp.Keys = map[string]interface{}{} // Keys 完全復制
 for k, v := range c.Keys {
  cp.Keys[k] = v
 }
 paramCopy := make([]Param, len(cp.Params)) // 切片, 完全復制
 copy(paramCopy, cp.Params) 
 cp.Params = paramCopy
 return &cp
}

1. gin 通過用一個全局變量保存

在 gin 中, 在讀取了 request body 后, 通過 c.Set(BodyBytesKey, body) 放到了 gin.Context 中的 Keys。這是一個 map, 上面說到了。

因此 在 gin 中通過中間變量實現類似效果。雖然感覺上多次讀取 Body , 但實際 只讀取了一次,

// ShouldBindBodyWith is similar with ShouldBindWith, but it stores the request
// body into the context, and reuse when it is called again.
//
// NOTE: This method reads the body before binding. So you should use
// ShouldBindWith for better performance if you need to call only once.
func (c *Context) ShouldBindBodyWith(obj any, bb binding.BindingBody) (err error) {
 var body []byte
 if cb, ok := c.Get(BodyBytesKey); ok {
  if cbb, ok := cb.([]byte); ok {
   body = cbb
  }
 }
 if body == nil {
  body, err = io.ReadAll(c.Request.Body)
  if err != nil {
   return err
  }
  // 將 Body 中的內容放到 gin.Context 中的 Keys 中
  c.Set(BodyBytesKey, body)
 }
 return bb.BindBody(body, obj)
}

參考文檔: https://github.com/gin-gonic/gin/blob/v1.9.1/context.go#L744-L764

2. 再造一個 Request

另外一種方法, 就是在讀取 Body 后, 重建一個 Requset 再把 Body 放進去。

// 讀取老的
body, err := ioutil.ReadAll(r.Body)
if err != nil {
    // ...
}
url, _ := url.Parse(config.GetGameHost())

// 創建新的
r2 := r.Clone(r.Context())

// 將數據方進去
r.Body = ioutil.NopCloser(bytes.NewReader(body))
r2.Body = ioutil.NopCloser(bytes.NewReader(body))

r.ParseForm()

proxy := httputil.NewSingleHostReverseProxy(url)
proxy.ServeHTTP(w, r2)

參考文檔: https://stackoverflow.com/q/62017146

注意 http.Request 有一個方法叫 Clone(), 但這也不是一個完全的深拷貝。Body 沒有復制。

// Clone returns a deep copy of r with its context changed to ctx.
// The provided ctx must be non-nil.
//
// For an outgoing client request, the context controls the entire
// lifetime of a request and its response: obtaining a connection,
// sending the request, and reading the response headers and body.
func (r *Request) Clone(ctx context.Context) *Request {
 if ctx == nil {
  panic("nil context")
 }
 r2 := new(Request)
 *r2 = *r
 r2.ctx = ctx
 r2.URL = cloneURL(r.URL)
 if r.Header != nil {
  r2.Header = r.Header.Clone()
 }
 if r.Trailer != nil {
  r2.Trailer = r.Trailer.Clone()
 }
 if s := r.TransferEncoding; s != nil {
  s2 := make([]string, len(s))
  copy(s2, s)
  r2.TransferEncoding = s2
 }
 r2.Form = cloneURLValues(r.Form)
 r2.PostForm = cloneURLValues(r.PostForm)
 r2.MultipartForm = cloneMultipartForm(r.MultipartForm)
 return r2
}
責任編輯:武曉燕 來源: 熊貓云原生Go
相關推薦

2010-07-26 15:42:34

Perl模塊

2009-09-25 14:04:09

Hibernate eHibernate h

2010-08-02 16:58:08

Flex配置文件

2010-08-03 13:53:47

Flex+Java配置

2009-08-05 15:54:49

Web Service

2010-08-04 17:41:52

掛載NFS

2010-06-02 17:16:16

自動運行SVN

2010-05-28 10:35:46

SVN搭建測試服務器

2009-04-21 11:23:56

Oraclespool比較

2009-11-03 16:20:16

VB.NET文本框

2010-06-17 12:48:05

livecd 修復Gr

2011-03-30 17:04:24

MySQL添加用戶

2009-11-06 09:48:40

WCF服務

2010-04-13 09:50:44

Oracle跟蹤

2010-11-24 14:36:25

修復mysql表

2010-05-26 18:52:12

SVN庫

2009-08-03 17:53:11

XML數據

2010-11-10 13:22:41

SQL Server備

2010-09-13 13:05:03

sql server分

2010-11-09 13:09:58

SQL Server分
點贊
收藏

51CTO技術棧公眾號

亚洲免费久久| 欧美国产视频一区二区| 超碰成人在线播放| 欧美videosex性欧美黑吊| 国产欧美一区视频| 香蕉久久精品| 色综合激情五月| 青春草在线视频免费观看| 人妻91麻豆一区二区三区| 日韩精品成人一区二区在线| 色综合91久久精品中文字幕| 成人免费毛片糖心| 91久久精品无嫩草影院| 91久久免费观看| 成人性生活视频免费看| 国产区视频在线| 国产福利一区二区三区视频在线 | 手机看片福利视频| 中文在线综合| 欧美精品色一区二区三区| 午夜精品久久久久久久无码| 在线网址91| 国产精品久久久久久久岛一牛影视| 九九久久99| 亚洲风情第一页| 精品一区二区综合| 国产成人综合一区二区三区| 久久精品久久国产| 欧美96在线丨欧| 日韩视频免费在线观看| 97伦伦午夜电影理伦片| 国产成人一二片| 日韩视频一区二区在线观看| gogogo高清免费观看在线视频| 成人性生交大片免费观看网站| 亚洲一区二区三区国产| 91嫩草国产丨精品入口麻豆| 米奇精品一区二区三区| 国产精品美女一区二区三区 | 亚洲精品国产首次亮相| 在线观看亚洲视频| 久久国产柳州莫菁门| 婷婷亚洲成人| 亚洲精品资源美女情侣酒店| 国产xxxxxxxxx| 动漫3d精品一区二区三区乱码| 欧美一区二区视频在线观看2022| 污污网站免费观看| 日韩欧美专区| 91精品欧美综合在线观看最新| 人人干人人干人人| 欧美91在线|欧美| 欧美体内she精视频| 狠狠躁狠狠躁视频专区| 成人国产精品一区二区免费麻豆 | 日韩国产在线| 最近日韩中文字幕中文| 国产欧美小视频| 色综合蜜月久久综合网| xxxxxxxxx欧美| 朝桐光av在线| 国精品一区二区| 91精品国产亚洲| 日本a级c片免费看三区| 日韩国产欧美在线视频| 国产精品视频自拍| 国产精品久久免费| 国产成人精品影视| 狠狠色综合欧美激情| 免费国产精品视频| 91日韩在线专区| 亚洲欧洲日夜超级视频| av免费网站在线| 性做久久久久久| 一本色道无码道dvd在线观看| 日韩成人影音| 7878成人国产在线观看| 亚洲最大视频网| 亚洲精品一级二级三级| 中文字幕亚洲图片| 久草免费在线视频观看| 亚洲激情国产| 国产精品三级久久久久久电影| 88av在线视频| heyzo一本久久综合| 欧美一区二区视频在线| 黄在线免费观看| 午夜精品一区二区三区电影天堂 | 国产色一区二区| 在线综合视频网站| аⅴ资源天堂资源库在线| 91成人国产精品| 天天av天天操| 亚洲美女久久| 欧美大码xxxx| 久久国产乱子伦精品| 狠狠狠色丁香婷婷综合激情| 国产欧美精品一区二区三区| 337p日本欧洲亚洲大胆鲁鲁| 亚洲亚洲人成综合网络| 欧美一级特黄a| 风间由美性色一区二区三区四区| 国产亚洲欧美日韩一区二区| 免费看一级一片| 日韩av不卡在线观看| 国产精品国模大尺度私拍| 成人精品一区二区三区免费 | 久久九九热免费视频| 欧美日韩综合在线观看| 国产曰批免费观看久久久| 蜜桃传媒视频第一区入口在线看| 黄色成人在线观看| 日本韩国欧美在线| 波多野结衣一二三区| 久久综合99| 日韩男女性生活视频| 午夜精品在线播放| 椎名由奈av一区二区三区| 成年人免费在线播放| www.久久东京| 欧美人与物videos| 亚洲一卡二卡在线| 国产婷婷精品av在线| 你懂的av在线| www.神马久久| 欧美大秀在线观看| 国产aⅴ一区二区三区| 亚洲国产精品成人综合色在线婷婷| 日本国产在线播放| 91久久精品无嫩草影院| 欧美尺度大的性做爰视频| 曰批又黄又爽免费视频| 国产日产欧美精品一区二区三区| 99爱视频在线| 欧美偷窥清纯综合图区| 91国产中文字幕| 色wwwwww| 天天综合日日夜夜精品| 久久久老熟女一区二区三区91| 欧美 日韩 国产 一区| 91精品久久久久| 亚洲精品承认| 91黄色激情网站| 黄瓜视频污在线观看| 日韩一级不卡| 国产一区福利视频| eeuss鲁一区二区三区| 亚洲成人激情在线观看| 日韩精品视频免费看| 成人免费不卡视频| 国产69精品久久久久999小说| 成人自拍在线| 91成人在线视频| 青青草视频在线免费观看| 色综合天天在线| 四虎成人免费影院| 久久69国产一区二区蜜臀| 一区二区三区四区视频在线观看 | 波兰性xxxxx极品hd| 美女久久久精品| 致1999电视剧免费观看策驰影院| 欧美网站免费| 欧美成人亚洲成人| 六月丁香色婷婷| 欧美日韩亚洲精品一区二区三区| 中文字幕xxx| 秋霞国产午夜精品免费视频| 亚洲永久一区二区三区在线| 国产麻豆精品| 久久久亚洲福利精品午夜| 日韩精品福利| 欧美午夜精品久久久| 三上悠亚作品在线观看| 国产成人免费网站| 国产成人精品视频免费看| 成人同人动漫免费观看| 亚洲一区二区三区777| www成人免费观看| 亚洲视频在线观看| 国产美女永久免费| 天天综合天天综合色| 黄色一级片一级片| 成人精品鲁一区一区二区| 中文字幕乱码人妻综合二区三区| 伊人久久大香线蕉综合网站| 成人国产精品久久久久久亚洲| 亚洲大胆人体大胆做受1| 日韩成人中文字幕| 在线视频1卡二卡三卡| 亚洲自拍偷拍网站| 一区二区黄色片| 国产精品性做久久久久久| 欧美v在线观看| 亚洲xxx拳头交| 精品欧美一区二区在线观看视频 | 午夜在线精品| 欧美日韩在线免费观看视频| 日韩系列在线| 91在线精品播放| 小黄鸭精品aⅴ导航网站入口| 久久精品中文字幕| 国产尤物视频在线| 日韩欧美亚洲国产精品字幕久久久| 日韩三级一区二区| 亚洲综合久久av| 熟女少妇a性色生活片毛片| 99久久精品免费看国产| 亚洲热在线视频| 日本中文字幕一区二区视频| 国产a级片网站| 久久久久久久久久久妇女| 日本精品国语自产拍在线观看| 视频在线一区| 国产三级精品网站| 韩日成人影院| 午夜精品久久久久久久白皮肤 | 91精品国产网站| 91麻豆国产福利在线观看宅福利| 一区二区三区黄色| 日本中文字幕电影在线观看| 亚洲成人黄色在线| 亚洲av无码国产精品久久不卡| 欧美无人高清视频在线观看| 五月婷婷视频在线| 亚洲午夜激情网站| 亚洲熟女www一区二区三区| 国产精品免费aⅴ片在线观看| av中文字幕免费观看| 成人黄色在线网站| 国产又黄又嫩又滑又白| 国内精品自线一区二区三区视频| 91网址在线播放| 老司机精品久久| 国产精品亚洲αv天堂无码| 99在线精品视频在线观看| 亚洲熟妇无码av在线播放| 欧美 日韩 国产一区二区在线视频 | 黄色www视频| 日韩手机在线导航| 国产超碰人人模人人爽人人添| 欧美精品丝袜中出| 91麻豆一区二区| 欧美日韩成人激情| 国产精品视频无码| 制服丝袜激情欧洲亚洲| 国产精品一区二区人人爽| 7777精品伊人久久久大香线蕉经典版下载| 亚洲国产无线乱码在线观看| 欧美午夜免费电影| 91精品国自产| 日韩一区二区电影网| 午夜美女福利视频| 亚洲国产高清福利视频| 无码精品在线观看| 亚洲女成人图区| 国产美女性感在线观看懂色av| 亚洲性无码av在线| www.黄在线观看| 精品国产美女在线| 亚洲卡一卡二| 69av视频在线播放| 欧美大片1688| 91精品视频播放| 风间由美一区二区av101| 久久青青草综合| 欧美精选视频在线观看| 一区二区三区四区国产| 国产一区观看| 白嫩少妇丰满一区二区| 久久国产精品99精品国产| 亚洲制服在线观看| 99久久婷婷国产综合精品| 日本一级免费视频| 亚洲欧美一区二区在线观看| 国产中文字幕免费| 一本一道久久a久久精品| 伊人色综合久久久| 日韩欧美国产系列| 欧美香蕉爽爽人人爽| 日韩在线观看免费全| ****av在线网毛片| 国产精品久久久久久久久久久久| 日日夜夜一区| 国内精品久久国产| 首页国产精品| 黄页网站大全在线观看| 青青草国产精品亚洲专区无| 99热这里只有精品2| 久久先锋影音av鲁色资源网| 天天操天天摸天天舔| 亚洲va欧美va人人爽| 最近中文字幕av| 精品捆绑美女sm三区 | 国产人成一区二区三区影院| avove在线播放| 色88888久久久久久影院野外| 国产伦精品一区二区三区免.费| 亚洲国产精品高清久久久| 天堂а√在线官网| 1769国内精品视频在线播放| 91成人短视频在线观看| 久久资源av| 欧美va亚洲va日韩∨a综合色| 欧美伦理视频在线观看| 成人精品鲁一区一区二区| 久艹在线观看视频| 色婷婷av一区二区三区软件| 免费看av毛片| 欧美插天视频在线播放| 91大神在线观看线路一区| 韩国一区二区三区美女美女秀| 99久久婷婷这里只有精品| 欧美三级一级片| 不卡的av电影| 日韩精品免费视频| 日韩三级久久久| 欧美日韩精品在线| 精品久久人妻av中文字幕| 一本久久综合亚洲鲁鲁| 在线视频超级| 国产区欧美区日韩区| 欧美在线三区| 国产欧美一区二| 国产精品每日更新在线播放网址| 男人日女人网站| 亚洲精品97久久| av资源中文在线天堂| 99久久综合狠狠综合久久止| 久久免费精品视频在这里| 8x8x最新地址| 欧美高清一级片在线观看| 无码无套少妇毛多18pxxxx| 精品国产乱码91久久久久久网站| 91网址在线观看| 91视频免费网站| 亚洲天堂免费| 激情图片中文字幕| 亚洲精品久久久蜜桃| 国产三级第一页| 久久国产精品首页| 久久69av| 国产精品自拍合集| 国产精品亚洲а∨天堂免在线| 日本老熟俱乐部h0930| 日韩一区二区高清| 成人性生交大片免费看网站 | 在线观看日本中文字幕| 亚洲高清免费一级二级三级| 国产肥老妇视频| 不卡伊人av在线播放| 欧美2区3区4区| 成人国产在线看| 成人av午夜电影| 国产无人区码熟妇毛片多| 亚洲欧美在线一区| 高清在线一区| 性欧美18一19内谢| 国产精品一区二区久激情瑜伽| 免费日韩在线视频| 亚洲精品久久久久国产| 欧美不卡高清一区二区三区| 新呦u视频一区二区| 国产综合一区二区| 久久久.www| 日韩精品欧美激情| 欧美日韩尤物久久| 四虎精品欧美一区二区免费| 国产福利91精品一区二区三区| 国产一级特黄a高潮片| 亚洲精品乱码久久久久久金桔影视 | 午夜电影一区二区| 国产青青草在线| 91视频免费在线| 国产精品色综合| 久久久免费精品| 国产一区二区三区不卡视频网站 | 国产一区视频导航| 久久精品这里有| 亚洲欧洲激情在线| 99国内精品久久久久| 男人的天堂狠狠干| 亚洲国产成人一区二区三区| 性色av蜜臀av| 国产福利视频一区| 一区二区中文字| 欧美激情aaa| 日韩欧美资源站| 澳门av一区二区三区| 4444亚洲人成无码网在线观看| 26uuu精品一区二区三区四区在线| 一级爱爱免费视频| 2019中文在线观看| 亚洲成人日韩| 国产手机在线观看| 精品国产一区二区精华| 91tv亚洲精品香蕉国产一区| 亚洲精品蜜桃久久久久久| 国产精品欧美一区喷水| 天堂中文在线看| 亚洲bt欧美bt日本bt|