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 barpackage 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
Reference
この問題について(Go web 1. Web Handler, JSON), 我々は、より多くの情報をここで見つけました https://velog.io/@jinzza456/Go-web-1.-Web-Handler-JSONテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol