package main
import(
"encoding/json"
"fmt"
"net/http"
"time"
)
type User struct {
FirstName string `json:"first_name"`
LastName string `json:"last_name"`
Email string `json:"email"`
CreatedAt time.Time `json:"created_at"`
}
type fooHandler struct{}
func (f *fooHandler) ServeHTTP(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, "Bad Request: " ,err)
return
}
user.CreatedAt = time.Now()
data, _ := json.Marshal(user)
w.Header().Add("content-type","application/json")
w.WriteHeader(http.StatusOK)
fmt.Fprint(w, string(data))
}
func barHandler(w http.ResponseWriter , r *http.Request){
name := r.URL.Query().Get("name")
if name == ""{
name = "World"
}
fmt.Fprintf(w,"Hello %s",name)
}
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/", func (w http.ResponseWriter , r *http.Request){
fmt.Fprint(w, "Hello Ujin")
})
mux.HandleFunc("/bar", barHandler)
mux.Handle("/foo", &fooHandler{})
http.ListenAndServe(":3000",mux)
}
목표 :
request 에서 input 값을 넣어보고 response 내용을 확인해보자.
코드를 따라가면서 하나씩 살펴보도록 한다.
(코드는 순차적으로 내려가지 않고, 함수별로 하나씩 살펴본다.)
- func barHandler
func barHandler(w http.ResponseWriter , r *http.Request){
name := r.URL.Query().Get("name")
/*
request 에서 input 값을 넣는다.
url 에서 정보를 가져올것이다.
name 이라는 argment 를 가져올것이다.
*/
if name == ""{
// 만약 name 이없다면
name = "World"
// name 은 World 이다
}
fmt.Fprintf(w,"Hello %s",name)
// 출력할때 Fprintf 를 사용해서 포맷팅을 사용한다.
}
- func main
func main() {
mux := http.NewServeMux()
/*
mux 라는 인스턴스를 만들어낸다.
해당 인스턴스를 넘겨주는 방식으로 한다.( http 에서 mux 로 변경함 )
*/
mux.HandleFunc("/", func (w http.ResponseWriter , r *http.Request){
fmt.Fprint(w, "Hello Ujin")
})
mux.HandleFunc("/bar", barHandler)
mux.Handle("/foo", &fooHandler{})
// 경로의 차이만 있다.
http.ListenAndServe(":3000",mux)
}
- func ServeHTTP
func (f *fooHandler) ServeHTTP(w http.ResponseWriter,r *http.Request){
user := new(User)
err := json.NewDecoder(r.Body).Decode(user)
/*
json형태의 데이터는 request 바디에 들어있다.
r.Body 는 io.Reader 인터페이스를 포함한다.
new recoder는 인자로 io.Reader 를 받는다.
user형태의 json이 아닌경우 에러가 난다.
*/
if err != nil {
w.WriteHeader(http.StatusBadRequest)
// response w에 헤더로 잘못보낸것을 알려준다.
fmt.Fprint(w, "Bad Request: " ,err)
// w에 err를 써준다.
return
// 더이상 내려가지 않도록 return 한다.
}
user.CreatedAt = time.Now()
// 현재시간으로 변경해주기위함
// user data가 바뀌기 때문에 바뀐 데이터를 다시 json으로 받음
data, _ := json.Marshal(user)
// 인터페이스를 받아서 json형태로 인코딩한다.
w.Header().Add("content-type","application/json")
// 헤더에 형식을 표시해주면 보기편하게 결과를 볼수있다.
// 이 컨텐츠는 json타입이다 라고 알려주는것임
w.WriteHeader(http.StatusOK)
fmt.Fprint(w, string(data))
// 바이트로 받은 데이터를 string으로 변환해서 써준다.
}
http://localhost:3000/foo 를 넣으면 에러가 나온다.
URL 에서 쿼리로 하는게 아니라, 직접 바디에 넣어 줘야한다.
(* 구글에 chrome http client app 를 검색후 사용하는것을 추천.)
* type User struct
ype User struct {
/*
대소문자를 다르게 인식하기때문에 맞춰주어야한다.
단, go 언어에서 밑줄을 사용하는것을 지양하기때문에,
한 행에 어너테이션을 써서 json에서 어떻게 사용되는지 알려주는 방식을 사용한다.
( 설명을 달아주는거랑 같은의미이다 )
*/
// 표시해주면 json 에서 디코드하고 먀사링 할때 , 컬럼이름에 맞춰서 해줌
FirstName string `json:"first_name"`
LastName string `json:"last_name"`
Email string `json:"email"`
CreatedAt time.Time `json:"created_at"`
}
requset 설정
response 결과
'GO Lang' 카테고리의 다른 글
GO_웹 제작(4) (0) | 2020.06.23 |
---|---|
GO_웹 제작(3) (0) | 2020.06.17 |
GO_웹 제작(Test 환경 구축) (0) | 2020.06.13 |
GO_웹 제작(1) (2) | 2020.06.07 |
GO_ 기본 구조 (0) | 2020.06.06 |
댓글