打印POST JSON数据

时间:2019-02-09 13:29:02

标签: json go post handler

我在从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)
} 

但是它打印出空白地图。请帮助解决这个问题。

2 个答案:

答案 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转换为先前制作的结构的单个实例。

我将在下面举例:

1。制作一个可将JSON放入其中的结构。


让我们以一个简单的博客帖子为例。

JSON对象如下所示,并具有slugtitledescription

{
  "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放入您的结构实例中。


发布请求的数据为请求“正文”。

在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