POST /device -> Device 아이템 추가 (포스팅 완료) / curl -X POST -H "Content-Type: application/json" -d '{"name":"iPhone19","mac":"ff:11:11:22:33:11"}' http://localhost:8000/v1.0/device
GET /device -> Device 아이템 리스트 조회 (포스팅 완료) / curl -X GET -H "Content-Type: application/json" -d '{}' http://localhost:8000/v1.0/device
GET /device/{pk} -> Device 아이템 조회 (진행중) / curl -X GET -H "Content-Type: application/json" -d '{}' http://localhost:8000/v1.0/device/1
PUT /device/{pk} -> Device 아이템 수정
DELETE /device/{pk} -> Device 아이템 삭제
이어서 GET 1개 아이템 GET 응답을 포스팅하려 합니다.
순수하게 공부 차원에서 "net/http"만 사용해서 하려 했는데, HandleFunc에서 패턴 라우팅을 구현하기에는 지금은 난감합니다.
나중에 golang 웹프레이워크 깃헙에 들어가서 어떻게 구현했는지 공부좀해야겠습니다.
결국 많이 쓰이는 것 몇 중에 mux로 구현하겠습니다.
처음부터 프레임워크로 시작했어야 하는데 공부 차원에서 "net/http" 시작했다가 소스가 지저분해지는데 마지막에 mux로 리팩토링해야겠습니다.
역시 코드를 짜면 짤수록 django의 위대함을 느낍니다. 개인적으로 웹 프레임워크는 인터프린터 언어가 유연한 거 같습니다.
호출한 결과입니다. MAC출력도 해야하는데 늦은 시간이라 다음번에 수정 하겠습니다.

package main
import (
"database/sql"
"encoding/json"
"fmt"
"net/http"
"strings"
_ "github.com/go-sql-driver/mysql"
"github.com/gorilla/mux"
)
type Device struct {
Id int `json:"id"`
Name string `json:"name"`
Mac string `json:"mac"`
}
const (
httpPort = ":8000"
driverName = "mysql"
dataSourceName = "TheGolangOfFuture:TheGolangOfFuture@tcp(127.0.0.1:3306)/TheGolangOfFuture"
)
func device(res http.ResponseWriter, req *http.Request) {
db, err := sql.Open(driverName, dataSourceName)
if err != nil {
fmt.Printf(err.Error())
res.WriteHeader(http.StatusInternalServerError)
return
}
defer db.Close()
if req.Method == http.MethodPost {
var device Device
err := json.NewDecoder(req.Body).Decode(&device)
if err != nil {
res.WriteHeader(http.StatusBadRequest)
return
}
fmt.Printf("[POST] Name=%s,Mac=%s\n", device.Name, device.Mac) // DB insert
tmpMac := strings.Replace(device.Mac, ":", "", -1) // 맥은 ":", "-", "." 등 여러가지가 올 수 있지만 예제에서는 ":"만 처리 하겠습니다.
query := fmt.Sprintf("INSERT INTO Device (name, mac, mac_bin) VALUES('%s', '%s', unhex('%s'))", device.Name, device.Mac, tmpMac) // 이코드는 사실상 너무나 취약합니다.
insert, err := db.Query(query)
if err != nil {
fmt.Println(err.Error())
res.WriteHeader(http.StatusInternalServerError)
return
}
defer insert.Close()
res.Header().Set("Content-Type", "application/json")
res.WriteHeader(http.StatusOK)
json.NewEncoder(res).Encode(map[string]interface{}{
"success": true,
"messages": fmt.Sprintf("Post success : %s", device.Mac),
})
} else if req.Method == http.MethodGet {
vars := mux.Vars(req)
if id, ok := vars["id"]; ok == true {
rs, err := db.Query(fmt.Sprintf("SELECT id, name FROM Device where id = %s", id))
if err != nil {
fmt.Println(err.Error())
res.WriteHeader(http.StatusInternalServerError)
return
}
defer rs.Close()
for rs.Next() {
var d Device
err := rs.Scan(&d.Id, &d.Name)
if err != nil {
fmt.Println(err.Error())
res.WriteHeader(http.StatusInternalServerError)
return
}
json.NewEncoder(res).Encode(map[string]interface{}{
"success": true,
"data": d,
})
}
} else {
rs, err := db.Query("SELECT id, name FROM Device")
if err != nil {
fmt.Println(err.Error())
res.WriteHeader(http.StatusInternalServerError)
return
}
defer rs.Close()
var result []Device
for rs.Next() {
var d Device
err := rs.Scan(&d.Id, &d.Name)
if err != nil {
fmt.Println(err.Error())
res.WriteHeader(http.StatusInternalServerError)
return
}
result = append(result, d)
}
json.NewEncoder(res).Encode(map[string]interface{}{
"success": true,
"data": result,
})
}
res.Header().Set("Content-Type", "application/json")
res.WriteHeader(http.StatusOK)
} else {
res.WriteHeader(http.StatusMethodNotAllowed) // 나머지 메소드는 허용안함
}
}
func main() {
fmt.Println("Start WEB", httpPort)
m := mux.NewRouter()
m.HandleFunc("/v1.0/device/{id:[0-9]+}", device).Methods("GET")
http.HandleFunc("/v1.0/device", device)
http.Handle("/", m)
http.ListenAndServe(httpPort, nil)
}
'Go언어 golang' 카테고리의 다른 글
golang JSON 설정 파일 로더 / JSON 주석 처리 (0) | 2023.03.23 |
---|---|
golang REST API / go언어 REST API 서버 #6 PUT & DELETE (0) | 2023.03.22 |
golang REST API / go언어 REST API 서버. #2 docker mariadb 설치 및 접속 확인 (0) | 2023.03.16 |
golang Syslog server / Go언어 Syslog collector - 파싱 추가 RFC5424 (0) | 2023.03.12 |
golang Syslog server / Go언어 Syslog collector #2 파싱 (0) | 2023.03.11 |