2 回答
TA贡献1864条经验 获得超2个赞
正如@Cerise Limón 所说,你打resp.Body.Close()了两次电话,然后尝试阅读封闭的身体。要修复您的代码,您可以从GetData函数中删除主体处理并在外部执行GetData或返回主体而不在测试中读取它。
main.go:
package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
)
var Client = &http.Client{}
func main() {
url := "https://httpbin.org/get"
status, data, err := GetData(url)
if err != nil {
log.Fatalln(err)
}
fmt.Println(status)
fmt.Println(string(data))
}
func GetData(url string) (status string, body []byte, err error) {
req, err := http.NewRequest(http.MethodGet, url, nil)
if err != nil {
return
}
resp, err := Client.Do(req)
if err != nil {
return
}
defer resp.Body.Close()
body, err = ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatalln(err)
}
return resp.Status, body, nil
}
main_test.go:
package main
import (
"fmt"
"net/http"
"net/http/httptest"
"testing"
)
func TestYourHTTPGet(t *testing.T){
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, `response from the mock server goes here`)
}))
defer ts.Close()
mockServerURL := ts.URL
status, data, err := GetData(mockServerURL)
if err != nil {
fmt.Println("Error 1: ", err)
}
fmt.Println(status)
fmt.Println(string(data))
}
TA贡献1810条经验 获得超4个赞
你GetData()的 return 是一个指针。你跑GetData()进去main.go,retun时,它会关闭resp.body。如果你再读一遍,它会导致http: read on closed response body
所以如果你想再次阅读正文,你不应该返回*http.Response,你应该克隆resp.body返回
- 2 回答
- 0 关注
- 168 浏览
添加回答
举报
