Go web 1. Web Handler, JSON
HTML(Hyper Text Markup Language)
Hyper Text란 하이퍼링크를 가지고있는 텍스트이다.
HTTP(Hyper Text Transfer Protocol)
특정 웹브라우저의 IP를 DNS(Domain Name System) 서버에서 받아서 IP에 해당하는 서버에 요청을 하는데 이 때 요청(request)을 하고 받는(response) 방식이 정의 된것을 HTTP라고 한다.
Server Rendering
과거에는 서버가 리퀘스트를 받으면 html 문서를 만들어서 리스폰스 해주는 방식 이었다.
Client Rendering
현재에는 서버가 리퀘스트 받으면 html의 틀을 리스폰스 한다. 리스폰스 받은 html 틀을 클라이언트가 동적으로 채워나가는 방식이다.
ex) hello world
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
// 핸들러 함수: 해당 경로에 리퀘스트가 들어왔을 때 무슨 일을 할 것인지
// "/" 초기경로, 절대경로, 첫번째 페이지
// w = 리스폰스를 쓴다
// r = 사용자가 요청한 리퀘스트 정보를 가지고있다
fmt.Fprint(w, "Hello World")
// w ResponseWriter 에 해당하는 곳에 해당 문자열을 출력(리스폰스)한다.
})
http.ListenAndServe(":3000", nil)
// 3000번 포트에서 리스폰스를 기다린다
}
-----------------------
http://localhost:3000/
Hello World
ex) hello bar
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
// 핸들러 함수: 해당 경로에 리퀘스트가 들어왔을 때 무슨 일을 할 것인지
// "/" 초기경로, 절대경로, 첫번째 페이지
// w = 리스폰스를 쓴다
// r = 사용자가 요청한 리퀘스트 정보를 가지고있다
fmt.Fprint(w, "Hello World")
// w ResponseWriter 에 해당하는 곳에 해당 문자열을 출력(리스폰스)한다.
})
http.HandleFunc("/bar", func(w http.ResponseWriter, r *http.Request) {
// "/bar" 경로 설정
fmt.Fprint(w, "Hello Bar!")
})
http.ListenAndServe(":3000", nil)
// 3000번 포트에서 리스폰스를 기다린다
}
---------------------------------
http://localhost:3000/bar
Hello Bar!
ex) 라우터
package main
import (
"fmt"
"net/http"
)
type fooHandler struct{}
// 오브젝트를 만든다. 아래의 매소드 인터페이스를 구현
func (f *fooHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Hello Foo!")
} // 인터페이스 구현
func barHandler(w http.ResponseWriter, r *http.Request) {
// "/bar" 경로 설정
fmt.Fprint(w, "Hello Bar!")
}
func main() {
mux := http.NewServeMux()
// 라우터 클래스 만들기 인스턴스
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
// 핸들러 함수: 해당 경로에 리퀘스트가 들어왔을 때 무슨 일을 할 것인지
// "/" 초기경로, 절대경로, 첫번째 페이지
// w = 리스폰스를 쓴다
// r = 사용자가 요청한 리퀘스트 정보를 가지고있다
fmt.Fprint(w, "Hello World")
// w ResponseWriter 에 해당하는 곳에 해당 문자열을 출력(리스폰스)한다.
})
mux.HandleFunc("/bar", barHandler)
mux.Handle("/foo", &fooHandler{})
http.ListenAndServe(":3000", mux)
// 3000번 포트에서 리스폰스를 기다린다
// 라우터 등록
}
ex) request input
<생략>
func barHandler(w http.ResponseWriter, r *http.Request) {
// 서버 요청할때 Request에 input값을 넣는다.
name := r.URL.Query().Get("name")
//url에서 name 이라는 정보를 뽑아낸다.
if name == "" {
name = "World"
}
fmt.Fprintf(w, "Hello Bar! %s", name)
}
<생략>
-----------------------------------------
http://localhost:3000/bar?name=jin
Hello Bar! jin
request를 날릴때 input정보를 날린다.
URL?name = 아큐먼트
body에다가 직접 넣어도 된다.
이렇게 request를 날리면 reponse가 돌아온다.
request를 날릴때 string 형식을 많이 쓰고, string 형식의 포맷 중 JSON이 최근에 많이 쓰인다.
JSON(Java Script Object Notation)
자바 스크립트에서 오브젝트를 표기하는 방식
원래는 자바 스크립트에서 사용하는 방식 이었는데 심플한 형태라서 요즘 많이 쓰인다.
Key : Value 형태로 되어있음
ex)
<생략>
//json데이터를 담을 구조체를 만든다.
type User struct {
FirstName string
LastName string
Email string
CreatedAt time.Time
}
type fooHandler struct{}
// 인스턴스를 만들고
func (f *fooHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
// request로 json 형태의 데이터가 넘어온다.
user := new(User)
err := json.NewDecoder(r.Body).Decode(user)
//json형태의 함수 newdecoder의 인자로 body를 받는다.
//body의 데이터를 읽어서 디코드함
//그형태가 user 구조체
if err != nil {
w.WriteHeader(http.StatusBadRequest)
// 에러가 났을경우 badrequest
fmt.Fprint(w, "Bad Request: ", err)
// 무슨 err인지 알려줌
return
}
user.CreatedAt = time.Now()
//user의 time 값을 현재시간으로 변경
data, _ := json.Marshal(user)
// 변경된 데이터를 json형태로 다시 변경
// Marshal() = 해당 데이터를 jason형태로 인코딩
// 첫번째 리턴값 = 바이트어레이
// 두번째 리턴값 = err
<생략>
-----------------------------------------
http://localhost:3000/foo
Bad Request: EOF
//데이터 없음
바디에 데이터를 넣어주기위에 데이터를 만들어 주는 앱을 설치한다.
chrome http client app
json형태로 데이터 입력
json형식에 맞추기 위해 설명을 붙여줌
send
Author And Source
이 문제에 관하여(Go web 1. Web Handler, JSON), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jinzza456/Go-web-1.-Web-Handler-JSON저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)