Go 언어 gorilla/mux 사용하여 rest api 만들어보기
오늘은 Go 언어 gorilla/mux를 이용하여 rest api를 만드는 실습해보려 합니다.
우선 rest api를 만드려면 get, post, put, delete를 구현해야 합니다.
이번 실습에서는 여러 데이터들 중에 개별적으로 JSON으로 출력하는 get만 구현해보도록 하겠습니다.
사전 설정
$ go get github.com/gorilla/mux
라우터를 생성하기 위해 고언어의 외부 라이브러리인 gorilla/mux를 사용합니다.
패키지 가져오기
package main
import (
"net/http"
"github.com/gorilla/mux"
"encoding/json"
"log"
)
main 파일에 import를 하여 웹서버를 만들 준비를 합니다.
메인 함수 준비
func main() {
router := mux.NewRouter()
http.ListenAndServe(":8080", router)
}
라우터를 만들어주고, 해당 라우터를 가지고 자신의 아이피+8080 포트에 서버를 구동합니다.
func httpHandler(handler http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
log.Print(r.RemoteAddr," ", r.Proto, " ", r.Method, " ", r.URL)
handler.ServeHTTP(w, r)
})
}
서버를 구동하고 log를 출력하거나, 기타 작업을 수행하기 위해 핸들러를 만들어서 반환할 수 있습니다.
http.ListenAndServe(":8080", httpHandler(router))
그리고나서 메인 함수에서 라우터를 위에서 구현한 함수에 넣어주면 됩니다.
라우터 함수 등록
func main() {
router := mux.NewRouter()
router.HandleFunc("/test/{code}", GetData).Methods("GET")
http.ListenAndServe(":8080", router)
}
GetData라는 함수를 GET 기능을 하는 /test/{code} 라우터에 등록합니다.
이 함수를 잘 구현하기만 하면, 자신의 아이피+8080포트+/test+{번호}로 접속하여 해당 번호의 데이터를 json으로 반환할 수 있습니다.
구조체 구현
type data struct{
code string
Title string
Description string
}
var testData []data
접속하는 코드에 따라 보여주는 내용이 달라야하므로 데이터를 구별하는 code를 넣어주고, 데이터를 구분하기 위해 간단히 제목과 설명으로 나누어놨습니다.
데이터 삽입
testData = append(testData, data{code: "1", Title: "fist title", Description: "desc"}})
testData = append(testData, data{code: "2", Title: "second title", Description: "desc"}})
데이터를 append하여 추가해줍니다.
향후에는 이를 csv파일에서 가져오거나, 웹 서버에서 가져오게 할 수 있습니다.
함수 구현
func GetData(w http.ResponseWriter, r *http.Request) {}
우리는 위 함수를 구현해주어야 합니다.
func GetData(w http.ResponseWriter, r *http.Request) {
p := mux.Vars(r)
for _, i := range testData {
if i.code == p["code"] {
json.NewEncoder(w).Encode(i)
return
}
}
json.NewEncoder(w).Encode(&event{})
}
for range로 해당 코드를 가진 부분만 인코드해주고 반환합니다.
기타
삽입은 json을 디코드해주고 슬라이스에서 append로 추가해주면 됩니다.
삭제는 get과 마찬가지로 순회하고 삭제할 이전과 이후의 위치를 슬라이싱해주면 됩니다.