我正在学习Golang,所以请原谅这可能是一个基本问题。我已经搜索了几个小时,寻找如何从我的golang应用程序在JSON格式的API POST中发送变量数据的线索,但还没有找到线索或解决方案。我知道答案将是我缺乏语法知识。
所以问题出在我试图POST的"lastcontact"字段上。我想使用包含当前日期时间的"dt"变量。
package main
import (
"fmt"
"strings"
"net/http"
"io/ioutil"
"time"
)
func main() {
dt := time.Now()
url := "https://fakeapi.io/API/apiActions/update/"
method := "POST"
payload := strings.NewReader(`{
"name" : "Dumpty",
"saveconfig" : "true",
"lastcontact" : {dt}
}`)
client := &http.Client {
}
req, err := http.NewRequest(method, url, payload)
if err != nil {
fmt.Println(err)
return
}
req.Header.Add("api-key", "gjhgjhgjhg")
req.Header.Add("api-secret", "jhgjhgjhg")
req.Header.Add("Content-Type", "application/json; charset=UTF-8")
res, err := client.Do(req)
if err != nil {
fmt.Println(err)
return
}
defer res.Body.Close()
body, err := ioutil.ReadAll(res.Body)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(body))
}
如果事先知道字段,则可以使用结构来存储响应类型。如果不这样做,可以使用map[string]interface{}
来存储任意数据。
然后使用json.Marshal
将其转换为格式正确的JSON响应。
type myStruct struct {
Name string `json:"name"`
SaveConfig string `json:"saveconfig"`
LastContact time.Time `json:"lastcontact"`
}
dt := time.Now()
myData := myStruct{
Name: "Dumpty",
SaveConfig: "true",
LastContact: dt,
}
myBytes, err := json.Marshal(myData)
// bytes.NewBuffer returns *bytes.Buffer
// which implements the io.Reader interface
// that you need for your http.NewRequest call
payload := bytes.NewBuffer(myBytes)
完整的操场示例https://play.golang.org/p/Mc9UXT32Wi1