go - 如何修复对象错误时未定义“名称”?
问题描述
我正在使用 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))
}
身体好像不对。有什么办法可以修复代码。
解决方案
该错误消息可能是从您正在进行的 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
推荐阅读
- python - 如何记录数据帧上的频率分布图
- eclipse - 无法在 eclipse photon 中为 build-helper-maven-plugin 安装 m2e 连接器
- regex - 如何创建一个正则表达式以不超过一个周期进行验证
- apache-kafka - 如何控制聚合状态存储和更改日志主题的保留
- python - 从其他列表创建一个新的字典列表?
- c++ - 在 `std::set` 中修改用户定义类型的值
- node.js - 节点中的 Postgres 在冲突更新时插入
- c++ - 在运行时选择父类的实现
- macos - 编程打开 OSX System Preferences Extensions 窗格并锚定到 Finder 项目
- ios - 创建单独的文本字段效果