2015-08-10 24 views
7

Git ve Gin için yeniyim ve tüm istek gövdesini yazdırırken sorun yaşıyorum.gin/golang - Boş Req Gövde

Ben üçüncü şahıs POST istek gövdesini okuyabilecek olmak istiyorum ama boş istek gövdesi

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

Benim tüm kod aşağıdaki gibidir alıyorum. Herhangi bir işaret takdir edilir!

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) 
} 

cevap

14

burada sorun arayüz tipi ReadCloser taşımaktadır c.Request.Body dize değerini, çıktısını olmamız.

Gerçekte, istediğiniz gövdeyi içermesinin kendiniz için bir dize c.Request.Body değerini okuması ve bunu yazdırmanız gerektiği konusunda ne yapabilirsiniz? Bu sadece öğrenme süreciniz içindir!

Öğrenme kodu:

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

Ancak bu istek gövdesini erişmek gerekir yol değildir. Bir ciltleme kullanarak cinsten vücudun ayrışmasını yapalım.

Daha doğru kod: Zaten sizin için ayrıştırılır beri

type E struct { 
     Events string 
} 

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

Bu, vücutta verilere erişmek için daha doğru bir yoldur. Önce vücudu okursanız, öğrenme adımında yaptığımız gibi, c.Request.Body boşaltılacak ve böylece Cin'in okuması için vücutta hiçbir şey kalmayacak.

Kırık kodu: JSON bu uç nokta gösterileri ve boş Request.Body döndü neden

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) 
} 

Ayrıca muhtemelen meraklısın. Bu aynı nedenden dolayı. JSON Marshalling yöntemi bir ReadCloser serileştiremiyor ve bu nedenle boş olarak görünüyor.

+0

Teşekkür ederim, Danver, bu gerçekten yardımcı oldu ve eğiticiydi. –

+1

Bağlama başarısız olursa ne yapmalı? Okuyucu boşaltıldığından bu veriler basitçe kayboluyor mu? – sean

+0

Ben de sean'ın sorusunun cevabını bilmek istiyorum. –

İlgili konular