http - golang 多个 parseBody 用于 http.request
问题描述
嘿,我想解析 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.`))
}
我们会有恐慌:http: panic serving [::1]:54581: unexpected end of JSON input
但接下来的代码:
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}
推荐阅读
- node.js - Puppeteer - 如何使用本地 IP 地址连接 WSEndpoint?
- python - Python 2.7.13 龟 onkey 功能不起作用
- docker - 无法通过 docker-compose.yml 中的“标签”设置 Traefik
- jquery - 添加新 div 时背景图像不透明度增加
- css - 网站和 Invsion(设计师和前端开发人员工具)之间的字体差异
- arduino - Arduino IDE 可以使用 avrdude 来刷 hex 文件,但是 ubuntu 上的命令行不能
- javascript - 如何获取 HTTP 请求的类型
- javascript - 函数名称是否也应该反映在 promise.then() 上称为回调的函数的操作?
- javascript - 将文字数字(三)乘以 1(四)
- ios - 是否可以更改 UINavigationBar 的字体大小