Go web 1. Web Handler, JSON

5327 ワード

HTML(Hyper Text Markup Language)


Hyper Textはハイパーリンクを持つテキストです.

HTTP(Hyper Text Transfer Protocol)


特定のWebブラウザのIPがDNS(ドメイン名システム)サーバから受信され、IPに対応するサーバに要求されると、要求と受信(応答)の方式が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
リクエストが発行されるとinput情報が解放されます.
URL?名言
bodyに直接入れることができます
こうやってリクエストを出すと、反応します.
requestを発行するときはstring形式が多く使われ、string形式では最近JSONがよく使われています.

JSON(Java Script Object Notation)


Javaスクリプトでオブジェクトをマークする方法
本来はjavaスクリプトで使われる方式ですが、形式が簡単なので最近よく使われています.
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