package main import ( "fmt" "log" "net/http" "net/url" "myapp/api" "myapp/domain/model" ) const base = "http://localhost:8080" func main() { accessToken, err := authenticate("admin", "admin") if err != nil { log.Fatal(err) } log.Printf("Access Token:\n%q", accessToken) todo, err := createTodo(accessToken, "test todo title", "test todo body contents") if err != nil { log.Fatal(err) } log.Printf("Todo Created:\n%#+v", todo) } func authenticate(username, password string) ([]byte, error) { endpoint := base + "/signin" data := make(url.Values) data.Set("username", username) data.Set("password", password) resp, err := Form(http.MethodPost, endpoint, data) if err != nil { return nil, err } accessToken, err := RawResponse(resp) return accessToken, err } func createTodo(accessToken []byte, title, body string) (model.Todo, error) { var todo model.Todo endpoint := base + "/todos" req := api.TodoRequest{ Title: title, Body: body, } resp, err := JSON(http.MethodPost, endpoint, req, WithAccessToken(accessToken)) if err != nil { return todo, err } if resp.StatusCode != http.StatusCreated { rawData, _ := RawResponse(resp) return todo, fmt.Errorf("failed to create a todo: %s", string(rawData)) } err = BindResponse(resp, &todo) return todo, err }