当前位置:网站首页>Gorilla Mux 和 GORM 的使用方法
Gorilla Mux 和 GORM 的使用方法
2022-08-02 08:17:00 【nginx】
package mainimport (
"encoding/json"
"net/http"
"mybook/model"
"github.com/gorilla/mux"
"gorm.io/gorm"
)
type Server struct {
db *gorm.DB
}
type UpdateBook struct {
Price float64 `json:"price"`
Description string `json:"decription"`
Category string `json:"category"`
}
func NewServer(db *gorm.DB) *Server {
return &Server{db: db}
}
func (s *Server) RegisterRouter(router *mux.Router) {
router.HandleFunc("/books", s.getBooks)
router.HandleFunc("/book/{id}", s.getBook).Methods("GET")
router.HandleFunc("/book", s.createBook).Methods("POST")
router.HandleFunc("/book/{id}", s.updateBook).Methods("PUT")
router.HandleFunc("/book/{id}", s.deleteBook).Methods("DELETE")
}
func (s *Server) getBooks(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json;")
var books []model.Book
if err := s.db.Find(&books).Error; err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
w.WriteHeader(http.StatusOK)
json.NewEncoder(w).Encode(books)
}
func (s *Server) createBook(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json; charset=UTF-8")
var book model.Book
if err := json.NewDecoder(r.Body).Decode(&book); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
newBook := model.Book{Price: book.Price, Description: book.Description, Category: book.Category}
if err := s.db.Create(newBook).Error; err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
w.WriteHeader(http.StatusOK)
json.NewEncoder(w).Encode(newBook)
}
func (s *Server) getBook(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json; charset=UTF-8")
var book model.Book
vars := mux.Vars(r)
id := vars["id"]
if err := s.db.Where("id = ?", id).First(&book).Error; err != nil {
http.Error(w, err.Error(), http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
json.NewEncoder(w).Encode(book)
}
func (s *Server) updateBook(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json; charset=UTF-8")
var updateBook UpdateBook
var book model.Book
vars := mux.Vars(r)
id := vars["id"]
if err := json.NewDecoder(r.Body).Decode(&updateBook); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
if err := s.db.Where("id = ?", id).First(&book).Error; err != nil {
http.Error(w, err.Error(), http.StatusNotFound)
return
}
if err := s.db.Model(&book).Updates(&model.Book{
Price: updateBook.Price,
Description: updateBook.Description,
Category: updateBook.Category}).Error; err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
w.WriteHeader(http.StatusOK)
json.NewEncoder(w).Encode(book)
}
func (s *Server) deleteBook(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json; charset=UTF-8")
var book model.Book
vars := mux.Vars(r)
id := vars["id"]
if err := s.db.Where("id = ?", id).First(&book).Error; err != nil {
http.Error(w, err.Error(), http.StatusNotFound)
return
}
if err := s.db.Delete(&book).Error; err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
w.WriteHeader(http.StatusOK)
json.NewEncoder(w).Encode("Book Deleted Successfully!")
}
边栏推荐
猜你喜欢
Write a small game in C (three chess)
(Note)阿克西斯ACASIS DT-3608双盘位硬盘阵列盒RAID设置
普林斯顿微积分读本03第二章--编程实现函数图像绘制、三角学回顾
MySQL读写分离与主从延迟
Shell becomes canonical and variable
按键控制流水灯(计时器)
EPSANet: An Efficient Pyramid Split Attention Block on Convolutional Neural Network
(Note) AXIS ACASIS DT-3608 Dual-bay Hard Disk Array Box RAID Setting
TiFlash 存储层概览
MFC最详细入门教程[转载]
随机推荐
爬虫——爬虫初识、requests模块
小说里的编程 【连载之二十五】元宇宙里月亮弯弯
QT web development - Notes - 3
LeetCode第三题(Longest Substring Without Repeating Characters)三部曲之一:解题思路
Wang Xuegang - compiled shipment line file
MySQL 中 count() 和 count(1) 有什么区别?哪个性能最好?
shell中计算命令详解(expr、(())、 $[]、let、bc )
小说里的编程 【连载之二十二】元宇宙里月亮弯弯
postman下载安装汉化及使用
mysqldump --set-gtid-purged=OFF
自定义table表格
QT web 开发 - 笔记 - 3
R语言plotly可视化:plotly可视化回归模型实际值和回归预测值的散点图分析回归模型的预测效能、一个好的模型大部分的散点在对角线附近(predicted vs actual)
Redisson报异常attempt to unlock lock, not locked by current thread by node id解决方案
Pycharm (1) the basic use of tutorial
小说里的编程 【连载之二十四】元宇宙里月亮弯弯
next permutation
redis高阶使用之Redisson分布式锁源码解析
ip地址那点事(二)
Codeforces Round #811 (Div. 3)无DF