Golang(12)Web Service - JSON Mapping Improvement
Golang(12)Web Service - JSON Mapping Improvement
Take the marshal and unmarshal codes out of every method.
package main
import (
"encoding/json"
"fmt"
"github.com/gorilla/mux"
"io/ioutil"
"net/http"
)
type Bug struct {
Id string
BugNumber string
BugName string
BugDesn string
}
type JSONResult map[string]interface{}
func (r JSONResult) String() (s string) {
b, err := json.Marshal(r)
if err != nil {
s = "json err: " + err.Error()
return
}
s = string(b)
return
}
func ParseJSON(r *http.Request) Bug {
var b Bug
c, _ := ioutil.ReadAll(r.Body)
fmt.Println("ParseJSON called with Body=" + string(c))
json.Unmarshal(c, &b)
return b
}
func getBug(w http.ResponseWriter, r *http.Request) {
b1 := Bug{Id: "1", BugNumber: "bug1", BugName: "bug1", BugDesn: "desn1"}
w.Header().Set("Content-Type", "application/json")
fmt.Fprint(w, JSONResult{"status": "ok", "bugs": []Bug{b1}})
}
func updateBug(w http.ResponseWriter, r *http.Request) {
b := ParseJSON(r)
fmt.Println("updateBug called with id=" + b.Id)
fmt.Println("updateBug called with BugNumber=" + b.BugNumber)
fmt.Println("updateBug called with Bugname=" + b.BugName)
fmt.Println("updateBug called with BugDesn=" + b.BugDesn)
w.Header().Set("Content-Type", "application/json")
fmt.Fprint(w, JSONResult{"status": "ok", "bugs": []Bug{b}})
}
func deleteBug(w http.ResponseWriter, r *http.Request) {
id := mux.Vars(r)["Id"]
fmt.Println("deleteBug called with Id = ", id)
w.Header().Set("Content-Type", "application/json")
fmt.Fprint(w, JSONResult{"status": "ok"})
}
func addBug(w http.ResponseWriter, r *http.Request) {
b := ParseJSON(r)
fmt.Println("addBug called with BugNumber=" + b.BugNumber)
fmt.Println("addBug called with Bugname=" + b.BugName)
fmt.Println("addBug called with BugDesn=" + b.BugDesn)
w.Header().Set("Content-Type", "application/json")
fmt.Fprint(w, JSONResult{"status": "ok", "bugs": []Bug{b}})
}
func listBug(w http.ResponseWriter, r *http.Request) {
b1 := Bug{Id: "1", BugNumber: "bug1", BugName: "bug1", BugDesn: "desn1"}
b2 := Bug{Id: "2", BugNumber: "bug2", BugName: "bug2", BugDesn: "desn2"}
w.Header().Set("Content-Type", "application/json")
fmt.Fprint(w, JSONResult{"status": "ok", "bugs": []Bug{b1, b2}})
}
func main() {
router := mux.NewRouter()
router.HandleFunc("/bugs", listBug).Methods("GET")
router.HandleFunc("/bugs", addBug).Methods("POST")
router.HandleFunc("/bugs/{Id}", getBug).Methods("GET")
router.HandleFunc("/bugs/{Id}", updateBug).Methods("PUT")
router.HandleFunc("/bugs/{Id}", deleteBug).Methods("DELETE")
http.Handle("/", router)
http.ListenAndServe(":8088", nil)
}
Maybe, it will be helpful if one day I design and implement a web framework myself. Actually, it will be light and clean, only need routers, dispatcher and JSON render and parse built-in the framework.
References:
http://nesv.blogspot.com/2012/09/super-easy-json-http-responses-in-go.html
http://www.alexedwards.net/blog/golang-response-snippets#json
http://sillycat.iteye.com/blog/2056435
http://golangtutorials.blogspot.com/2011/06/methods-on-structs.html
http://stackoverflow.com/questions/18678135/go-static-method-design