postman 如何设置Golang API在创建/发布一个新条目时接收一个对象数组?可以用map[string]接口实现吗?

bq9c1y66  于 2022-12-04  发布在  Postman
关注(0)|答案(1)|浏览(106)

我是Go的新手,我在使用Gin的API正确返回信息时遇到了麻烦。我正在使用Postman来POST一个新条目,每次都为Phone对象和一个Logs对象数组创建一个新的UUID。它只返回了phone对象的信息。第二个对象数组返回了0值和一个在Postman中创建的201状态。我只使用POST方法。
我已经重构了它很多次,这是我所得到的最接近的。我仍然不认为它允许我在数组中接收多个日志对象作为响应。我该如何修复这个问题?是否可以使用map[string]interface{}来完成此操作?

这是我当前的代码

package main

import (
"net/http"
"time"

"github.com/gin-gonic/gin"
"github.com/google/uuid"
)

// For id of log
type ID struct {
ID string `json:"id"`
}

// Phone Models
type Phone struct {
ID    string `json:"id"`
Model string `json:"model"`
Type  string `json:"type"`
}

type Logs struct {
Barcode        int       `json:"barcode"`
Created        time.Time `json:"created"`
Present        int       `json:"present"`
ElectricEnergy int       `json:"electricEnergy"`
Power          int       `json:"power"`
TimeCharged    int       `json:"timeCharged"`
AmountUsed     int       `json:"amountUsed"`
}

func createPhoneLog(c *gin.Context) {

var newDevice Phone
if err := c.ShouldBindJSON(&newDevice); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}

phones := Phone{
ID:    newDevice.ID,
Model: newDevice.Model,
Type:  newDevice.Type,
}

var newPhoneRecord Logs
// if err := c.ShouldBindJSON(&newPhoneRecord); err != nil {
// c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
// return
// }

r := &Logs{
Barcode:        newPhoneRecord.Barcode,
Created:        newPhoneRecord.Created,
Present:        newPhoneRecord.Present,
ElectricEnergy: newPhoneRecord.ElectricEnergy,
Power:          newPhoneRecord.Power,
TimeCharged:    newPhoneRecord.TimeCharged,
AmountUsed:     newPhoneRecord.AmountUsed,
}

type deviceWrapper struct {
ID    string `json:"id"`
Phone Phone  `json:"phone"`
Logs  Logs   `json:"logs"`
}

//Generate new UUID
var newDeviceLogID ID
newDeviceLogID.ID = uuid.New().String()

c.JSON(http.StatusCreated, &deviceWrapper{
ID:    newDeviceLogID.ID,
Phone: phones,
Logs:  *r,
})
}

func main() {
router := gin.Default()
router.POST("/", createPhoneLog)
router.Run("0.0.0.0:8080")
}

`

* 这就是我在 Postman 身上看到的东西 *

Postman Response for Create Method

这是我需要看到的回应

我希望能够以这种格式接收这些对象中的所有信息。

{
   "id": "PJDNSOfieC67GswNeUfYouhTSVS",
   "phone": {
   "id": "22DHOIRTNBKL5643",
   "model": "iPhoneX",
   "type": "1TB"
},
"logs": [
{
   "barcode": 12904HGJ3403,
   "created": 2,
   "present": 3,
   "electricEnergy": 4,
   "power": 5,
   "timeCharged": 1554,
   "amountUsed":54
},
 {
   "barcode": 129739394276,
   "created": 0001-01-01T00:00:00Z,
   "present": 5,
   "electricEnergy": 2,
   "power": 6,
   "timeCharged": 1127,
   "amountUsed":92
  }
 ]
}
vptzau2j

vptzau2j1#

您可以使用需要接受的值创建一个新的结构体,就像deviceWrapper一样。
例如:
type res { Id字符串json:"id"电话电话json:"phone"日志[]日志json:"log"}

相关问题