Golang中HTTP响应为何只显示部分消息
Golang中HTTP响应为何只显示部分消息 我在 Golang 和 Node.js 上执行了完全相同的请求,但 Golang 的响应比 Node.js 的要短得多。以下是我的 Go 代码:
url := "https://qawe.ua/secure/rest/example/pay/12/500000"
client := &http.Client{}
req, err := http.NewRequest("GET", url, nil)
req.SetBasicAuth(username, passwd)
req.Header.Set("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8")
req.Header.Set("Token", token)
resp, err := client.Do(req)
if err != nil {
log.Fatal(err)
}
以及我的响应:
2019/03/24 23:41:23 &{200 OK 200 HTTP/1.1 1 1 map[Expires:[Thu, 01 Jan 1970 00:00:00 GMT]
Server:[nginx/1.14.2] Date:[Sun, 24 Mar 2019 17:41:23 GMT] Content-Type:
[application/json;charset=utf-8] Content-Length:[206] X-Powered-By:[Servlet/3.1 JSP/2.3 (GlassFish
Server Open Source Edition 5.0.1 Java/Oracle Corporation/1.8)] Cache-Control:[no-cache, no-
store, must-revalidate] Connection:[keep-alive] Pragma:[no-cache] Set-Cookie:
[JSESSIONID=0caf0170e89cf5cb716c80739dbf; Path=/secure; Secure; HttpOnly] Access-Control-
Allow-Origin:[*]] 0xc00005e100 206 [] false false map[] 0xc0000f8000 0xc0000c3130}
而在 Node.js 中返回的信息要多得多。
更多关于Golang中HTTP响应为何只显示部分消息的实战教程也可以访问 https://www.itying.com/category-94-b0.html
天啊,谢谢,我不知道我们需要显式读取响应的正文,是的,Node JS 会一次性返回头部、正文等内容。
更多关于Golang中HTTP响应为何只显示部分消息的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
也许在节点中的调用也显示了响应体。但在这里你必须显式地读取它。不过由于我们不清楚节点中返回了什么内容,所以很难判断。
这取决于您想用它做什么。您可以将其解组到一个 interface{} 的映射中,但在读取字段之前需要将它们转换为正确的类型。我使用 https://mholt.github.io/json-to-go/ 这个工具,它能根据 JSON 自动生成相应的结构体。
在Golang中,HTTP响应体需要通过读取响应体内容来获取完整数据,而不仅仅是打印响应结构体。您只看到了响应头信息,但没有读取响应体。以下是修正后的代码:
url := "https://qawe.ua/secure/rest/example/pay/12/500000"
client := &http.Client{}
req, err := http.NewRequest("GET", url, nil)
if err != nil {
log.Fatal(err)
}
req.SetBasicAuth(username, passwd)
req.Header.Set("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8")
req.Header.Set("Token", token)
resp, err := client.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Status: %s\n", resp.Status)
fmt.Printf("Headers: %v\n", resp.Header)
fmt.Printf("Body: %s\n", string(body))
关键点:
- 使用
defer resp.Body.Close()确保响应体正确关闭 - 使用
io.ReadAll(resp.Body)读取完整的响应体内容 - 需要导入
io包
您之前看到的输出只是响应结构体的字符串表示,其中包含了HTTP状态码、头部信息,但没有包含实际的响应体数据。通过读取 resp.Body,您将获得与Node.js中相同的完整响应内容。


