본문 바로가기
GO Lang

GO_웹 제작(2)

by u0jin 2020. 6. 8.
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 를 사용해서 포맷팅을 사용한다.
}

/bar  에서 query 를 주기 전/후

 

  • 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 를 넣으면 에러가 나온다.

 

/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 설정

post로 설정한다.
request body 를 직접 넣어준다.

 

response 결과

response - json 방식으로 출력
response - text 방식으로 출력

 

'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

댓글