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 關注
- 126 瀏覽
添加回答
舉報