package main import ( "encoding/json" "fmt" "io/ioutil" "log" "net/http" "runtime" "strconv" "time" "main/models" "github.com/gorilla/mux" ) func CreateObject(w http.ResponseWriter, r *http.Request) { defer LogComponent(time.Now().UnixNano(), r) // 最后打印日志 // 從body中獲取收到的JSON數據 body, err := ioutil.ReadAll(r.Body) if err != nil { log.Println(err) return } defer r.Body.Close() // 將JSON數據轉換成目標對象 object := models.GetObject(mux.Vars(r)["name"], 0) if err = json.Unmarshal(body, object); err != nil { log.Println(err) return } // 將對象存入數據庫 err = object.Create() if err != nil { log.Println(err) return } // 返回結果 w.Header().Set("Content-Type", "application/json; charset=utf-8") w.Write(object.ToJSON()) } func GetObjetc(w http.ResponseWriter, r *http.Request) { defer LogComponent(time.Now().UnixNano(), r) // 最后打印日志 // 獲取對象 object := models.GetObject(mux.Vars(r)["name"], ParamInt(mux.Vars(r)["id"], 0)) err := object.Get() if err != nil { log.Println(err) return } // 返回結果 w.Header().Set("Content-Type", "application/json; charset=utf-8") w.Write(object.ToJSON()) } func UpdateObject(w http.ResponseWriter, r *http.Request) { defer LogComponent(time.Now().UnixNano(), r) // 最后打印日志 // 從body中獲取收到的JSON數據 body, err := ioutil.ReadAll(r.Body) if err != nil { log.Println(err) return } defer r.Body.Close() // 將JSON數據轉換成目標對象 object := models.GetObject(mux.Vars(r)["name"], ParamInt(mux.Vars(r)["id"], 0)) if err = json.Unmarshal(body, object); err != nil { log.Println(err) return } // 更新對象 err = object.Update() if err != nil { log.Println(err) return } // 返回結果 w.Header().Set("Content-Type", "application/json; charset=utf-8") w.Write(object.ToJSON()) } func DeleteObject(w http.ResponseWriter, r *http.Request) { defer LogComponent(time.Now().UnixNano(), r) // 最后打印日志 // 刪除對象 object := models.GetObject(mux.Vars(r)["name"], ParamInt(mux.Vars(r)["id"], 0)) err := object.Delete() if err != nil { log.Println(err) return } // 返回結果 w.Header().Set("Content-Type", "application/json; charset=utf-8") w.Write(object.ToJSON()) } func GetObjects(w http.ResponseWriter, r *http.Request) { defer LogComponent(time.Now().UnixNano(), r) // 最后打印日志 var listview models.ListView // 獲取查詢參數: page, pageSize name := mux.Vars(r)["name"] page := ParamInt(r.URL.Query().Get("page"), 1) pagesize := ParamInt(r.URL.Query().Get("pageSize"), 10) // 獲取對象列表 listview.Read(name, page, pagesize) // 返回結果 w.Header().Set("Content-Type", "application/json; charset=utf-8") w.Write(listview.ToJSON()) } func main() { runtime.GOMAXPROCS(runtime.NumCPU()) r := mux.NewRouter() r.HandleFunc("/api/{name}", GetObjects).Methods("GET") r.HandleFunc("/api/{name}", CreateObject).Methods("POST") r.HandleFunc("/api/{name}/{id}", GetObjetc).Methods("GET") r.HandleFunc("/api/{name}/{id}", UpdateObject).Methods("PATCH") r.HandleFunc("/api/{name}/{id}", DeleteObject).Methods("DELETE") log.Println("Web Server is running on http://localhost:8080") http.ListenAndServe(":8080", r) } func LogComponent(startTime int64, r *http.Request) { ms := (time.Now().UnixNano() - startTime) / 1000000 color := "\033[1;32m%d\033[0m" if ms > 800 { color = "\033[1;31m%dms\033[0m" // 紅色加重 } else if ms > 500 { color = "\033[1;33m%dms\033[0m" // 黃色加重 } else if ms > 300 { color = "\033[1;32m%dms\033[0m" // 綠色加重 } else if ms > 200 { color = "\033[1;34m%dms\033[0m" // 藍色加重 } else if ms > 100 { color = "\033[1;35m%dms\033[0m" // 紫色加重 } else { color = "\033[1;36m%dms\033[0m" // 黑色加重 } endTime := fmt.Sprintf(color, ms) method := fmt.Sprintf("\033[1;32m%s\033[0m", r.Method) // 綠色加重 url := fmt.Sprintf("\033[1;34m%s\033[0m", r.URL) // 藍色加重 log.Println(method, url, endTime) } // 獲取查詢參數(int 類型) func ParamInt(value string, defaultValue int64) int64 { if value == "" { return defaultValue } result, err := strconv.ParseInt(value, 10, 64) if err != nil { return defaultValue } return result } // 獲取查詢參數(string 類型) func ParamString(value string, defaultValue string) string { if value == "" { return defaultValue } return value } // 獲取查詢參數(bool 類型) func ParamBool(value string, defaultValue bool) bool { if value == "" { return defaultValue } result, err := strconv.ParseBool(value) if err != nil { return defaultValue } return result }