使用PUT在一个请求中更新多个JSON数据

时间:2018-08-25 03:13:32

标签: json rest go go-gin

我按照本指南Developing a simple CRUD API with Go, Gin and Gorm在golang中构建了我的第一个RESTful服务,我可以从Web服务读取参数,并更新一个参数值,但是如何解析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 :(得分:1)

首先,您的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)
}

然后将其添加到您的逻辑中。