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

golang讀取http的body時遇到的坑及解決

 更新時間:2024年03月28日 10:36:49   作者:咸魚閑不閑  
這篇文章主要介紹了golang讀取http的body時遇到的坑及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

golang讀取http的body時遇到的坑

當服務端對http的body進行解析到map[string]interface{}時,會出現(xiàn)cli傳遞的是int類型,而服務端只能斷言成float64,而不能將接收到的本該是int類型的直接斷言為int

cli

func main(){
	url:="http://127.0.0.1:8335/api/v2/submit"
	myReq:= struct {
		ProductId   int   `json:"product_id"`
		Mobile     string  `json:"mobile"`
		Content    string   `json:"content"`
		Grade			float64		`form:"grade" json:"grade"`
		Image			string		`form:"image" json:"image"`
	   Longitude   float64        `json:"longitude"`
		Latitude    float64     `json:"latitude"`
	}{
		ProductId:219,
		Mobile:"15911111111",
		Content: "這個軟件LOGO真丑",
		Image: "www.picture.com;www.picture.com",
		Longitude: 106.3037109375,
		Latitude: 38.5137882595,
		Grade:9.9,
	}
	reqByte,err:=json.Marshal(myReq)
	req, err := http.NewRequest("POST", url, bytes.NewReader(reqByte))
	if err != nil {
		return
	}
	//設置請求頭

	req.Header.Add("Content-Type", "application/json")
	cli := http.Client{
		Timeout: 45 * time.Second,
	}
	resp, err := cli.Do(req)
	if err != nil {
		return
	}
	out, err := ioutil.ReadAll(resp.Body)

	if err != nil {
		return
	}
	fmt.Println(string(out))
}

server

func SubmitV2(c *gin.Context) {
	resp := &dto.Response{}
	obj:=make(map[string]interface{})
	var buf []byte
	var err error
	buf, err =ioutil.ReadAll(c. Request.Body)
	if err!=nil {
		return
	}
	err=json.Unmarshal(buf,&obj)
	if err!=nil {
		return
	}
	fmt.Println("product_id:",reflect.TypeOf(obj["product_id"]))
	fmt.Println("image:",reflect.TypeOf(obj["image"]))
	fmt.Println(obj)
	productId:=obj["product_id"].(float64)
	//注意,這里斷言成int類型會出錯
	c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(buf))
	if !checkProduct(int(productId)){
		resp.Code = -1
		resp.Message = "xxxxxx"
		c.JSON(http.StatusOK, resp)
		return
	}
	url := config.Optional.OpinionHost + "/api/v1/submit"
	err = http_utils.PostAndUnmarshal(url, c.Request.Body, nil, resp)
	if err != nil {
		logrus.WithError(err).Errorln("Submit: error")
		resp.Code = -1
		resp.Message = "Submit"
	}
	c.JSON(http.StatusOK, resp)
}

打印類型,發(fā)現(xiàn)product_id是float64類型

原因:

json中的數(shù)字類型沒有對應int,解析出來都是float64

方案二:

	type S struct {
		ProductID int     `json:"product_id"`
		F       float64 `json:"f"`
	}
	s := S{Product: 12, F: 2.7}
	jsonData, _ := json.Marshal(s)
	var m map[string]interface{}
	json.Unmarshal(jsonData, &m)
	fmt.Println(reflect.TypeOf(m["product_id"]))
	fmt.Println(reflect.TypeOf(m["f"]))
	decoder := jsoniter.NewDecoder(bytes.NewReader(jsonData))
	decoder.UseNumber()
	decoder.Decode(&m)
	fmt.Println(reflect.TypeOf(m["product_id"].(json.Number).Int64))
	fl, _ := m["f"].(json.Number).Float64()
	fmt.Println(reflect.TypeOf(fl))

golang讀取Response Body超時問題

context deadline exceeded(Client.Timeout or context cancellation while reading body)

問題描述

當使用io.copy進行對網(wǎng)絡請求的文件進行保存到本地時,在文件未完全保存時拋出此錯誤

問題原因

由于在構建http client 時指定了超時時間,即

return &http.Client{
    Timeout: 60 * time.Second,
}

故此,當時間超過此時間時context會結束

解決辦法

目前使用增加超時時間,暫時解決這個問題

總結

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

相關文章

  • go:gin輸出日志文件方式

    go:gin輸出日志文件方式

    這篇文章主要介紹了go:gin輸出日志文件方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Go語言strings.Repeat中5個高效用法(附性能對比)

    Go語言strings.Repeat中5個高效用法(附性能對比)

    本文深入探討Go語言中strings.Repeat的5個高效用法,包括CLI工具視覺增強、測試數(shù)據(jù)生成、文本對齊優(yōu)化、二進制協(xié)議處理及性能優(yōu)化場景,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧
    2026-03-03
  • windows下使用GoLand生成proto文件的方法步驟

    windows下使用GoLand生成proto文件的方法步驟

    本文主要介紹了windows下使用GoLand生成proto文件的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • 一文帶你熟悉Go語言中的for循環(huán)

    一文帶你熟悉Go語言中的for循環(huán)

    這篇文章主要和大家分享一下Go語言中for循環(huán)的定義與使用,文中的示例代碼講解詳細,對我們學習Go語言有一定的幫助,需要的可以參考一下
    2022-11-11
  • Golang并發(fā)讀取文件數(shù)據(jù)并寫入數(shù)據(jù)庫的項目實踐

    Golang并發(fā)讀取文件數(shù)據(jù)并寫入數(shù)據(jù)庫的項目實踐

    本文主要介紹了Golang并發(fā)讀取文件數(shù)據(jù)并寫入數(shù)據(jù)庫的項目實踐,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • Golang中List的實現(xiàn)方法示例詳解

    Golang中List的實現(xiàn)方法示例詳解

    最近決定復習下Go,所以下面這篇文章主要給大家介紹了關于Golang中List的實現(xiàn)方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2017-09-09
  • 圖解Golang的GC垃圾回收算法

    圖解Golang的GC垃圾回收算法

    這篇文章主要介紹了圖解Golang的GC垃圾回收算法,詳細的介紹了三種經(jīng)典的算法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-03-03
  • 基于golang uint8、int8與byte的區(qū)別說明

    基于golang uint8、int8與byte的區(qū)別說明

    這篇文章主要介紹了基于golang uint8、int8與byte的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • 深入理解Go語言實現(xiàn)多態(tài)?

    深入理解Go語言實現(xiàn)多態(tài)?

    本文主要介紹了Go語言實現(xiàn)多態(tài),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05
  • Golang中的path/filepath包用法

    Golang中的path/filepath包用法

    這篇文章主要介紹了Golang中的path/filepath包用法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12

最新評論

兴安盟| 武义县| 寿光市| 辉南县| 铜梁县| 佛坪县| 曲沃县| 罗定市| 罗江县| 新绛县| 夏津县| 万州区| 保山市| 稷山县| 辽中县| 诸城市| 哈密市| 临城县| 惠东县| 德安县| 陆河县| 叙永县| 如东县| 宜宾市| 武隆县| 通榆县| 宝兴县| 重庆市| 南丰县| 金华市| 油尖旺区| 陕西省| 闽侯县| 兴山县| 都江堰市| 信宜市| 万州区| 桐庐县| 阿拉善右旗| 尚义县| 和田市|