///
Search

07_Restful API(3)

Restful하게 Delete 작성

/myapp/app_test.go

package myapp import ( "encoding/json" "io/ioutil" "net/http" "net/http/httptest" "strconv" "strings" "testing" "github.com/stretchr/testify/assert" ) func TestIndex(t *testing.T) { assert := assert.New(t) ts := httptest.NewServer(NewHandler()) defer ts.Close() resp, err := http.Get(ts.URL) assert.NoError(err) assert.Equal(http.StatusOK, resp.StatusCode) data, _ := ioutil.ReadAll(resp.Body) assert.Equal("Hello World", string(data)) } func TestUsers(t *testing.T) { assert := assert.New(t) ts := httptest.NewServer(NewHandler()) defer ts.Close() resp, err := http.Get(ts.URL + "/users") assert.NoError(err) assert.Equal(http.StatusOK, resp.StatusCode) data, _ := ioutil.ReadAll(resp.Body) assert.Contains(string(data), "Get UserInfo") } func TestGetUserInfo(t *testing.T) { assert := assert.New(t) ts := httptest.NewServer(NewHandler()) defer ts.Close() resp, err := http.Get(ts.URL + "/users/89") assert.NoError(err) assert.Equal(http.StatusOK, resp.StatusCode) data, _ := ioutil.ReadAll(resp.Body) assert.Contains(string(data), "No User Id:89") resp, err = http.Get(ts.URL + "/users/56") assert.NoError(err) assert.Equal(http.StatusOK, resp.StatusCode) data, _ = ioutil.ReadAll(resp.Body) assert.Contains(string(data), "No User Id:56") } func TestCreateUser(t *testing.T) { assert := assert.New(t) ts := httptest.NewServer(NewHandler()) defer ts.Close() resp, err := http.Post(ts.URL+"/users", "application/json", strings.NewReader(`{"first_name":"tucker", "last_name":"kim", "email":"tucker@naver.com"}`)) assert.NoError(err) assert.Equal(http.StatusCreated, resp.StatusCode) user := new(User) err = json.NewDecoder(resp.Body).Decode(user) assert.NoError(err) assert.NotEqual(0, user.ID) id := user.ID resp, err = http.Get(ts.URL + "/users/" + strconv.Itoa(id)) assert.NoError(err) assert.Equal(http.StatusOK, resp.StatusCode) user2 := new(User) err = json.NewDecoder(resp.Body).Decode(user2) assert.NoError(err) assert.Equal(user.ID, user2.ID) assert.Equal(user.FirstName, user2.FirstName) } func TestDeleteUser(t *testing.T) {//여기서 부터 시작 assert := assert.New(t) ts := httptest.NewServer(NewHandler()) defer ts.Close() req, _ := http.NewRequest("DELETE", ts.URL+"/users/1", nil) resp, err := http.DefaultClient.Do(req) //Delete는 따로 get이랑 Post처럼 정해져 있지를 않고 이렇게 작성을 해야한다. assert.NoError(err) assert.Equal(http.StatusOK, resp.StatusCode) data, _ := ioutil.ReadAll(resp.Body) assert.Contains(string(data), "No User ID:1") resp, err = http.Post(ts.URL+"/users", "application/json", strings.NewReader(`{"first_name":"tucker", "last_name":"kim", "email":"tucker@naver.com"}`)) assert.NoError(err) assert.Equal(http.StatusCreated, resp.StatusCode) user := new(User) err = json.NewDecoder(resp.Body).Decode(user) assert.NoError(err) assert.NotEqual(0, user.ID) req, _ = http.NewRequest("DELETE", ts.URL+"/users/1", nil) resp, err = http.DefaultClient.Do(req) assert.NoError(err) assert.Equal(http.StatusOK, resp.StatusCode) data, _ = ioutil.ReadAll(resp.Body) assert.Contains(string(data), "Deleted User ID:1") }
Go
복사

/myapp/app.go

package myapp import ( "encoding/json" "fmt" "net/http" "strconv" "time" "github.com/gorilla/mux" ) // User struct type User struct { ID int `json:"id"` FirstName string `json:"first_name"` LastName string `json:"last_name"` Email string `json:"email"` CreatedAt time.Time `json:"created_at"` } var userMap map[int]*User var lastID int func indexHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, "Hello World") } func usersHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, "Get UserInfo by /users/{id}") } func getUserInfoHandler(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) id, err := strconv.Atoi(vars["id"]) if err != nil { w.WriteHeader(http.StatusBadRequest) fmt.Fprint(w, err) return } user, ok := userMap[id] if !ok { w.WriteHeader(http.StatusOK) fmt.Fprint(w, "No User Id:", id) return } w.Header().Add("Content-Type", "application/json") w.WriteHeader(http.StatusOK) data, _ := json.Marshal(user) fmt.Fprint(w, string(data)) } func createUserHandler(w http.ResponseWriter, r *http.Request) { user := new(User) err := json.NewDecoder(r.Body).Decode(user) if err != nil { w.WriteHeader(http.StatusBadRequest) fmt.Fprint(w, err) return } // Created User lastID++ user.ID = lastID user.CreatedAt = time.Now() userMap[user.ID] = user w.Header().Add("Content-Type", "application/json") w.WriteHeader(http.StatusCreated) data, _ := json.Marshal(user) fmt.Fprint(w, string(data)) } func deleteUserHandler(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) id, err := strconv.Atoi(vars["id"]) if err != nil { w.WriteHeader(http.StatusBadRequest) fmt.Fprint(w, err) return } _, ok := userMap[id] if !ok { w.WriteHeader(http.StatusOK) fmt.Fprint(w, "No User ID:", id) return } delete(userMap, id) w.WriteHeader(http.StatusOK) fmt.Fprint(w, "Deleted User ID:", id) } // NewHandler make a new myapp handler func NewHandler() http.Handler { userMap = make(map[int]*User) lastID = 0 mux := mux.NewRouter() mux.HandleFunc("/", indexHandler) mux.HandleFunc("/users", usersHandler).Methods("GET") mux.HandleFunc("/users", createUserHandler).Methods("POST") mux.HandleFunc("/users/{id:[0-9]+}", getUserInfoHandler).Methods("GET") mux.HandleFunc("/users/{id:[0-9]+}", deleteUserHandler).Methods("DELETE") return mux }
Go
복사

/main.go

package main import ( "net/http" "github.com/GloryKim/goWeb/web7/myapp" ) func main() { http.ListenAndServe(":3000", myapp.NewHandler()) }
Go
복사