Open robert-min opened 1 year ago
Get method 수신 후 Body 출력
func fetchRemoteResource(url string) ([]byte, error) {
r, err := http.Get(url)
if err != nil {
return nil, err
}
defer r.Body.Close()
return io.ReadAll(r.Body)
}
func main() { if len(os.Args) != 2 { fmt.Fprintf(os.Stdout, "Must specify a HTTP URL to get data from") }
body, err := fetchRemoteResource(os.Args[1])
if err != nil {
fmt.Fprintf(os.Stdout, "%v\n", err)
os.Exit(1)
}
fmt.Fprintf(os.Stdout, "%s\n", body)
}
httptest.NewServer
활용// Set test http server
func startTestHttpServer() *httptest.Server {
ts := httptest.NewServer(
http.HandlerFunc(
func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Hello World")
}))
return ts
}
func TestFetchRemoteResource(t *testing.T) {
ts := startTestHttpServer()
defer ts.Close()
expected := "Hello World"
data, err := fetchRemoteResource(ts.URL)
if err != nil {
t.Fatal(err)
}
if expected != string(data) {
t.Errorf("Expected response to be: %s, Got: %s", expected, data)
}
}
type pkgData struct {
Name string `json:"name"`
Version string `json:"version"`
}
func fetchPackageData(url string) ([]pkgData, error) {
var packages []pkgData
r, err := http.Get(url)
if err != nil {
return nil, err
}
defer r.Body.Close()
if r.Header.Get("Content-Type") != "application/json" {
return packages, nil
}
data, err := io.ReadAll(r.Body)
if err != nil {
return packages, err
}
err = json.Unmarshal(data, &packages)
return packages, err
}
func startTestPackageServer() *httptest.Server {
pkgData := `[
{"name": "package1", "version": "1.1"},
{"name": "package2", "version": "1.0"}
]`
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
fmt.Fprint(w, pkgData)
}))
return ts
}
func TestFetchPackageData(t *testing.T) {
ts := startTestPackageServer()
defer ts.Close()
packages, err := fetchPackageData(ts.URL)
if err != nil {
t.Fatal(err)
}
if len(packages) != 2 {
t.Fatalf("Expected 2 packages, Got back: %d", len(packages))
}
}
Chapter3. HTTP client
데이터 다운로드