我在从POST打印JSON时遇到问题。 我使用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打印为字符串。我尝试过
func Point(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
log.Println(r.Form)
}
但是它打印出空白地图。请帮助解决这个问题。
答案 0 :(得分:1)
如果只希望原始JSON数据而不进行解析,则http.Request.Body
实现io.Reader
,因此您可以从其中Read
。例如使用ioutil.ReadAll
。
(未经测试)之类的东西
func Point(w http.ResponseWriter, r *http.Request) {
data, err := ioutil.ReadAll(r.Body)
// check error
// do whatever you want with the raw data (you can `json.Unmarshal` it too)
}
答案 1 :(得分:0)
假设您正在构建一个接收一些JSON的标准API端点,并且您想对此做些事情,则应采用以下方式进行处理。
修改:
如使用ioutil.ReadAll()时的注释中所述 功能,如本例所示,它将读取在 将请求发布到应用程序内存中。检查是个好主意 这在生产应用程序中(例如,限制有效负载大小)。
1。)创建一个结构,该结构将在GoLang中保存来自API发布请求的数据
2.)将您的请求正文转换为字节数组[]byte
3.)Unmarshal
将您的[]byte
转换为先前制作的结构的单个实例。
我将在下面举例:
让我们以一个简单的博客帖子为例。
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"`
}
byte[]
,然后将该字符串并Unmarshal
放入您的结构实例中。发布请求的数据为请求“正文”。
在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
的{{1}}转换为http.Request.Body
,因为[]byte
函数需要一个{{ 1}}类型。我为您在下面对内联发表了评论。
Unmarshal
作为旁注。除非您正在使用JSON流,否则请不要使用
[]byte
来解析JSON。您不在这里,不太可能会 一阵子。您可以了解为什么 here