当前位置:网站首页>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!")
}
边栏推荐
- 科技云报道:实现元宇宙,英伟达从打造基础建设平台开始
- JSP页面中page指令contentPage/pageEncoding具有什么功能呢?
- 为什么都推荐使用wordpress, 而不是 phpcms 这些国内的CMS呢?
- [OC学习笔记]ARC与引用计数
- Technology Cloud Report: To realize the metaverse, NVIDIA starts from building an infrastructure platform
- 工程师如何对待开源 --- 一个老工程师的肺腑之言
- IO进程线程->进程->day4
- 解决IDEA安装安装插件慢问题
- MySQL ODBC驱动简介
- Postman download localization of installation and use
猜你喜欢
PyQt5 (a) PyQt5 installation and configuration, read from the folder and display images, simulation to generate the sketch image
postman使用方法
【C】关于柔性数组.简要的谈谈柔性数组
RestTemlate源码分析及工具类设计
文章解读 -- FlowNet3D:Learning Scene Flow in 3D Point Clouds
HCIP笔记十六天
按键控制流水灯(计时器)
【电子电路】长按键拉低电平,适用在有休眠机制的MCU但是没有看门狗,一个按键多个功能场景下使用
MySQL 中 count() 和 count(1) 有什么区别?哪个性能最好?
二分类和多分类
随机推荐
轴流式水轮机隐私政策
EPSANet: An Efficient Pyramid Split Attention Block on Convolutional Neural Network
IO进程线程->进程->day4
IO process thread -> process -> day4
Redisson的看门狗机制
pnpm:简介
pnpm: Introduction
QT web development - Notes - 3
C语言_条件编译
JSP页面中page指令有哪些属性及方法可使用呢?
Redisson实现分布式锁
小说里的编程 【连载之二十四】元宇宙里月亮弯弯
In a recent build figure SLAM, and locate the progress
软件测试技术之解析图灵测试离我们还有多远
MySQL读写分离与主从延迟
那些年我们踩过的 Flink 坑系列
postman下载安装汉化及使用
PyCharm usage tutorial (more detailed, picture + text)
RestTemlate源码分析及工具类设计
自定义table表格