最新国产好看的视频,伊人天堂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ù)雜,是不是因為擔(dān)心 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語言中數(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語言編程當(dāng)中映射和方法的基本使用

    淺析Go語言編程當(dāng)中映射和方法的基本使用

    這篇文章主要介紹了淺析Go語言編程當(dāng)中映射和方法的基本使用,是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)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03
  • 最新評論

    克东县| 札达县| 上思县| 虞城县| 大城县| 怀化市| 冕宁县| 且末县| 山阴县| 平原县| 成武县| 平江县| 哈尔滨市| 湘潭市| 炎陵县| 黄梅县| 锦州市| 浮梁县| 启东市| 黄冈市| 香格里拉县| 泰州市| 资兴市| 南平市| 阿尔山市| 浏阳市| 集安市| 临汾市| 富源县| 淮阳县| 敖汉旗| 邻水| 铜梁县| 从化市| 望江县| 饶河县| 牟定县| 平度市| 中阳县| 东兰县| 扶余县|