///
Search

06_Restful API(2)

Restful하게 Post 작성

/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()//여기까지 동일 //post시작 resp, err := http.Post(ts.URL+"/users", "application/json", strings.NewReader(`{"first_name":"tucker", "last_name":"kim", "email":"yklovejesus@gmail.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)//유저의 아이디는 0이 되면 안된다. 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) }
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)) } // 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")//gorilla mux에서 지원하는 방법으로 get일때 핸들러를 제공하는 방법 mux.HandleFunc("/users", createUserHandler).Methods("POST")//이건 post가 왔을때 create..핸들러를 수행 mux.HandleFunc("/users/{id:[0-9]+}", getUserInfoHandler) return mux }
Go
복사

/main.go

package main import ( "net/http" "github.com/GloryKim/goWeb/web6/myapp" ) func main() { http.ListenAndServe(":3000", myapp.NewHandler()) }
Go
복사
실행은 주소창에 http://localhost:3000 이다.