内容简介:记录一下创建
记录一下创建 RESTful API 使用 Go
开发语言和 MongoDB
后台数据库
image
安装依赖
go get github.com/globalsign/mgo // MongoDB的 Go 语言驱动 go get github.com/gorilla/mux // Go语言的http路由库
API 结构预览
app.go
package main import ( "fmt" "net/http" "github.com/gorilla/mux" ) func AllMovies(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "not implemented !") } func FindMovie(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "not implemented !") } func CreateMovie(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "not implemented !") } func UpdateMovie(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "not implemented !") } func DeleteMovie(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "not implemented !") } func main() { r := mux.NewRouter() r.HandleFunc("/movies", AllMovies).Methods("GET") r.HandleFunc("/movies/{id}", FindMovie).Methods("GET") r.HandleFunc("/movies", CreateMovie).Methods("POST") r.HandleFunc("/movies", UpdateMovie).Methods("PUT") r.HandleFunc("/movies", DeleteMovie).Methods("DELETE") http.ListenAndServe(":8080", r) }
随着后续路由的增加,需要重构一个这个文件,仿照 beego
的工程目录,我们也分别创建对应的 controllers
和 routes
,改造一下上面的代码
- 控制器
创建 controllers
文件夹和对应的文件 movies.go
movies.go
func AllMovies(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "not implemented !") } func FindMovie(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "not implemented !") } func CreateMovie(w http.ResponseWriter, t *http.Request) { fmt.Fprintln(w, "not implemented !") } func UpdateMovie(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "not implemented !") } func DeleteMovie(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "not implemented !") }
- 路由
创建一个 routes
文件夹,并创建对应的文件 routes.go
routes.go
package routes import ( "net/http" "github.com/coderminer/restful/controllers" "github.com/gorilla/mux" ) type Route struct { Method string Pattern string Handler http.HandlerFunc Middleware mux.MiddlewareFunc } var routes []Route func init() { register("GET", "/movies", controllers.AllMovies, nil) register("GET", "/movies/{id}", controllers.FindMovie, nil) register("POST", "/movies", controllers.CreateMovie, nil) register("PUT", "/movies", controllers.UpdateMovie, nil) register("DELETE", "/movies", controllers.DeleteMovie, nil) } func NewRouter() *mux.Router { r := mux.NewRouter() for _, route := range routes { r.Methods(route.Method). Path(route.Pattern). Handler(route.Handler) if route.Middleware != nil { r.Use(route.Middleware) } } return r } func register(method, pattern string, handler http.HandlerFunc, middleware mux.MiddlewareFunc) { routes = append(routes, Route{method, pattern, handler, middleware}) }
重构后的 app.go
package main import ( "net/http" "github.com/coderminer/restful/routes" ) func main() { r := routes.NewRouter() http.ListenAndServe(":8080", r) }
Models
- 创建
models
文件夹和对应的文件db.go
(数据层),封装对MongoDB
的封装
package models import ( "log" "github.com/globalsign/mgo" ) const ( host = "127.0.0.1:27017" source = "admin" user = "user" pass = "123456" ) var globalS *mgo.Session func init() { dialInfo := &mgo.DialInfo{ Addrs: []string{host}, Source: source, Username: user, Password: pass, } s, err := mgo.DialWithInfo(dialInfo) if err != nil { log.Fatalln("create session error ", err) } globalS = s } func connect(db, collection string) (*mgo.Session, *mgo.Collection) { s := globalS.Copy() c := s.DB(db).C(collection) return s, c } func Insert(db, collection string, docs ...interface{}) error { ms, c := connect(db, collection) defer ms.Close() return c.Insert(docs...) } func FindOne(db, collection string, query, selector, result interface{}) error { ms, c := connect(db, collection) defer ms.Close() return c.Find(query).Select(selector).One(result) } func FindAll(db, collection string, query, selector, result interface{}) error { ms, c := connect(db, collection) defer ms.Close() return c.Find(query).Select(selector).All(result) } func Update(db, collection string, query, update interface{}) error { ms, c := connect(db, collection) defer ms.Close() return c.Update(query, update) } func Remove(db, collection string, query interface{}) error { ms, c := connect(db, collection) defer ms.Close() return c.Remove(query) }
- 业务逻辑层
models/movies.go
package models import "github.com/globalsign/mgo/bson" type Movies struct { Id bson.ObjectId `bson:"_id" json:"id"` Name string `bson:"name" json:"name"` CoverImage string `bson:"cover_image" json:"cover_image"` Description string `bson:"description" json:"description"` } const ( db = "Movies" collection = "MovieModel" ) func (m *Movies) InsertMovie(movie Movies) error { return Insert(db, collection, movie) } func (m *Movies) FindAllMovies() ([]Movies, error) { var result []Movies err := FindAll(db, collection, nil, nil, &result) return result, err } func (m *Movies) FindMovieById(id string) (Movies, error) { var result Movies err := FindOne(db, collection, bson.M{"_id": bson.ObjectIdHex(id)}, nil, &result) return result, err } func (m *Movies) UpdateMovie(movie Movies) error { return Update(db, collection, bson.M{"_id": movie.Id}, movie) } func (m *Movies) RemoveMovie(id string) error { return Remove(db, collection, bson.M{"_id": bson.ObjectIdHex(id)}) }
控制器逻辑
- CreateMovie
func CreateMovie(w http.ResponseWriter, r *http.Request) { defer r.Body.Close() var movie models.Movies if err := json.NewDecoder(r.Body).Decode(&movie); err != nil { responseWithJson(w, http.StatusBadRequest, "Invalid request payload") return } movie.Id = bson.NewObjectId() if err := dao.InsertMovie(movie); err != nil { responseWithJson(w, http.StatusInternalServerError, err.Error()) return } responseWithJson(w, http.StatusCreated, movie) }
使用 Postman
或 curl
进行测试
- AllMovies
func AllMovies(w http.ResponseWriter, r *http.Request) { defer r.Body.Close() var movies []models.Movies movies, err := dao.FindAllMovies() if err != nil { responseWithJson(w, http.StatusInternalServerError, err.Error()) return } responseWithJson(w, http.StatusOK, movies) }
- FindMovie
func FindMovie(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) id := vars["id"] result, err := dao.FindMovieById(id) if err != nil { responseWithJson(w, http.StatusInternalServerError, err.Error()) return } responseWithJson(w, http.StatusOK, result) }
http://127.0.0.1:8080/movies/5b45ef3a9d5e3e197c15e774
- UpdateMovie
func UpdateMovie(w http.ResponseWriter, r *http.Request) { defer r.Body.Close() var params models.Movies if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { responseWithJson(w, http.StatusBadRequest, "Invalid request payload") return } if err := dao.UpdateMovie(params); err != nil { responseWithJson(w, http.StatusInternalServerError, err.Error()) return } responseWithJson(w, http.StatusOK, map[string]string{"result": "success"}) }
- DeleteMovie
func DeleteMovie(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) id := vars["id"] if err := dao.RemoveMovie(id); err != nil { responseWithJson(w, http.StatusBadRequest, "Invalid request payload") return } responseWithJson(w, http.StatusOK, map[string]string{"result": "success"}) }
以上所述就是小编给大家介绍的《使用Golang和MongoDB构建 RESTful API》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 在 Android Studio 里使用构建分析器提升构建性能
- 使用 Docker 构建
- 使用 webpack 构建应用
- 使用Dockerfile构建镜像
- 使用模式构建:总结
- 使用 AutoAI 自动构建模型
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
白帽子讲Web安全
吴翰清 / 电子工业出版社 / 2012-3 / 69.00元
《白帽子讲Web安全》内容简介:在互联网时代,数据安全与个人隐私受到了前所未有的挑战,各种新奇的攻击技术层出不穷。如何才能更好地保护我们的数据?《白帽子讲Web安全》将带你走进Web安全的世界,让你了解Web安全的方方面面。黑客不再变得神秘,攻击技术原来我也可以会,小网站主自己也能找到正确的安全道路。大公司是怎么做安全的,为什么要选择这样的方案呢?你能在《白帽子讲Web安全》中找到答案。详细的剖析......一起来看看 《白帽子讲Web安全》 这本书的介绍吧!