Перейти Gin-Gonic, получить текст из запроса POST

Я начинаю разрабатывать REST API, используя Go и пакет Gin-Gonic. Идея состоит в том, чтобы создать REST API, который принимает запросы POST в формате JSON и перенаправляет этот вызов в другое приложение (также API). Вот кусок кода:

package main

import (
    "fmt"

    "github.com/gin-gonic/gin"
    "net/http"
)
func main() {
    r := gin.Default()
    r.GET("/status", func(c *gin.Context) {
        c.String(200, "on")
    })

    r.GET("/user/:name", func(c *gin.Context) {
        name := c.Param("name")
        c.String(http.StatusOK, "Hello %s", name)
    })

    r.GET("/user/:name/:action", func(c *gin.Context) {
        name := c.Param("name")
        action := c.Param("action")
        message := name + " is " + action
        c.String(http.StatusOK, message)
    })

    r.POST("/foo", func(c *gin.Context) {
        fmt.Printf("%s", "At least I got here")
        message := c.PostForm() //???
        c.JSON(200, gin.H{"status": message}) //???
    })
    r.Run(":8080") // listen an
}

В функции r.Posts("/foo",...) я хочу, чтобы c.JSON отправил мне обратно полный JSON, который я отправил:

curl -H "Content-Type: application/json" -X POST -d '{"user":"xyz","password":"xyz"}' http://localhost:8080/foo

Я видел примеры, в которых они связывают файл JSON, создавая структуру с той же структурой, что и входной JSON (см. Примеры Gin-Gonic на https://github.com/gin-gonic/gin). Однако мне нужно только повторно отправить полную строку, не заботясь о формате. Любые идеи?


person Salami    schedule 15.02.2017    source источник
comment
Я закончил тем, что создал структуру и проанализировал свой json на структуру. Насколько я знаю, я просто не могу получить JSON.   -  person Salami    schedule 12.04.2017


Ответы (2)


Попробуйте этот пример:

package main

import (
    "fmt"

    "github.com/gin-gonic/gin"
    "net/http"
)

type LOGIN struct{
    USER string `json:"user" binding:"required"`
    PASSWORD string `json:"password" binding:"required"`
}

func main() {
    r := gin.Default()
    r.GET("/status", func(c *gin.Context) {
        c.String(200, "on")
    })

    r.GET("/user/:name", func(c *gin.Context) {
        name := c.Param("name")
        c.String(http.StatusOK, "Hello %s", name)
    })

    r.GET("/user/:name/:action", func(c *gin.Context) {
        name := c.Param("name")
        action := c.Param("action")
        message := name + " is " + action
        c.String(http.StatusOK, message)
    })

    r.POST("/foo", func(c *gin.Context) {
        var login LOGIN
        c.BindJSON(&login)
        c.JSON(200, gin.H{"status": login.USER}) // Your custom response here
    })
    r.Run(":8080") // listen for incoming connections
}
person mstafkmx    schedule 15.02.2017
comment
Это означает, что в моем JSON есть поля пользователя и пароля, это не может быть какой-либо JSON. Например. если мне нужен JSON, например {time: 23, space: xyz}, этот код не будет работать. Я хочу получать и отправлять необработанный текст. Возможно ли такое в Gin Gonic? - person Salami; 15.02.2017
comment
Почему элементы структуры всегда должны начинаться с заглавных букв? - person Nidhin David; 13.07.2017
comment
@NidhinDavid, потому что вы хотите, чтобы они были общедоступными, и вы хотите их декодировать. Если они частные, декодер JSON не сможет этого сделать (они ему недоступны) - person Daniel Shterenberg; 20.07.2019

Я закончил тем, что создал структуру для синтаксического анализа моего JSON, затем я сделал некоторые необходимые вычисления и, наконец, я повторно отправил данные, анализирующие мой JSON, на строку с помощью json.Marshal. Я думаю, имеет смысл разобрать JSON, это способ проверить правильность полученной информации.

person Salami    schedule 23.02.2017