亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Golang語(yǔ)言如何讀取http.Request中body的內(nèi)容

 更新時(shí)間:2024年03月28日 10:14:37   作者:許野平  
這篇文章主要介紹了Golang語(yǔ)言如何讀取http.Request中body的內(nèi)容問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Golang讀取http.Request中body內(nèi)容

不羅嗦了,直接貼代碼,不曉得為什么搞這么復(fù)雜,是不是因?yàn)閾?dān)心 body 內(nèi)容一次接受不全,所以搞了個(gè)接口來(lái)讀取其中的內(nèi)容?

import (
	...
	"io/ioutil"
	...
)

...

func myPost(w http.ResponseWriter, r *http.Request) {
	s, _ := ioutil.ReadAll(r.Body) //把	body 內(nèi)容讀入字符串 s
	fmt.Fprintf(w, "%s", s)        //在返回頁(yè)面中顯示內(nèi)容。
}

...

Golang http.Request復(fù)用

針對(duì)除了Get以外的請(qǐng)求

package main

import (
    "net/http"
    "strings"
    )

func main(){
        reader := strings.NewReader("hello")
        req,_ := http.NewRequest("POST","http://www.abc.com",reader)
        client := http.Client{}
        client.Do(req) // 第一次會(huì)請(qǐng)求成功
        client.Do(req) // 請(qǐng)求失敗
}

第二次請(qǐng)求會(huì)出錯(cuò)

http: ContentLength=5 with Body length 0

原因是第一次請(qǐng)求后req.Body已經(jīng)讀取到結(jié)束位置,所以第二次請(qǐng)求時(shí)無(wú)法再讀取body,

解決方法:

重新定義一個(gè)ReadCloser的實(shí)現(xiàn)類替換req.Body

package reader

import (
    "io"
    "net/http"
    "strings"
    "sync/atomic"
)

type Repeat struct{
    reader io.ReaderAt
    offset int64
}

// Read 重寫讀方法,使每次讀取request.Body時(shí)能從指定位置讀取
func (p *Repeat) Read(val []byte) (n int, err error) {
    n, err = p.reader.ReadAt(val, p.offset)
    atomic.AddInt64(&p.offset, int64(n))
    return
}

// Reset 重置偏移量
func (p *Repeat) Reset(){
        atomic.StoreInt64(&p.offset,0)
}

func (p *Repeat) Close() error {
    // 因?yàn)閞eq.Body實(shí)現(xiàn)了readcloser接口,所以要實(shí)現(xiàn)close方法
    // 但是repeat中的值有可能是只讀的,所以這里只是嘗試關(guān)閉一下。
    if p.reader != nil {
            if rc, ok := p.reader.(io.Closer); ok {
                return rc.Close()
            }
        }
    return nil
}

func doPost()  {
    client := http.Client{}
    reader := strings.NewReader("hello")
    req , _ := http.NewRequest("POST","http://www.abc.com",reader)
    req.Body = &Repeat{reader:reader,offset:0}
    client.Do(req)
    // 將偏移量重置為0
    req.Body.(*Repeat).Reset()
    client.Do(req)
}

這樣就不會(huì)報(bào)錯(cuò)了,因?yàn)橐仓貙懥薈lose()方法,所以同時(shí)也解決了request重用時(shí),req.Body自動(dòng)關(guān)閉的問(wèn)題。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Golang二進(jìn)制文件混淆保護(hù)操作

    Golang二進(jìn)制文件混淆保護(hù)操作

    這篇文章主要介紹了Golang二進(jìn)制文件混淆保護(hù)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • 一文詳解Go語(yǔ)言單元測(cè)試的原理與使用

    一文詳解Go語(yǔ)言單元測(cè)試的原理與使用

    Go語(yǔ)言中自帶有一個(gè)輕量級(jí)的測(cè)試框架testing和自帶的go?test命令來(lái)實(shí)現(xiàn)單元測(cè)試和性能測(cè)試。本文將通過(guò)示例詳細(xì)聊聊Go語(yǔ)言單元測(cè)試的原理與使用,需要的可以參考一下
    2022-09-09
  • go語(yǔ)言實(shí)現(xiàn)LRU緩存的示例代碼

    go語(yǔ)言實(shí)現(xiàn)LRU緩存的示例代碼

    LRU是一種常見的緩存淘汰策略,用于管理緩存中的數(shù)據(jù),本文主要介紹了go語(yǔ)言實(shí)現(xiàn)LRU緩存的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • Golang中下劃線(_)的不錯(cuò)用法分享

    Golang中下劃線(_)的不錯(cuò)用法分享

    golang中的下劃線表示忽略變量的意思,也沒有產(chǎn)生新的變量,但是后面的表達(dá)式依然會(huì)被執(zhí)行,本文為大家整理了golang中下劃線的一些不錯(cuò)的用法,需要的可以參考下
    2023-05-05
  • Go初學(xué)者踩坑之go?mod?init與自定義包的使用

    Go初學(xué)者踩坑之go?mod?init與自定義包的使用

    go?mod是go的一個(gè)模塊管理工具,用來(lái)代替?zhèn)鹘y(tǒng)的GOPATH方案,下面這篇文章主要給大家介紹了關(guān)于Go初學(xué)者踩坑之go?mod?init與自定義包的使用,需要的朋友可以參考下
    2022-10-10
  • Golang?reflect反射的使用實(shí)例

    Golang?reflect反射的使用實(shí)例

    Golang反射的錯(cuò)誤大多數(shù)都來(lái)自于調(diào)用了一個(gè)不適合當(dāng)前類型的方法,而且,這些錯(cuò)誤通常是在運(yùn)行時(shí)才會(huì)暴露出來(lái),而不是在編譯時(shí),如果我們傳遞的類型在反射代碼中沒有被覆蓋到那么很容易就會(huì)panic,本文就介紹一下使用go反射時(shí)很大概率會(huì)出現(xiàn)的錯(cuò)誤,需要的可以參考一下
    2023-04-04
  • Go中JSON解析時(shí)tag的使用

    Go中JSON解析時(shí)tag的使用

    本文主要介紹了Go中JSON解析時(shí)tag的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 淺談golang slice 切片原理

    淺談golang slice 切片原理

    這篇文章主要介紹了淺談golang slice 切片原理,詳細(xì)的介紹了golang slice 切片的概念和原理,具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-11-11
  • 深入了解Golang中占位符的使用

    深入了解Golang中占位符的使用

    在寫?golang?的時(shí)候,也是有對(duì)應(yīng)的格式控制符,也叫做占位符,寫這個(gè)占位符,需要有對(duì)應(yīng)的數(shù)據(jù)與之對(duì)應(yīng),不能瞎搞。本文就來(lái)和大家聊聊Golang中占位符的使用,希望對(duì)大家有所幫助
    2023-03-03
  • golang copy函數(shù)使用的坑

    golang copy函數(shù)使用的坑

    本文主要介紹了golang copy函數(shù)使用的坑,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04

最新評(píng)論