2015-08-10 12 views
7

Jestem nowicjuszem Go and Gin i mam problem z wydrukowaniem pełnej treści żądania.gin/golang - Empty Req Body

Chcę być w stanie odczytać treści żądania POST z trzeciej strony, ale jestem coraz pusty prośba ciało

curl -u dumbuser:dumbuserpassword -H "Content-Type: application/json" -X POST --data '{"events": "3"}' http://localhost:8080/events 

Cały mój kod jest jak poniżej. Każdy wskaźnik jest doceniany!

package main 

import (
    "net/http" 
    "fmt" 
    "github.com/gin-gonic/gin" 
) 

func main() { 
    router := gin.Default() 
    authorized := router.Group("/", gin.BasicAuth(gin.Accounts{ 
    "dumbuser": "dumbuserpassword", 
    })) 
    authorized.POST("/events", events) 
    router.Run(":8080") 
} 

func events(c *gin.Context) { 
    fmt.Printf("%s", c.Request.Body) 
    c.JSON(http.StatusOK, c) 
} 

Odpowiedz

14

Problem polega na tym, że jesteś drukując ciąg znaków, który jest c.Request.Body interfejsu typu ReadCloser.

Co możesz zrobić, aby upewnić się, że rzeczywiście zawiera ono pożądane ciało, to odczytać wartość z c.Request.Body na łańcuchu, a następnie wydrukować. Jest to tylko proces uczenia się!

kod Nauka:

func events(c *gin.Context) { 
     x, _ := ioutil.ReadAll(c.Request.Body) 
     fmt.Printf("%s", string(x)) 
     c.JSON(http.StatusOK, c) 
} 

Jednak to nie jest sposób, należy uzyskać dostęp do treści żądania. Pozwól, że gin wykona dla Ciebie analizę składu ciała, używając wiązania.

Więcej poprawny kod:

type E struct { 
     Events string 
} 

func events(c *gin.Context) { 
     data := &E{} 
     c.Bind(data) 
     fmt.Println(data) 
     c.JSON(http.StatusOK, c) 
} 

To jest bardziej poprawny sposób dostępu do danych w organizmie, ponieważ będzie już analizowany dla ciebie. Zauważ, że jeśli najpierw przeczytasz ciało, tak jak to zrobiliśmy wyżej w kroku nauki, c.Request.Body zostanie opróżnione, więc nic nie pozostanie w ciele, aby Gin mógł je przeczytać.

Złamane Kod:

func events(c *gin.Context) { 
    x, _ := ioutil.ReadAll(c.Request.Body) 
    fmt.Printf("%s", string(x)) 
    data := &E{} 
    c.Bind(data) // data is left unchanged because c.Request.Body has been used up. 
    fmt.Println(data) 
    c.JSON(http.StatusOK, c) 
} 

Jesteś prawdopodobnie również ciekawy dlaczego JSON zwrócony z tego punktu końcowego pokazów i pustym Request.Body. To z tego samego powodu. Metoda JSON Marshalling nie może serializować wartości ReadCloser, więc jest pusta.

+0

Dziękuję, Danver, które naprawdę pomogły i były edukacyjne. –

+1

Co należy zrobić, jeśli wiązanie się nie powiedzie? Ponieważ Czytelnik jest pusty, czy dane są po prostu tracone? – sean

+0

Ja też chciałbym poznać odpowiedź na pytanie Seana. –