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

5 回复

天啊,谢谢,我不知道我们需要显式读取响应的正文,是的,Node JS 会一次性返回头部、正文等内容。

更多关于Golang中HTTP响应为何只显示部分消息的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


除了创建结构体并将JSON解码到其中之外,有没有更好的处理响应体的方法?

也许在节点中的调用也显示了响应体。但在这里你必须显式地读取它。不过由于我们不清楚节点中返回了什么内容,所以很难判断。

这取决于您想用它做什么。您可以将其解组到一个 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))

关键点:

  1. 使用 defer resp.Body.Close() 确保响应体正确关闭
  2. 使用 io.ReadAll(resp.Body) 读取完整的响应体内容
  3. 需要导入 io

您之前看到的输出只是响应结构体的字符串表示,其中包含了HTTP状态码、头部信息,但没有包含实际的响应体数据。通过读取 resp.Body,您将获得与Node.js中相同的完整响应内容。

回到顶部