我试图在Golang中执行这个确切的CURL命令:
curl -X GET -H "Content-Type: application/json" -H "WEB2PY-USER-TOKEN: token-string" -d '{"rfrID": "111111"}' 'url-string'
它有点奇怪,因为它是一个带JSON主体的GET HTTP调用。但是,我们的供应商要求我们这样调用API。我无法弄清楚如何让我们的Golang程序执行此API。
这是我迄今为止尝试过的Go代码:
data := Payload{
// fill struct
RfrID: "111111",
}
payloadBytes, err := json.Marshal(data)
if err != nil {
// handle err
}
body := bytes.NewReader(payloadBytes)
log.Printf("[INFO] Input body status: %v\n", body)
req, err := http.NewRequest("GET", "url-string", body)
if err != nil {
// handle err
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Web2py-User-Token", "token-string")
resp, err := http.DefaultClient.Do(req)
if err != nil {
// handle err
}
log.Printf("[INFO] Artemis status: %v\n", resp)
defer resp.Body.Close()
在我的日志中打印以下内容:
2017/10/10 07:31:56 [INFO] Input body status: &{[123 34 114 102 114 73 68 34 58 34 49 49 49 49 49 49 34 125] 0 -1}
我希望这个身体像JSON一样:
{"rfrID": "111111"}
答案 0 :(得分:3)
你的身体就是你想象的那样,它只是以一种意想不到的形式打印给你。
bytes.NewReader()
返回指向结构类型bytes.Reader
的指针。当您使用log.Printf()
打印它时,它使用fmt
的包文档中定义的格式规则,即,指向struct的指针打印为&{}
,并在其中枚举的字段值。这就是你所看到的。 bytes.Reader
将它提供的数据存储在字节切片中:
[123 34 114 102 114 73 68 34 58 34 49 49 49 49 49 49 34 125]
此字节切片等效于您期望的JSON字符串。验证:
data := []byte{123, 34, 114, 102, 114, 73, 68, 34, 58, 34, 49, 49, 49, 49, 49, 49, 34, 125}
fmt.Println(string(data))
输出:
{"rfrID":"111111"}
从这个阅读器中读取将提供这个确切的字符串,如本例所示:
r := bytes.NewReader(data)
fmt.Println(r)
readData, err := ioutil.ReadAll(r)
if err != nil {
panic(r)
}
fmt.Println(string(readData))
输出:
&{[123 34 114 102 114 73 68 34 58 34 49 49 49 49 49 49 34 125] 0 -1}
{"rfrID":"111111"}
在Go Playground上尝试这些示例。
让我们检查一下CURL命令和你编写的客户端之间的区别,这个小应用程序将成为目标:
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
log.Println("Method:", r.Method)
log.Println("Headers:", r.Header)
log.Println("Form:", r.Form)
data, err := ioutil.ReadAll(r.Body)
log.Println("Body:", data, err)
log.Println("Body string:", string(data))
})
panic(http.ListenAndServe(":8080", nil))
CURL:
2017/10/10 10:17:26 Method: GET
2017/10/10 10:17:26 Headers: map[Content-Length:[19] User-Agent:[curl/7.47.0] Accept:[*/*] Content-Type:[application/json] Web2py-User-Token:[token-string]]
2017/10/10 10:17:26 Form: map[]
2017/10/10 10:17:26 Body: [123 34 114 102 114 73 68 34 58 32 34 49 49 49 49 49 49 34 125] <nil>
2017/10/10 10:17:26 Body string: {"rfrID": "111111"}
去客户:
2017/10/10 10:17:20 Method: GET
2017/10/10 10:17:20 Headers: map[User-Agent:[Go-http-client/1.1] Content-Length:[18] Content-Type:[application/json] Web2py-User-Token:[token-string] Accept-Encoding:[gzip]]
2017/10/10 10:17:20 Form: map[]
2017/10/10 10:17:20 Body: [123 34 114 102 114 73 68 34 58 34 49 49 49 49 49 49 34 125] <nil>
2017/10/10 10:17:20 Body string: {"rfrID":"111111"}
尽管客户端自动添加了一些标头,并且JSON字符串中的空格(仅对格式化没有影响),但它们是相同的。