robert-min / handson-go

Go-lang hands on guide
0 stars 0 forks source link

Chapter3. HTTP client - Data Download, deserialization(unmarshalling) #8

Open robert-min opened 1 year ago

robert-min commented 1 year ago

Chapter3. HTTP client

데이터 다운로드

robert-min commented 1 year ago

데이터 다운로드 코드 작성

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)

}

robert-min commented 1 year ago

date download test 코드 작성

// 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)
    }
}
robert-min commented 1 year ago

Chapter3. HTTP client - 데이터 역질렬화

robert-min commented 1 year ago

데이터 unmarshalling

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
}
robert-min commented 1 year ago

데이터 unmarshalling - pkgquery test code 작성

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))
    }
}