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

좋은 웹페이지 즐겨찾기