Использование PUT для обновления нескольких данных JSON в одном запросе - PullRequest
0 голосов
/ 25 августа 2018

Я следовал этому руководству Разработка простого CRUD API с Go, Gin и Gorm для создания моего первого сервиса RESTful в golang, я могу читать параметры из моего веб-сервиса и обновлять одно значение:параметр, но как проанализировать JSON для обновления нескольких значений параметров в одном запросе PUT.

Команда CURL, которую я намерен использовать для моего теста, как показано ниже

$ curl -i -X PUT http://localhost:8080/params -d '{ [ {"id":"1","value": "10"}, {"id":"2","value": "20"}] }'

Ниже приведен мой код

package main

import (
    "fmt"
    "log"

    "github.com/gin-contrib/cors"
    "github.com/gin-gonic/gin"
    "github.com/jinzhu/gorm"

    _ "github.com/go-sql-driver/mysql"
)

type Param struct {
    ID    int    `json:"id" `
    Name  string `json:"name"`
    Title string `json:"title"`
    Value string `json:"value"`
}

type ParamValue struct {
    ID int `json:"id" `
    // Name  string `json:"name"`
    // Title string `json:"title"`
    Value string `json:"value"`
}

var db *gorm.DB
var err error

func main() {

    db, err = gorm.Open("mysql", "user:password@tcp(127.0.0.1:3306)/test?charset=utf8&parseTime=True&loc=Local")

    defer db.Close()

    if err != nil {
        log.Panic(err.Error())
    }

    db.AutoMigrate(&Param{})

    r := gin.Default()

    r.GET("/params", GetParams)
    r.GET("/params/:id", GetParam)
    r.PUT("/params/:id", UpdateParam)
    r.PUT("/params", UpdateParams) // How to implement this one

    r.Use(cors.Default())
    r.Run()
}

func GetParams(c *gin.Context) {
    var params []Param
    if err := db.Find(&params).Error; err != nil {
        c.AbortWithStatus(404)
    } else {
        c.JSON(200, params)
    }
}

func GetParam(c *gin.Context) {
    id := c.Params.ByName("id")
    var param Param
    if err := db.Where("id = ?", id).First(&param).Error; err != nil {
        c.AbortWithStatus(404)
    } else {
        c.JSON(200, param)
    }
}

func UpdateParams(c *gin.Context) {
    // Debug info
    fmt.Println("c.Request.Method >> " + c.Request.Method)
    fmt.Println("c.Request.URL.String() >> " + c.Request.URL.String())
    // command for testing
    // $ curl -i -X PUT http://localhost:8080/params -d '{ [ {"id":"1","value": "10"}, {"id":"2","value": "20"}] }'
}

func UpdateParam(c *gin.Context) {
    var param Param
    id := c.Params.ByName("id")

    if err := db.Where("id = ?", id).First(&param).Error; err != nil {
        c.AbortWithStatus(404)
    } else {
        name := param.Name // readonly
        c.BindJSON(&param)
        if param.Name != name { // if changed
            param.Name = name   // restore the origin
        }
        db.Save(&param)
        c.JSON(200, param)
    }

    // $ curl -i -X PUT http://localhost:8080/params/63 -d '{ "name": "recharge", "title": "switch 0/1:on/off", "value": "1"}'
}

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 25 августа 2018

Прежде всего, вы, JSON, недействительны. Я думаю, что это то, что вы хотели:

[{"id": "1", "value": "10"}, {"id": "2", "value": "20"}]

более простым решением будет добавить структуру, соответствующую вашему json:

и затем добавьте json.Unmarshal для анализа json:

jsn := `[{"id":"1" ,"value": "10"}, {"id":"2" ,"value": "20"}]`
var data yourSturctName
json.Unmarshal([]byte(jsn), &data)
for _, r := range data {
    fmt.Printf("ID:%s Value:%s", r.ID, r.Value)
}

затем добавьте это в свою логику.

...