Http 将CURL转换为Golang代码

Http 将CURL转换为Golang代码,http,curl,go,Http,Curl,Go,我正试图在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代码: da

我正试图在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"}

你的身体就是你所想的,它只是以一种意想不到的形式印在你面前

返回指向结构类型的指针。当您使用打印它时,它使用的文件包中定义的格式规则,即指向struct的指针打印为
&{}
,并在其中枚举字段的值。这就是你看到的<代码>字节。读卡器将其提供的数据存储在字节片中:

[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"}
&{[123 34 114 102 114 73 68 34 58 34 49 49 49 49 49 49 34 125] 0 -1}
{"rfrID":"111111"}
从该读卡器中读取将提供精确的字符串,如本例所示:

r := bytes.NewReader(data)
fmt.Println(r)
readData, err := ioutil.ReadAll(r)
if err != nil {
    panic(r)
}
fmt.Println(string(readData))
输出:

{"rfrID":"111111"}
&{[123 34 114 102 114 73 68 34 58 34 49 49 49 49 49 49 34 125] 0 -1}
{"rfrID":"111111"}
请在桌面上尝试这些示例

分歧 让我们检查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))
卷曲:

2017/10/10 10:17:26方法:获取
2017/10/10 10:17:26标题:映射[内容长度:[19]用户代理:[curl/7.47.0]接受:[*/*]内容类型:[application/json]Web2py用户令牌:[令牌字符串]]
2017/10/10 10:17:26表格:地图[]
2017/10/10 10:17:26正文:[123 34 114 102 114 73 68 34 58 32 34 49 49 125]
2017/10/10 10:17:26正文字符串:{“rfrID”:“111111”}
Go客户端:

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"}
2017/10/10 10:17:20方法:获取
2017/10/10 10:17:20标题:映射[用户代理:[Go http client/1.1]内容长度:[18]内容类型:[application/json]Web2py用户令牌:[令牌字符串]接受编码:[gzip]]
2017/10/10 10:17:20表格:地图[]
2017/10/10 10:17:20正文:[12334114102114736834583449125]
2017/10/10 10:17:20正文字符串:{“rfrID”:“111111”}

尽管客户端自动添加了一些标题,JSON字符串中有一个空格(仅格式化无效),但它们是相同的。

显示您迄今为止尝试过的内容。这可能有用:谢谢,我添加了更多代码并尝试了该链接,但仍然没有发现yetMy CURL命令是GET命令。它与JSON主体一起工作,并向我返回预期结果。我百分之百确信供应商的文档说明了一个GET和声明的主体。@RutgerHuijsmans添加了测试以显示差异。除了一些微不足道的差异外,它们是相同的。谢谢你!现在完全有道理了。