http - 用于 http.request 的 golang 多个 parseBody

标签 http go web web-development-server

嘿,我想解析 http.resquest 两次,如下所示。当我第一次解析 Body 时,body 将被关闭。我需要一些帮助/提示处理此问题的最佳方法是什么,我必须创建请求的副本还是有更好的方法?

func myfunc(w http.ResponseWriter, req *http.Request) {
  err := parseBody(req, &type1){
  .....
  }

  err := parseBody(req, &type2){
  .....
  }
}

感谢帮助

最佳答案

的确,您只能读取 body 一次,这没关系,因为要多次解析 body,您不必多次读取它。让我们考虑一个简单的例子:

package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net/http"
)

type RequestData1 struct {
    Code   string `json:"code"`
    Status string `json:"status"`
}

type RequestData2 struct {
    Status  string `json:"status"`
    Message string `json:"message"`
}

func main() {
    http.HandleFunc("/post", post)
    http.ListenAndServe(":8080", nil)
}

如果我们使用这段代码:

func post(w http.ResponseWriter, r *http.Request) {
    body1, err := ioutil.ReadAll(r.Body)
    if err != nil {
        panic(err)
    }
    rd1 := RequestData1{}
    err = json.Unmarshal(body1, &rd1)
    if err != nil {
        panic(err)
    }

    body2, err := ioutil.ReadAll(r.Body)
    if err != nil {
        panic(err)
    }
    rd2 := RequestData2{}
    err = json.Unmarshal(body2, &rd2)
    if err != nil {
        panic(err) // panic!!!
    }

    fmt.Printf("rd1: %+v \nrd2: %+v", rd1, rd2)
    w.WriteHeader(http.StatusOK)
    w.Write([]byte(`Look into console.`))
}

我们会出现 panic :http: panic serving [::1]:54581: JSON 输入意外结束
但是接下来的代码:

func post(w http.ResponseWriter, r *http.Request) {
    body, err := ioutil.ReadAll(r.Body)
    if err != nil {
        panic(err)
    }

    rd1 := RequestData1{}
    err = json.Unmarshal(body, &rd1)
    if err != nil {
        panic(err)
    }

    rd2 := RequestData2{}
    err = json.Unmarshal(body, &rd2)
    if err != nil {
        panic(err)
    }

    fmt.Printf("rd1: %+v \nrd2: %+v", rd1, rd2)
    w.WriteHeader(http.StatusOK)
    w.Write([]byte(`Look into console.`))
}

一切正常!您可以通过发出请求来测试它:

curl -X POST 'http://localhost:8080/post' \
-H 'Content-Type: application/json' -d '{"code":"200", "status": "OK", "message": "200 OK"}'

结果将是:

rd1: {Code:200 Status:OK}
rd2: {Status:OK Message:200 OK}

关于http - 用于 http.request 的 golang 多个 parseBody,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51425388/

相关文章:

c# - 如何在 C#.NET/Mono 中使用 HTTP 库来使用请求-响应

angularjs - 如何将 eventHandlers 和 uploadEvntHandlers 与 angularjs 1 http 请求一起使用?

java - 未找到 HTTP 404(未找到 Servlet)

git - 使用 Git(或任何 VCS)的 Go 项目的正确组织是什么?

ruby-on-rails - 如何将网站上的所有页面转换为 pdf 格式?

php - 如何在magento中显示价格后的增值税

iphone - ASIHttpRequest responseStatusCode = 200。但没有从服务器获取正确的responseData

json - 将 interface{} 编码为 json

go - 通过 FTP 下载文件后将文件写入磁盘时出现问题

javascript - 点对点协作文本编辑