首页 > 解决方案 > 如何修复对象错误时未定义“名称”?

问题描述

我正在使用 Go 向 bigpanda 发出 API 发布请求。

https://docs.bigpanda.io/reference#create-plan

我有以下代码,当我尝试使 API 发布获取name对象undefined错误时。

2019/08/23 18:38:04 {
  "status" : "failure",
  "error" : "{\"obj\":[{\"msg\":[\"'name' is undefined on object: {\\\"maintenance_plan\\\":{\\\"name\\\":\\\"\\\\\\\"name\\\\\\\": \\\\\\\"scheduled host maintenance\\\\\\\",\\\",\\\"condition\\\":\\\"\\\\\\\"condition\\\\\\\": {\\\\\\\"=\\\\\\\": [\\\\\\\"host\\\\\\\", \\\\\\\"prod-api-1\\\\\\\"]},\\\",\\\"start\\\":\\\"\\\\\\\"start\\\\\\\": \\\\\\\"1566514810\\\\\\\",\\\",\\\"end\\\":\\\"\\\\\\\"end\\\\\\\": \\\\\\\"156651600\\\\\\\"\\\"}}\"],\"args\":[]}]}"
}
package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
)


type Maintenace_Plan struct {
    Name       string `json:"name"`
    //Condition  map[string]map[string][]string  `json:condition`
    Condition   string `json:"condition"`
    Start      string `json:"start"`
    End        string `json:"end"`
}


type Payload struct {
    Maintenace_Plan Maintenace_Plan `json:"maintenance_plan"`
}

func main() {
    name        := `"name": "scheduled host maintenance",`
    create_plan :=  `"condition": {"=": ["host", "prod-api-1"]},`
    start_time  := `"start": "1566514810",`
    end_time    := `"end": "156651600"`

    data := Payload{
        Maintenace_Plan: Maintenace_Plan{
            Name:       name,
            Condition:  create_plan,
            Start:      start_time,
            End:        end_time,
        },
    }

    payloadBytes, err := json.Marshal(data)
    if err != nil {
        fmt.Println(err)
    }
    body := bytes.NewReader(payloadBytes)

    req, err := http.NewRequest("POST", "https://api.bigpanda.io/resources/v2.0/maintenance-plans", body)

    if err != nil {
        log.Fatal(err)
    }

    req.Header.Set("Content-Type", "application/json")
    req.Header.Set("Authorization", "Bearer <token>")

    resp, err := http.DefaultClient.Do(req)

    defer resp.Body.Close()

    body_1, err := ioutil.ReadAll(resp.Body)

    if err != nil {
        log.Fatal(err)
    }

    log.Println(string(body_1))

}

身体好像不对。有什么办法可以修复代码。

标签: go

解决方案


该错误消息可能是从您正在进行的 API 调用而不是 JSON Marshal 返回的。我怀疑这是由于您编组有效负载的方式 - 您将 JSON 写入字段,然后 JSON 编组它,因此您最终得到的有效负载如下所示:

{"maintenance_plan":{"name":"\"name\": \"scheduled host maintenance\",","condition":"\"condition\": {\"=\": [\"host\", \"prod-api-1\"]},","start":"\"start\": \"1566514810\",","end":"\"end\": \"156651600\""}}

注意双“名称:”\name\“。

解决它的方法是执行以下操作:

data := Payload{
   MaintenancePlan: MaintenancePlan{
      Name: "scheduled host maintenance",
      Condition: map[string][]string{
         "=": []string{"host", "prod-api-1"},
      },
      StartTime: "1566514810",
      EndTime: "156651600",
   },
}

var buf bytes.Buffer
err := json.NewEncoder(&buf).Encode(data)
if err != nil {
  // Handle me
}
req, err := http.NewRequest(http.MethodPost, "https://foo/bar", &buf)
// continue

示例: https: //play.golang.org/p/J6wrsLYkvwF


推荐阅读