본문 바로가기

GO lang/web

[GO] Web - Text, json, URL 쿼리 방식

간단한 golang 으로 만든 웹페이지 입니다.

프로젝트 폴더위치 및 패키지 위치에 따른 오류는 본인의 환경에 맞게 수정이 필요함.

 

./main.go

 

package main

import (
	"GO/tuckersGo/goWeb/web04/myapp" // 개인 패키지 위치이므로 본인에 맞게 수정할것
	"net/http"
)

const portNumber = ":3000"

func main() {

	mux := myapp.NewHttpHandler()
	http.ListenAndServe(portNumber, mux)
}

 

./myapp/app.go

 

package myapp

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"`
}

func indexHandler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprint(w, "Hello World")
}

type fooHandler struct{}

func (f *fooHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	user := new(User)
	// request 에서 값을 가져와서 디코딩후 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)
	// content type 을 json 으로 보내면 클라이언트에서 보기 좋게 표시됨
	w.Header().Add("content-type", "application/json")
	w.WriteHeader(http.StatusCreated)
	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 name: %s!", name)
}

func NewHttpHandler() http.Handler {
	// 인스턴스를 만들고 해당 인스턴스에 등록해서 사용하는 예제 코드.
	mux := http.NewServeMux()
	mux.HandleFunc("/", indexHandler)
	mux.HandleFunc("/bar", barHandler)
	mux.Handle("/foo", &fooHandler{})

	return mux
}

 

http://localhost:3000/ 접속시 indexHandler 호출 > 화면에 Hello World 출력함.

 

 

http://localhost:3000/bar 접속시 barHandler 호출 > URL 쿼리가 없으면 기본설정인 Hello name: World! 출력.

 

URL 쿼리가 없는 경우

 

> URL 쿼리가 있으면 해당 정보를 출력

 

URL 쿼리가 있는 경우, name=Seoul

 

http://localhost:3000/foo 접속시 fooHandler 호출 > json 데이터 출력함.

테스트를 위해서 크롬 확장판 설치필요함 > Advanced REST client 설치 필요함.

 

 

 

 

'GO lang > web' 카테고리의 다른 글

[GO] Todo list - interface 구현1  (0) 2021.11.18
[GO] Todo list - refactoring(구조변경)  (0) 2021.11.17
[GO] Todo list - map 자료구조  (0) 2021.11.17
[GO] Web - Restful API, TDD  (0) 2021.11.04
[GO] Web - 테스트 코드 작성방법(TDD)  (0) 2021.11.04