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

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

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

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

不羅嗦了,直接貼代碼,不曉得為什么搞這么復(fù)雜,是不是因為擔心 body 內(nè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)        //在返回頁面中顯示內(nèi)容。
}

...

Golang http.Request復(fù)用

針對除了Get以外的請求

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) // 第一次會請求成功
        client.Do(req) // 請求失敗
}

第二次請求會出錯

http: ContentLength=5 with Body length 0

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

解決方法:

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

package reader

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

type Repeat struct{
    reader io.ReaderAt
    offset int64
}

// Read 重寫讀方法,使每次讀取request.Body時能從指定位置讀取
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 {
    // 因為req.Body實現(xiàn)了readcloser接口,所以要實現(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)
}

這樣就不會報錯了,因為也重寫了Close()方法,所以同時也解決了request重用時,req.Body自動關(guān)閉的問題。

總結(jié)

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

相關(guān)文章

  • Go 基于令牌桶的限流器實現(xiàn)

    Go 基于令牌桶的限流器實現(xiàn)

    如果一般流量過大,下游系統(tǒng)反應(yīng)不過來,這個時候就需要限流了,本文主要介紹了Go 基于令牌桶的限流器實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • 一文帶你了解GO語言中方法的應(yīng)用

    一文帶你了解GO語言中方法的應(yīng)用

    GO?語言中的方法實際上和函數(shù)是類似的,只不過在函數(shù)的基礎(chǔ)上多了一個參數(shù),這篇文章主要為大家介紹一下GO語言中方法的應(yīng)用,需要的可以參考下
    2023-09-09
  • 詳解Go語言中的Slice鏈式操作

    詳解Go語言中的Slice鏈式操作

    這篇文章主要為大家詳細介紹了Go語言中的Slice鏈式操作的相關(guān)知識,文中的示例代碼講解詳細,具有一定的學(xué)習(xí)價值,感興趣的小伙伴可以了解一下
    2023-04-04
  • Go語言中數(shù)組的基本用法演示

    Go語言中數(shù)組的基本用法演示

    這篇文章主要介紹了Go語言中數(shù)組的基本用法演示,包括一個冒泡排序算法的簡單實現(xiàn),需要的朋友可以參考下
    2015-10-10
  • Golang使用ini庫讀取配置詳情

    Golang使用ini庫讀取配置詳情

    這篇文章主要介紹了Golang使用ini庫讀取配置詳情,go-ini是一個非常方便、高效的go配置文件操作庫。使用它在項目中讀取和修改配置文件,下文相關(guān)資料需要的小伙伴可可以參考一下
    2022-04-04
  • 淺析Go語言編程當中映射和方法的基本使用

    淺析Go語言編程當中映射和方法的基本使用

    這篇文章主要介紹了淺析Go語言編程當中映射和方法的基本使用,是golang入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-10-10
  • 在Gin框架中正確刪除Cookie的操作指南

    在Gin框架中正確刪除Cookie的操作指南

    在現(xiàn)代Web開發(fā)中,Cookie管理是構(gòu)建用戶友好應(yīng)用的關(guān)鍵環(huán)節(jié),Gin作為Go語言中最受歡迎的Web框架之一,提供了簡潔而強大的Cookie處理機制,本文將深入探討如何在Gin框架中正確刪除Cookie,需要的朋友可以參考下
    2025-08-08
  • 詳解Golang中Channel的用法

    詳解Golang中Channel的用法

    如果說goroutine是Go語言程序的并發(fā)體的話,那么channels則是它們之間的通信機制。這篇文章主要介紹Golang中Channel的用法,需要的朋友可以參考下
    2020-11-11
  • 簡介Go語言中的select語句的用法

    簡介Go語言中的select語句的用法

    這篇文章主要介紹了簡介Go語言中的select語句的用法,是golang入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-10-10
  • Golang信號處理及如何實現(xiàn)進程的優(yōu)雅退出詳解

    Golang信號處理及如何實現(xiàn)進程的優(yōu)雅退出詳解

    這篇文章主要給大家介紹了關(guān)于Golang信號處理及如何實現(xiàn)進程的優(yōu)雅退出的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03

最新評論

花莲市| 威海市| 平顶山市| 广昌县| 文成县| 新郑市| 汨罗市| 霍邱县| 井研县| 文水县| 东兰县| 射阳县| 射阳县| 罗源县| 宁武县| 南京市| 临江市| 崇左市| 潜江市| 云阳县| 渝中区| 基隆市| 阜新| 时尚| 枣阳市| 永修县| 威信县| 绥德县| 马龙县| 温宿县| 化德县| 会理县| 沾化县| 庆云县| 河西区| 马尔康县| 常山县| 新宾| 连平县| 双辽市| 镇安县|