gpt4 book ai didi

json - 打印 POST JSON 数据

转载 作者:数据小太阳 更新时间:2023-10-29 03:09:21 30 4
gpt4 key购买 nike

我在从 POST 打印 JSON 时遇到问题。我使用 gorilla/mux 进行路由

r := mux.NewRouter()
r.HandleFunc("/test", Point).Methods("POST")
http.ListenAndServe(":80", r)`

Point 函数中我有

func Point(w http.ResponseWriter, r *http.Request) {
var callback Decoder
json.NewDecoder(r.Body).Decode(&callback)
}

但只有当我知道结构并且我想弄清楚如何将整个 JSON 作为字符串log.Print 时,我才能使用此方法。我试过了

func Point(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
log.Println(r.Form)
}

但它打印出一张空 map 。请帮助解决这个问题。

最佳答案

假设您正在构建一个接收一些 JSON 的标准 API 端点,并且您想用它做一些事情,您应该按以下方式处理它。

编辑:

As mentioned in the comments when you use the ioutil.ReadAll() function as in this example it will read everything that is sent in the post request into the application memory. It's a good idea to check this in a production application (e.g limiting payload size).

1.) 创建一个结构体来保存来自 GoLang API post 请求的数据
2.) 将您的请求正文转换为字节数组 []byte
3.) Unmarshal你的[]byte到您之前制作的结构的单个实例中。

下面我举个例子:

1。制作一个结构,您将把 JSON 放入其中。


让我们以一篇简单的博客文章为例。

JSON 对象看起来像这样并且有一个 slug , 一个 title , 和 description

{
"slug": "test-slug",
"title": "This is the title",
"body": "This is the body of the page"
}

所以你的结构看起来像这样:

type Page struct {
Slug string `json:"slug"`
Title string `json:"title"`
Body string `json:"body"`
}

2 - 3. 获取请求正文并将其转换为 byte[]然后取那个字符串和Unmarshal它成为你的结构的一个实例。


post请求的数据是请求'Body'。

在 Golang 中,几乎所有情况下的请求(除非您使用默认值之外的花哨的东西)都是一个 http.Request 对象。这是您通常在普通代码中使用的“r”,它包含我们 POST 请求的“正文”。

import (
"encoding/json"
"github.com/go-chi/chi" // you can remove
"github.com/go-chi/render" // you can remove but be sure to remove where it is used as well below.
"io/ioutil"
"net/http"
)


func GiveMeAPage(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("A page"))
}

所以我们在这里要做的是转换一个 io.ReadCloser ,这就是 http.Request.Body[]byte作为 Unmarshal函数需要 []byte类型。我已在下方为您内联评论。

func Create(w http.ResponseWriter, r *http.Request) {
var p Page //Create an instance of our struct


//Read all the data in r.Body from a byte[], convert it to a string, and assign store it in 's'.
s, err := ioutil.ReadAll(r.Body)
if err != nil {
panic(err) // This would normally be a normal Error http response but I've put this here so it's easy for you to test.
}
// use the built in Unmarshal function to put the string we got above into the empty page we created at the top. Notice the &p. The & is important, if you don't understand it go and do the 'Tour of Go' again.
err = json.Unmarshal(s, &p)
if err != nil {
panic(err) // This would normally be a normal Error http response but I've put this here so it's easy for you to test.
}

// From here you have a proper Page object which is filled. Do what you want with it.

render.JSON(w, r, p) // This is me using a useful helper function from go-chi which 'Marshals' a struct to a json string and returns it to using the http.ResponseWriter.
}

As a side note. Please don't use Decoder to parse JSON unless you are using JSON streams. You are not here, and it's unlikely you will for a while. You can read about why that is here

关于json - 打印 POST JSON 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54606686/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com