gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 03:10:54 34 4
gpt4 key购买 nike

我遵循了本指南 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"}'
}

感谢任何帮助。

最佳答案

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

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

关于json - 使用 PUT 在一个请求中更新多个 JSON 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52013719/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com