我正在Golang中构建一个服务器,该服务器从本地json文件返回数据。我已经构建了相关的结构,可以使服务器从json文件返回所有信息,但是如果我只希望它返回某些条目怎么办?
有没有一种查询数据的方法。我希望用户能够为该ID的相应条目返回一个参数,以返回url,ID和相关的json。
查看代码以获取更多信息:
func main() {
//Initialises basic router and endpoints
r := mux.NewRouter()
r.HandleFunc("/", getAll).Methods("GET")
r.HandleFunc("/games/{id:[0-9]+}", getGame).Methods("GET")
r.HandleFunc("/games/report/{id}", getReport).Methods("GET")
fmt.Println("Listening on port 8080")
http.ListenAndServe(":8080", r)
}
用于从Json文件检索所有数据的当前代码。
func getAll(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
// Open jsonFile and handle the error
jsonFile, err := os.Open("./data/games.json")
if err != nil {
fmt.Println(err)
}
fmt.Println("Successfully Opened games.json")
// defer the closing of our jsonFile so that we can parse it later on
defer jsonFile.Close()
// read the opened file as a byte array.
byteValue, _ := ioutil.ReadAll(jsonFile)
// initialize our Games array
var games models.Games
// unmarshal our byteArray which contains our
// jsonFile's content into 'games' which we defined above
json.Unmarshal(byteValue, &games)
json.NewEncoder(w).Encode(games)
}
相关结构:
type Games struct {
Games []Game `json:"games"`
}
type Comment struct {
User string `json:"user"`
Message string `json:"message"`
DateCreated string `json:"dateCreated"`
Like int `json:"like"`
}
type Game struct {
ID int `json:"id"`
Title string `json:"title"`
Description string `json:"description"`
By string `json:"by"`
Platform string `json:"platform"`
AgeRating string `json:"age_rating"`
Likes int `json:"likes"`
Comment Comment `json:"comments"`
}
正如您应该从路由器上看到的那样,我希望用户传递{id}参数,然后将其插入查询中。我问的可能吗?
答案 0 :(得分:1)
按照Parham Alvani的建议,将您的游戏加载到地图中,但是具有指针值,如下所示:
gameMap := make(map[string]*Game)
for _, game := range games{
gameMap[game.ID] = &game
}
在GET / game-route中,您可以将游戏的ID传递给地图,并以您喜欢的任何方式返回其结果,如果不存在,则指针值为nil,您可以返回404 :
game := gameMap[id]
if game == nil{ // return 404}