首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用PUT在一个请求中更新多个JSON数据

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

Stack Overflow用户
提问于 2018-08-25 11:13:32
回答 1查看 751关注 0票数 0

我按照这个指南Developing a simple CRUD API with Go, Gin and Gorm在golang中构建了我的第一个RESTful服务,我可以从我的web服务中读取参数,并更新一个参数值,但如何在一次PUT请求中解析JSON来更新多个参数值。

我打算在测试中使用CURL命令,如下所示

代码语言:javascript
复制
$ curl -i -X PUT http://localhost:8080/params -d '{ [ {"id":"1","value": "10"}, {"id":"2","value": "20"}] }'

以下是我的代码

代码语言:javascript
复制
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"}'
}

任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

发布于 2018-08-25 17:40:57

首先,你的json是无效的。我猜这就是你想要的:

{"id":"1“,"value":"10"},{"id":"2”,"value":"20"}

一种更简单的解决方案是添加一个与您的json匹配的结构:

然后添加json.Unmarshal来解析json:

代码语言:javascript
复制
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)
}

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52013719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档